ryokatsu.dev

「コンピュータシステムの理論と実装」を読んだ


名著を読みました。

「コンピュータ・サイエンスを独学で学ぶのにおすすめする本」として割と有名な本で、2,3年前ぐらいに購入しました。当時最初の何ページだけ読んで、挫折してそのまま読まなかったのですが、今年から放送大学で情報コースを学び始めたこともあり「今なら読めるのでは?」と思って読み始めました。

この本は、ハードウェアからソフトウェアを構築を行うことができる書籍で、電子回路によるブール論理、ブール算術からはじまり、最終的にはアプリケーションを開発するまでがゴールです。

感想

めちゃくちゃ良かったです。とにかくコンピュータの各モジュールがどうやって動いているのか、何をしているのかを把握することができました。今までコンピュータは「0,1の世界」「ブラックボックス」という印象があり、ただひたすらとんでもないスピードで計算している理解しかなかったのですが、低レイヤーの入門として実際どういうモジュールがあるのかを知れたので、ブラックボックス感はこの本を読んだことでなくなりコンピュータの見方が変わりました。もちろん大学の授業で近いことは学んでいたのですが、自分が、本書を読むモチベーションとして、「ざっくりコンピュータの中身って何をやっているのかを知りたい」だったのでより解像度が上がった気がします。

基本的なNANDゲート、条件分岐、順序回路、機械語、コンピュータアーキテクチャを学び、アセンブラがあってVMがあってプログラミング言語をコンパイルするためのコンパイラがあってみたいな感じで、章ごとに順番になっているのもとても理解がしやすかったです。逆に言うと章ごとに機能が独立しているので、興味がある分野だけ学ぶでも有意義だと思います。

各章ごとに実践があるのですが、自分はアセンブラあたりまでしかやっていないです。しかも結構カンニングしながら写経していました。(実装に使うツールや答えもネットに公開されています)最初の方は頑張ってやってみたのですが、設計して実装するのにかなりの時間が掛かるので諦めました。実践に関しては、手を動かせば更に理解できるかなと思いますが、無理をしてやる必要はないと個人的には感じます。ただ読むだけでもかなり学びになります。アルゴリズムを事前に学んでおくと良さそうです。(大学で学んでおいてよかった。。)

特に個人的に良かった章は、「5章:コンピュータアーキテクチャ」「6章:アセンブラ」「10~11章:コンパイラ」の3つです。

コンピュータアーキテクチャは、ノイマン型アーキテクチャのを知ることができ、メモリ、CPUなどを実際に手を動かしながら実装することができます。

そして実装したメモリ、CPUを使ってHackコンピュータを作っていきます。今まで図しか知らなかったことがそれぞれメモリとCPUやレジスタがお互いどういう役割をしているのかを知れたことが良かったです。(レジスタにも更に色々な種類があることも知れた。)

アセンブラについては、具体的な流れを知れたことが良かったです。パースをしてアセンブリをビットコードにしてみたいな今まで知らなかった流れを知ることができました。(シンボルテーブルというものも初めて知りました。)

コンパイラの章は、一番難しい箇所でした。当然実装も無理だと思って最初から諦めてました。ただ構文解析するにあたってトークナイザ、パーサというモジュールがあってそれぞれ何をするものなのかや、再帰下降構文解析などの手法で構文解析していくことなど内容としては、一番面白いところではありました。(自然言語処理の授業を受講していたことで、概念的なことは理解できた状態で読めていたこともありますが。。)

自分は、普段当たり前のようにTypeScriptを使っていますが、実際にコンパイルしてくれるコンパイラはどうやって構文解析しているのか興味はあるけれども、深くは知れていないし、普段意識することもないなと思っていました。ただこの章を読んで、コンパイラを作ったり内部実装を知ることはエンジニアにとって大事なことで、スキルも一気に伸ばせるなと感じました。