イントロダクション
コンピュータの下側の世界,つまり低レイヤーの部分は,コンピュータサイエンスで最も美しいアイデアと技術から作られているようで,著者によれば,この美しい世界を熟知しているかどうかが,「平凡なプログラマー」と「優れた開発者」を分ける試金石なるとのこと.これを聞くと,学ばない選択肢はないですね.
- 完全なるコンピュータシステムをゼロから構築することで,そのコンピュータの真髄を理解できる.
- 抽象化,モジュール化を駆使して,コンピュータシステムを作りあげていく
- 優れた抽象化を習得するためには,多くの実例を見るのがよい
1章 ブール論理
コンピュータ科学者から見た,コンピュータの構成要素の最小単位は,基本論理ゲートであるらしい.この基本論理ゲートの構造構造に関しては,ハードウェアエンジニアに任せよう,という潔い姿勢がおもしろい.
HDL (Hardware Description Language)
VHDL (Virtual Hardware Description Language) ともいう. 昨今のハードウェアエンジニアも,ソフトウェアを書くように回路図を書けるんだって.
ざっくりとしたHDL の基本的な書き方
- Not, And, Or 等の基本的なゲート要素は,引数,出力名が固定されていて,きちんとドキュメント読んで,その通りにリファレンスしましょう,とのこと
- PARTS: 以下に実装を書く
- -- でコメントアウト.Java でいう,// と同じ
- 内部的なパーツの連結は,内部ピンを作成し,それを連結させる.
- ここでいう内部ピンは,変数みたいなもの
一癖あるHDL
しかし,このHDL,普通のプログラミングに慣れていると一癖ある.
CHIP Xor { -- 普通に宣言 IN a, b; OUT out; PARTS: Not(in=a, out=nota); }
における,
Not(in=a, out=nota);
この部分.これは
- in に a を代入,notaという変数(内部ピン)にoutを代入することを表す
- この一文で,notaという変数の宣言と,代入を同時に行っている
- 出力の,代入の = 位置関係が標準とは逆になっている
という仕様になっているが,普通のソフトウェアエンジニアリングに慣れるとどうも,違和感がある.
留意事項
プログラム編
- "_" を変数に含めることはできない
- 変数代入の際の間隔は空けてもよい.(a=b でも a = b も OK)
- キャメルケースはOK (hogeOut -> OK)
シュミレータ編
- 比較ファイルと相違点があった段階で,Runが止まる.
プロジェクト
この章のプロジェクトは,Nandゲートのみを用いて,And, Or等のプリミティブゲートを作成する. 既に用意されているファイルに解を書いて,テストファイルでテストする,という工程だ.指定された順番に沿って,プリミティブゲートを作成する.
第一章の学び・気づき
ツール
- 当プロジェクトにおける,HDLの大枠の書き方が分かるようになった(独自のフォーマットなので汎用性は低いけれども)
- ハードウェアシュミレータの使い方が理解できた
回路図
- 基本論理ゲートの記号を瞬時に見分けられるようになった
- ゲート回路図に対する抵抗感がなくなった
- マルチプレクサとデマルチプレクサの違いが分かるようになった ★
- マルチプレクサ -> 収束,デマルチプレクサ -> 発散 のイメージ
方法
回路の作成法が分からず,方法を調べた結果,以下の方法があることが分かった.
- カルノー図
- 主加法標準形