「CPUの創り方」5章(ROM)からクソ面白かった
年末年始に『CPUの創り方』を読んだときの感想と学びのまとめです!
結論、面白かったです。
まだ読んだことがない方にはエンジニア人生のどこかで読んで欲しいと思いました。
自分のコンピュータサイエンスに関するステータス
『こんな人でも面白く読めましたよ』という意味で、自分のステータスを書きます。
- 学部は地球惑星系の物理学科(情報系ではない)
- 研究でプログラミングを使う必要があった(Fortran)
- 大学の「情報」の授業で、今の高校の情報IでやるようなCPU基礎を学んだ記憶がある。
- https://www.youtube.com/watch?v=MzlixLc3D0s&t=473s こういうやつ
- ブレッドボードで配線を組んだ記憶もあるが、もう忘れた
- なんやかんやで低レイヤは適当に流してきた、7年目のプログラマ。
- アプリ側がメイン。C#→Java→Python
なんで読みたくなったの
上長と『技術的に強くなるにはどうしたらいいですかね〜』という話をしていたときに教えてもらった以下のブログでおすすめされていたためです。
「普段は雰囲気でプログラムを書いているけど、これだと基礎力が上がらないよな〜』とは常々思っていたので、年末年始に読むことにしました。
ゆくゆくはGoogleのソフトウェアエンジニアとして働けるレベルの人になりたい。
感想まとめ
「良著です」というのはいろんなブログを読むと書いてあるので、そっちを参考にしてもらえたらと思います。
個人的にどこでテンションが上がって、どこが微妙だったかをまとめます。
1〜4章: そこまでテンションが上がらず
『フーン』というノリで、読み物としてだけ読んでいました。
電気回路を実際に配線するつもりがある方は、真面目に読んだ方がいいかもしれません。
- 配線時の装備(抵抗・コンデンサ・LEDなど)、どこで買えるのか
- IC(集積回路、Integrated Circuit)の製品名
- 配線時の静電気問題
- チャタリング(スイッチ切り替え時の電圧のブレ)の対策
- プルアップ
などなど、工作時には気にしないといけないことが書かれているためです。
...というか、ここを面白く読める人は、電気回路工作をやりたくなってしまう人だと思います。
自分は迷った末に『理論だけでいいか...』となりました。動作確認に時間が溶ける気がしたためです。
あ、でも2章あたりを読むと『0と1を電気的に表すって結局どういうことなんだっけ』がわかるので、そこは面白かったです。
自分の好きな高校物理(電磁気)の世界と、普段業務で使っているPCの世界がつながった気がしたからだと思います。
5章: ROMをシミュレートしてみてテンションUP
ここが「この本おもしれ〜」となった分岐点でした。
ROM(Read Only Memory)の回路を設計して組んでいくという章なのですが、以下のQiita記事とあわせて読むことで世界が開けました。

↑実際にシミュレーションしてみたときの例
- 左下のS3〜S0がROMの入力で、メモリのアドレスに相当します。4桁なので16個のプログラムを保持できます。
- 右側のC7〜C0がROMの出力で、機械語に相当します。例えば「10010011」が「レジスタAからBに値をコピーする」といった命令になります(実際の回路設計は違った気がします)。
「CPUはあらかじめ整理された命令やデータをアドレス順に取得して、それらを順々に実行していく」というのは情報の授業で習うところですよね。図で言うとこのあたり。⇩

それが電気回路でどう表現されるのかが理解できたことから、CPUの中身がわかった気がして、とても面白くなってきました。
6〜10章: アーおもしれ〜〜
ROMがわかったあとは、情報で習ったCPUの仕組みを実現するために必要な部品を拡張していくだけなので、すらすら読めました。
- 6章 機械語について(MOV A,0001とか)
- 7章 1bitCPUを作る
- ここで『CPUは転送を繰り返すだけのロジック』という至言が出てくる。結論がここで出ていた...
- 8章 ALU(演算装置)、プログラムカウンタ、I/Oをつける
- 9章 デコーダを作る
- 「10010011」と「レジスタAからBに値をコピーする」をマッピングする装置
- 10章 回路図まとめ
11章: 動作確認
「実際に動作確認する人用のノウハウ」
「ハウトゥーデバッグ」
という感じの章でした。
実際に工作はしないと決めていたので、『ふむふむ、大変そうやな...』と読むだけにとどめました。
学び(CPUについて)
- CPUは要するに、フリップフロップによる転送装置の塊。クロックごとに電気的な信号の転送を繰り返すことで、計算しているように見える。
- レジスタAの値をレジスタXに転送する、レジスタAの値を(なんらかの処理をして)レジスタXに転送する…などをやっているだけ。
- 「なんらかの処理」の中で演算が挟まっていたりするゆえに、いろんな計算ができる
- クロックはダンスのリズムのようなもので、『いち、に、さん、しー』とテンポを刻んでくれるもの。それに従ってCPU(ダンサー)が処理を動かす。
総評
- 『今更こんなこと知らないとか恥ずかしいかな』と思わずに、何でも興味を持って読んでみると面白いです。
- 義務教育でやった電子回路と実務がつながると、なお面白い。
- 年末年始に知的好奇心を満たすのって最高!!!!!!!!!!
Discussion