表題のとおりです。
無事やりきったので、振り返りつつ感想文を書いてみたいと思います。
プロジェクトを実施した際のリポジトリはこちらです。
https://github.com/r-mutax/nand2tetris
本の紹介
NANDの組み合わせから論理回路を組み上げミニマムなCPU(ハードウェア)を作り、作成したCPUのアーキテクチャで動くアセンブラ、バーチャルマシン、コンパイラまでを作り上げて、簡単なゲームを作成しよう!といった趣旨の本です。
NANDから最後にはテトリスを作ろう!という意味が込められたnand2tetrisというプロジェクトを進めていきます。
プロジェクトにテトリスとついていますが、通常通りプロジェクトを進めていって最後にできるのはピンポンゲームなので、テトリスを作りたい場合は自分で作る必要があります。
https://www.oreilly.co.jp/books/9784873117126/
なぜ読もうと思ったか?
低レイヤを知りたい人のためのCコンパイラ作成入門に挑戦していたんですが、コンパイラ作成にだんだん詰まってきたので、気分転換&もっと低いレイヤの勉強を使用ということでやってみました。
感想
大体5ヶ月位やっていました。
平日は業務プログラミングで疲弊していたので、基本休日にやっていましたが、やらない週もありました。
よかったところ
論理回路から組み上げて、コンパイラまで行くのでコンピュータを動かす仕組みを一通り体験できて非常に面白かったです。
一個一個の階層では、その階層の仕組のみに注力できて、作業がしやすかったです。
最終的に複雑なソフトがきちんと動くのを見るのは不思議な感覚です。
むずかしかったところ
本書で使用しているHDL言語の書き方について悩みました。
とはいえ、nand2tetrisをやっている人は世界中にいて、適当に検索すればGithubなりStackOverflowなり出てくるのでそこまで困りません。
振り返り
簡単に振り返ってみます。
第1章 ~ 第5章 ハードウェア編
1章から5章ではハードウェア側の実装をします。
NAND素子から初めて、NOT/AND/ORを作り、ALUを作り、順序回路を作り、CPUまで作っていきます。
プロジェクトの名前はnand2tetrisで、ハードウェアのプリミティブな構成要素はnandだけのような名前になっていますが、実際はD-フリップフロップ(DFF)も使います。
シミュレータ上ではありますが、メモリと演算装置を備えたCPUを動かすところまで組み上げます。
第6章 アセンブラ
第1章 ~ 第5章で作成したCPUを動作させるためのHackというアセンブリ言語を読み込んで、機械語を吐き出すアセンブラを作り上げます。
6章以降はソフトウェア編になるのですが、プロジェクトの課題は任意のプログラム言語を使用することができます。
本書の課題ソースとして、入力用テキストが用意されているので、テキストファイル(6章の場合はアセンブリ)を読み取って、要求された出力ができたら成功です。
機械語の出力はバイナリではなくて0,1だけのテキストファイルでよいので、デバッグも難しくないです。
第7章 ~ 第8章 バーチャルマシン
Hackアセンブリ ~ 高級言語の間としてスタックマシンとして動作するバーチャルマシン(VM)言語を作成します。
VM → アセンブリへの変換ソフトを作成します。
間にVMを挟むことで、様々なプログラム言語のコンパイラを作る際に、VMへの変換をかませるようにしたら、アセンブラを使い回すことができます。
正直Hackのアセンブリはすごい組みにくいので、VMがあると開発がかなり楽になると思います。
HackのCPUはレジスタが実質2個しかないので、アセンブリを組むのにかなり苦労しました。
第9章 高水準言語
本書で使用するJack言語の紹介の章。
JackはJavaライクでクラスも配列もあります。ちょっとビビりますが、10章以降にこのプログラム言語のコンパイラを作ります。
正直、Jackのスキルを身に着けたいわけではなかったので、9章は全体に目を通して課題を飛ばしました。
第10章 ~ 第11章 コンパイラ
字句解析 ~ 構文解析 ~ VM言語への変換を行うコンパイラを作ります。
構文木のような構造のアウトプットをXML形式で出力することで、WEBブラウザなどで簡単に中身を確認できるというのは、目からウロコでした。
構文解析がうまくできれば、VMコードの出力はそこまで難しくなかったです。
11章のプロジェクトをクリアして、用意されたJackプログラムのコンパイルができるようになると、簡単なピンポンゲームがプレイできるようになります。
第12章 OS
他の方の記事でも言及されていますが、12章で作成するのはOSというよりも標準ライブラリのようなイメージが近いです。
Jack言語での実装をするので、紹介されているアルゴリズムを見て実装は見送りました。
第13章 さらに先へ
全体を通して、HackアーキテクチャとJack言語の今後の展望(追加で実施できる改良のアイデア)をいくつか説明してくれます。
おわり
全体を通して、かなりの低いレイヤから体験できるので、かなり自信がつきました。
一個一個の階層は想像以上にシンプルなのに、組み合わせて動かすと非常に複雑なプログラムもすんなり動いてしまうので、手品か何かのように感じて面白かったです。