nand2tetris (コンピュータシステムの理論と実装) 完走しました

はじめに

コンピュータシステムの理論と実装(通称、nand2tetris)*1という本がありますが、ひとまず完走しました。 1年前くらいに買った本ですが、かなり放置していました。1行でも本を読んだりコードを書いたりしたのは2週間強くらいだと思います。

他のブログでもよく取り上げられているので本の詳細は省きます*2が、満足したのでその紹介と感想を簡単に書くことにします。

www.oreilly.co.jp

本の概要

NANDゲートを組み合わせるところから始め、最終的に高級言語で書かれたPong*3というゲームを動作させることを目的としています。

本書で扱うシステムはHackと呼ばれる16bitアーキテクチャのコンピュータです。16KBのRAMと512x256のスクリーンやキーボード*4をサポートしています。

なお、本書では最適化に関しては特別考慮しておらず、他の場所で学ぶことが想定されています。

感想

テストに関して

全体的に各種シミュレータやテストが提供されているので、それをパスすることを目指して作っていけます。テストが用意されていることでかなり実装しやすく感じました。 テストプログラムが各ソフトウェアの完成度に合わせて用意されているので、一度に全部作る必要はなく段階的に実装することが可能です。 ちなみに各ソフトウェアは自由な言語で記述できるので、私はRustを使いました。

パーサの実装について

パーサを実装しやすいようにJack言語はシンタックスが工夫されています。この頃たまたま「実践Rust入門」を読んでいて、パーサの実装に関して記載があったので参考にした記憶があります。

また途中でパースしたものをXMLで吐き出しそれをテストする流れになっていましたが、少し面倒だったので私はメモリ上でASTを作りました。

gihyo.jp

APIについて

各所で実装するプログラムはAPIが提示されているのですが、個人的には基本的には従うが完全には従わなくてもよいと思いました。 実装に使う言語によってはよりよいインターフェースがあるはずです。

コンパイラについて

実装したコンパイラは、単純化のために例えばほとんどの演算子の優先順位が不定です。そのため、私は標準ライブラリの実装でコードをかなり書き間違えてしまい大変でした。 独自拡張として、慣れ親しんだ優先順位で解釈するコンパイラを作るのもありかもです。

制限

書籍としては完了したのですが、Pongを自前のVMアセンブラを使って動作させることはまだできていません(速度の観点で)。最適化に関しては今後やる気が出たらやろうと思います。

大学の講義との関連

要所で大学で受講した講義のことを思い出しました。

大学のおさらい(一部)としてもなかなか良かったと思います。

まとめ

概念レベルでは知っていることも多かったのですが、ある程度動くものを一気通貫して作るという点では実際やってよかったと思いました。

*1:Noam Nisan、Shimon Schocken 著、斎藤 康毅 訳

*2:そもそも序盤はうろ覚えです…。

*3:テトリスではないことはよく知られています。

*4:memory-mappedです。