O'Reilly Japan - コンピュータシステムの理論と実装 第2版(通称Nand2Tetris)の実装プロジェクトを勉強がてら,go言語で実装していきます.書評はこちら.ドキュメントはこちら.
- ハードウェア(ブール論理,ブール算術,メモリー,機械語,コンピュータアーキテクチャ)
- アセンブラ(Hackアセンブリ言語→Hackバイナリファイル)
- コンパイラ バックエンド(VM変換器;VM言語→Hackアセンブリ言語)
- コンパイラ フロントエンド(Jackコンパイラ;構文解析,コード生成;Jack言語→VM言語)
- OS(Jack言語標準ライブラリ)
✨ Web上でJackコンパイラとHackアセンブラを実行できるWeb アプリケーションも制作し,公開しています.
go get -u github.com/Kaichi-Irie/nand2tetris-go
Nand2Tetrisプロジェクトとは,Nandゲートから始めて,論理ゲート、加算器、CPUを設計したのち、アセンブラ、VM変換器、コンパイラ、OSを実装し,コンピュータを完成させます.そして,最後にその上でアプリケーション(テトリスなど)を動作させるというプロジェクトです.
本プロジェクトでは,Hackという専用のコンピュータアーキテクチャ,およびその上で動作するJackという専用の高水準言語が用意されています.また,前半のハードウェアプロジェクトは,公式にOnline IDEが用意されており,そこで実装することができます.後半(6章以降)のソフトウェアプロジェクトは,各自,好きなプログラミング言語で実装することができます.
プロジェクトの概要については,公式のCourse Promoの動画がとてもわかりやすいです.
hardware/
: ハードウェアの実装assembler/
: Hackアセンブラの実装vm/
: VM変換器の実装jackcompiler/
: Jackコンパイラの実装img/
: プロジェクトの画像
テストは,go test
コマンドを使って実行します.
$ go test ./...
アセンブラは,Hackアセンブリ言語をHackバイナリファイルに変換するプログラムです.
アセンブリファイル(.asm)を引数に与えて実行すると,同じディレクトリに
<input.asm>.hack
が生成されます.これはHackバイナリファイルです.
$ cd assembler
$ go run main.go <input.asm>
VM変換器は,Hack VM言語をHackアセンブリ言語に変換するプログラムです.
VMファイル(.vm)を引数に与えて実行すると,同じディレクトリに
<input.vm>.asm
が生成されます.これはHackアセンブリファイルです.
$ cd vm
$ go run main.go <input.vm>
ディレクトリを引数に与えると,ディレクトリ内の全てのVMファイルを変換し,同じディレクトリに<dirname>.asm
が生成されます.この場合には,Sys.vm
が最初に実行されるアセンブリコードが生成されることに注意してください.Sys.vm
が含まれていない場合は,エラーが発生します.
$ go run main.go <dirname>
Jackコンパイラは,Jack言語をHack VM言語に変換するプログラムです.コンパイラは構文解析とコード生成の2つのフェーズに分かれています.
構文解析では,Jack言語のソースコードを解析し,構文木を生成します.その後,構文木をHack VM言語に変換します.
$ cd compiler
$ go run main.go <input.jack>
このXMLファイルは,<input>.vm
という名前で出力されます.
ディレクトリを引数に与えると,ディレクトリ内の全てのJackファイルをコンパイルし,同じディレクトリに<filename>.vm
が生成されます.
$ go run main.go <dirname>