数か月前に コンピュータシステムの理論と実装 という本が発売された.

https://amzn.to/31hNt49

そして、この本の発売とちょうど同じタイミングに coursera で From NAND to Tetris の講義が始まった.

あまりにグッドタイミングなめぐり合わせに喜びつつ、講座を受けてみました.

FROM NAND TO TETRIS の紹介

有名なコンピュータ講義とその教材

これは、海外では有名なコンピュータ講義である

TED にも登場して講座の紹介をしているよう.

特徴

講座の特徴は、NAND というもっとも基本的な論理素子から、 毎週自分の手でコンピュータに必要な部品を作成していくところ. 難しく聞こえるかもしれないけれども、 そこはよく講座ができているので、なんとかなる.

実際の VHDL や C 言語などをつかうのではなくて、 学習用に開発された Hack 言語というものを利用する. この Hack 言語というものが、実際のコンピュータのエッセンスを残しつつ、 余分な仕様をはぎおとしてシンプルにしているため、 学習者は最低限の努力と知識で部品をつくることができる.

また、各週ごとに部品が完成しなくても、次の週に進むと、 あらかじめ用意された、前回までのツールが利用できるので、 途中で挫折することはない. 毎週、あらたな気分で挑戦できる.

著者直々の講義

Noam 先生と Shimon 先生直々に動画で説明をしてくれる. ここに、coursera とともに学習を進めることのうれしさがある.

自分は、動画を一通り見た後に、参考程度にコンピュータシステムの理論と 実装の本をながめるようにしていた.

coursera の講義は、Part1, Part2 にわかれて提供される. 今回は、Part1 で、ハードウェアの部分を学習した.

毎週の講義と参考書の章は 1 対 1 で対応していて、 毎週 1 章を読んでいく.

また、毎週 assignment として、部品の作成をして、 成果物は coursera の採点システムに提出する.

感想

山登りに似た達成感

コンピュータの部品を一歩一歩部品を作成して行くことで、 途中から自分の作成した成果を見直すと、山の頂上に立ったような達成感、 全能感を感じることができた.

抽象によるコンピュータの構築

また、NAND という単純なゲートから、徐々に部品を組み上げていく様は、 まるで、単純な公理から定理を導いていくような趣きもある.

一つの部品を作成すると、部品がどうやって動くのかということを ブラックボックスにすることができて、部品は何をするのかだけを知ればよい.

それは、ソフトウェアでもよくでてくる抽象化というやつだ。

邦訳の 抽象と実装 という意味を実感した.

ハードウェアがなんなのかということがわかった

自分は組み込みソフトの開発者なので、ハードウェアを理解していないこと で、話について行けなくなることがたまにある.

先日も、ハードよりの講演会に参加したのだが、話を聴いていてもまったく わからずに悔しい思いをした.

CPU, レジスタ, メモリ, などなど、説明を読んで理解していた気になっ ていた. 今回、自分の手で作り上げることによって、それらがいったいなに をやっているのか、理解できた気がした.

それらは知らなくてもいいこと

しかし、ハードウェアの知識はソフトウェア開発に必要かといえば、 必要ないことだ。

自分自身の人体の仕組みをしらなくたって、人間は生きていける. 機械語を理解することと、DNA を理解することは、 同じことだとともう. それらは、必要ない.

では、なぜ学ぶのかといえば、一つは好奇心、もう一つは不安感のため. 知らなくたってなんとかなるものの、得体のしれないブラックボックスの 中身を知らずに使いつづけるのもあまり気分がいいものではない. なので、不安感を解消するために、安定感を得るために、学ぶ.

自分の組んだプログラムがハードウェア上でどのようにして 動作するかを知ることにより、ソフトウェアに自信を得ることができる.

勉強メモ

以下、作成した部品のメモ.

week1: ゲートへ

論理ゲートとは、ブール関数を実現するための物理デバイス.

ゲートをまとめたものを回路, チップという.

トランジスタ

2 値のデータ表現を電気で実現する物理デバイス. スイッチング技術.

電気であることが一つのポイント. 別の物理性質を用いてゲートを作成することもできる.

NAND

