『コンピュータシステムの理論と実装』読んでコンピュータ作った
概要
O'reillyから出ている書籍です。 www.amazon.co.jp
「NANDからテトリスへ」という帯タイトルがまさになのですが、NANDゲートが与えられた状態からスタートし、ゲームが動くコンピュータを作り上げます。
割り切って言ってしまうと、本書はその説明書となります。
NANDゲートからAND・ORゲートなどをHDLで記述していき、ALU、CPUを作り、アセンブラ、VM、コンパイラ、OSを書き、最終的にはコンピュータシステムが出来上がります。
もともとは大学の授業として作られたテキストのようで、Webページには資料や必要なソフトウェアが公開されています。
実際にコンピュータシステムを作る
本書はコンピュータシステムの理論が書かれているだけではなく、実際に手を動かして実装できるようエミュレータやテストツールが付属されています。
前半でハードウェアを、後半でソフトウェアを作成します。
ハードウェアは実際に作るわけではなく、HDLで記述していきます。 NANDからマルチプレクサやALU(算術論理演算器)、フリップフロップからメモリやプログラムカウンタを作成し、それらからCPUを、そして最終的にコンピュータのハードウェアを作り上げます。
前半でバイナリコードを処理するコンピュータが完成するので、後半でそのコンピュータ向けバイナリコードを生成するような、アセンブラ・VM・コンパイラ・OSを作成します。
アセンブラ、VM、コンパイラ作成では自分の好きなプログラミング言語を使用し、テストツールがあるので、それをパスするように実装していきます。
本書ではJackという比較的単純な言語を使用しており、Jack用のアセンブラ・VM・コンパイラを作成します。OSはJackで書きます。
作業量
Courseraにこの書籍の前半部分の授業が公開されており、1週間5〜10時間の勉強を7週間という作業量で書かれています。
単純に計算すると、倍の70〜140時間かかることになると思います。(ただし、後半のほうが難しいので、単純計算はできないかもしれません)
他の人がやったものがGitHubに上がっているのですが、VM・コンパイラはそれぞれPythonで数百〜千行くらい書かれてるので、それぐらいの実装が必要かもしれません。
自分は丸12日くらいかかりました。(コンパイラの実装が凄く大変でした…)
雑感
実装がかなり大変ですが、普段気にしていなかった「CPUは分岐をどう処理するか」「スコープの異なる変数をメモリはどう扱うか」などが分かり、勉強になりました。
やって役に立つのか?というとよく分かりませんが、別の書籍の『アンダースタンディングコンピューテーション』のまえがきで、まつもとゆきひろさんが以下のように書かれています。
この「根源」に関する知識がなくてもほとんどの場合、プログラムは書けます。しかし、「計算」とはなんであるかという知識は、プログラミングの本質を理解するのに役立つでしょう。そして、それは心の奥底に沈み込んで、いつかきっと日常を超えたプログラミングを現実化する時の知識となってくれるに違いありません。仮にそんな日が来なくても、教養というものは人生を豊かにしてくれるものでしょう。
日常で使用しているコンピュータをゼロから構築するという体験は、それだけで刺激的であり、また先人の知恵の偉大さを感じさせてくれるものでした。