コンピューターシステムの理論と実装を読んで
めちゃくちゃいい本だった。
今までメモリって何?レジスタって何?0/1で動いてることは知っているけど、普段書いてる言語とどうつながりがあるの?などを理解しておらず、結果として「プログラミングはよく分からないけど動く」ものになっていた。
そういう状態であると、常に「意図していないことが起きるのではないか・・」といった不安もあるし、新しい技術ができてもどこまでができてどこまでができないのかの区別もつかない。また、技術の理解もどこか輪郭がないようなふわっとしたものになる。
今回、NANDとDFFからハードウェアを作り、高級言語を機械語にすることを掴み、さらにOSの一部を実装したことで、だいぶリアルに理解できたなぁと思う。全体像が掴めた。
そして、こう思わせてくれた素晴らしいツールも含めて、また読みたいと思う素晴らしい名著であった。
今後は、OS、ネットワークという低レイヤの理解を深めて、より輪郭がくっきりするところまで行きたい。
以下、改めて要約
第1章
NANDから色々なゲートを作る。NOT,ANDなどから、マルチプレクサなど
第2章
ブール算術をする。主に0/1の足し算である。
ALUを作る。NANDゲートから、ここまで汎用的な回路が作れるのは感動を覚える。
プログラムカウンタなども作る。
第3章
DFFから、レジスタ、そしてレジスタの集合であるメモリを作る。
第4章
アセンブリを実装してみる。それを通じて、機械語を理解する
ここで、A/DレジスタといったJackプラットフォームの独自の概念が出てくる。
第5章
コンピュターを作ってみる。
メモリ、ALU、プログラムカウンタなどを組み合わせる。回路をちゃんと繋ぐことで、機械語の0,1によって、ちゃんと計算する計算機となる。
メモリとScreen,keyboardなども接続する
第6章
アセンブラを作る。
アセンブリから機械語を生成するプログラム。そこまで難しくはないが、parseとCodewriteを分ける実装をして、今後実装するコンパイラの1st stepになる
第7.8章
スタックという機構の解説。本書では、高級言語を機械語に変換する時に、高級言語->スタック(VM)->アセンブラ->機械語というステップを踏む。
スタックがあることで、関数の呼び出し順番の制御が楽になったりと、面白い考え。
ここでは、スタックからアセンブラに変換するプログラムを作る。
前半では、主に算術コマンドと変数の制御が出てくる
後半では、プログラムフローの制御と、関数呼び出しが出てくる
9章
jack言語の解説
10,11章
高級言語をスタックに変換する。
tokenに分解->文法に沿って、tokenの構造を理解する(再帰的に分析)->構造に従って、スタックに置き換える
かなり難易度高め。自分は再帰的に分析するところと、再帰的に置き換えるところが難しく、そこはできなかった。
ただし、Object,array,stringはベースアドレスを渡しているや、変数のスコープ管理など勉強になるところは非常に多かった。while,ifなどのプログラムフローは容易に変換できる(変換は自力でできるが、それをプログラムに落とし込むと難易度が一気に上がる印象。再帰処理が必要なことと、構造への変換自体も何をやればいいのかよく分からないという難しさがあると思う(いつかチャレンジしたい)
12章
OSクラスの実装
ハードウェアに依存する処理をかいて、ハードウェアを意識せずにいろんな処理ができるようにする。
heapの管理や、stringのデータの持ち方、文字列の書き込みなど、ここも勉強になるところが多かった。
この記事が気に入ったらサポートをしてみませんか?