もっとも基礎的な論理ゲート.

論理ゲート

すべてのブール関数は NAND NOT をつかって表現できる. (AND, OR, NOT ) を含む.

  • NOT (x) = (x NAND x)
  • AND (x, y) = NOT (x NAND y)
  • OR (x,y) = NOT (NOT (x) AND NOT (y))

NAND を実現した物理デバイスが自由に利用できれば, どのようなブール関数もハードウェアとして作成できる.

マルチプレクサ

ふたつ以上の入力をひとつの信号として出力する機構.

マルチプレクサによって、ハード的に if 文を表現することができる.

作成した成果物

これらの部品は、HDL で作成していく.

  • And

  • Or

  • Xor

  • Not

  • Not16, And16, Or16, Mux16 … 16 進数の 論理ゲート

  • Mux … マルチプレクサ

  • DMux … デマルチプレクサ

  • Mux8Way16, DMux8Way, DMux4Way .. 16 進数のマルチプレクサ

week2: ALU へ

算術ゲートは、算術計算をおこなうためのゲート.

コンピュータの命令は 2 進数の加算に還元できることが多い.

算術計算を行うゲートは、ALU という CPU 内部の論理算術ゲートに集約される

作成した成果物

  • HalfAdder … 半加算器
  • FullAdder … 全加算器
  • Add16 … 16 進加算
  • Inc16 … 16 進インクリメンタ
  • ALU … 論理算術ゲート

week3: Memory へ

この章で、*状態* という概念がでてくる.

順序回路

ひとつ以上のフリップフロップ回路が組み込まれているもの.

以下のような機能をもつ.

  • 状態を保つ
  • 状態を操作する

状態がかわるのは, クロックが次の周期に移行したとき. (c.f. 組み合わせ回路は即時)

(D) フリップフロップ回路

順序回路の中でもっともプリミティブなもの. NAND とともに, もっともプリミティブなものとして考えられる.

フリップフロップ回路の実装方法はいろいろある. NAND から構築する方法もある.

レジスタ

データを記憶したり取り出したりすることができる順序回路. - レジスタ (コンピュータ) - Wikipedia

メモリ(RAM)

レジスタがたくさんあつまったもの.Random access Memory.

各レジスタには、一位のアドレスが割り振られている.

作成した成果物

  • Bit, Register … レジスタ
  • RAM8, RAM16, RAM64, RAM512, RAM4K, RAM16K … RAM
  • PC … プログラムカウンタ

week4: 機械語へ

機械語

機械語とは、コンピュータの CPU で直接実行される一連の命令.

一つ一つの命令が行う仕事は極めて限定されており、 CPU のレジスタやメモリ上の単位データに対して、 読み込みやジャンプ、ALU といった操作を実行する。

機械語は, レジスタ、プロセッサを用いて、メモリを操作する.

作成した成果物

  • 乗算プログラム
  • 入出力操作プログラム

week5: コンピュータアーキテクチャへ

CPU

中央処理装置, プロセッサとも.

仕様で決められた一連の命令セットを実行できる.

記憶装置上にあるプログラムと呼ばれる命令列を順に読み込んで 解釈・実行することで情報の加工を行う.

ノイマン型アーキテクチャ

CPU を中心として、メモリデバイスを操作し、 入力デバイスからデータを受け取り、出力デバイスへデータを送信する.

  • メモリ
    • データメモリ
    • 命令メモリ メモリ上にプログラムを保持するところがノイマン的.
  • CPU
    • ALU
    • レジスタ
    • 制御ユニット
  • レジスタ
    • データレジスタ
    • アドレスレジスタ
    • プログラムカウンタレジスタ 次にフェッチする命令メモリ上のアドレスを保持して、 一つ命令を実行する度にインクリメントしていく.
  • 入出力装置 メモリマップド I/O によってメモリ操作のように制御

作成した成果物

  • CPU
  • メモリ
  • コンピュータ

week6: アセンブラへ

アセンブリ言語

機械語を人間にわかりやすい形で記述する、代表的な低水準言語である.

作成した成果物

  • アセンブラ

これは、Ruby で実装してみた.