『コンピュータシステムの理論と実装-モダンなコンピュータの作り方』のプロジェクト
コンピュータを理解するための最善の方法はゼロからコンピュータを作ることです。コンピュータの構成要素は、ハードウェア、ソフトウェア、コンパイラ、OSに大別できます。本書では、これらコンピュータの構成要素をひとつずつ組み立てます。具体的には、NANDという電子素子からスタートし、論理ゲート、加算器、CPUを設計します。そして、オペレーティングシステム、コンパイラ、バーチャルマシンなどを実装しコンピュータを完成させて、最後にその上でアプリケーション(テトリスなど)を動作させます。実行環境はJava(Mac、Windows、Linuxで動作)。(裏表紙より引用)
プロジェクト10: コンパイラ#1:構文解析
ピンの名前に_を使うとこのエラーが発生する。 そのため、ピンの名前には英数字のみを使用する。
プロジェクト2のALUを実装するときに発生した。
やりたかったことは、Or8Way(in[8], out)という部品に、ALUの入力バス(INの後で定義されるバス)でない内部バスintenal[16]の前半部分と後半部分を2つのOr8Wayのinに分けて入れる、ということだった。 イメージとしては次のような記述である。
Or8Way(in=internal[0..7], out=out0)
Or8Way(in=internal[8..15], out=out1)
しかし、こうすると上記のエラーが発生する。 調べたところ、どうやらin=a[0..7]のようなinの右辺に[ ]を使う記述ができるのは、aが入力バスのときのみのようだった。 このエラーの解決策としては、Or16Way(in[16], out)のような部品を自分で用意して、その部品内で
Or8Way(in=in[0..7], out=out0)
Or8Way(in=in[8..15], out=out1)
としておいて、元の部品内(今回の場合、ALU)では
Or16Way(in=internal, out=out0)
とするやり方がある。 この場合、inはOr16Way内では入力バスなので、in=a[0..7]のようなinの右辺に[ ]を使う記述をしてもエラーは発生しない。 詳細はプロジェクト2のALU.hdlを参照する。
プロジェクト4のFill.asmを実装するところで発生した。
Mに直接0、1、-1以外の数字を代入しようとすると発生する。
@1
M=1024 // エラー
Mに0、1、-1以外の数字を代入する場合は、AとDを経由して代入するとエラーが出なくなる。
@1024
D=A
@1
M=D
Windows 11ではディスプレイの縦の長さが約8cm未満だと、HardwareSimulatorを画面いっぱいに表示しても、テストの実行結果やエラーが表示される欄が表示されない。
一方、Ubuntu 18.04では表示される。
対応策は仮想マシンや実機などにLinuxを入れてそこでnand2tetrisをやるか、ディスプレイの縦の長さが8cm以上のモニタを用意しそのモニタにHardwareSimulatorを表示させるか、公式サイトでソースコードが公開されているのでそれを自力で修正するかだと思う。
日本語版書籍の8章の図8-5で遭遇した。
唐突にアスタリスクが使われていたので、その意味が分からなかった。 考えた結果、以下のような結論に至った。
例えば、書籍に出てくる次の疑似コードは
*ARG = pop()
次のようなコードと同じ意味だと思う。
RAM[RAM[ARG]] = pop()
// 日本語の意味:
// スタックからpopしてきた値をRAMのRAM[ARG]番地、つまりRAM[2]番地にセットする
一方、アスタリスクの付いていない場合を見ると、例えば、書籍に出てくる次のコードであれば、
SP = ARG+1
というものがあるが、これは次のコードと同じだと思う。
RAM[SP] = RAM[ARG]+1
// 日本語の意味:
// RAM[ARG](実態はRAM[2])に1を足した値をRAM[SP](実態はRAM[0])にセットする
- 作成したバーチャルマシンから生成されたアセンブリと同じディレクトリにBasicTest.tstとBasicTest.cmpをコピーしてくる
- CPUEmulatorを開き、
Load Script
(紙のアイコン。ホバーするとLoad Scriptと表示される)をクリックして、BasicTest.tstを読み込む >>
のアイコンをクリックし、CPUEmulatorを走らせる