色々あって11月くらいから興味のあったCSの基礎的な部分を勉強してみました。一ヶ月半経過したメモ。
動機
- 開発ツール系のOSSで深いところに突っ込もうとすると、結構厳しさを感じていた。脳死でコードリーディングするのは辛いので一旦おやすみしてコンパイラブックに取り組んでた。進めていて結局メモリ周りのことに興味をもった。
- もうちょっとやっとけばよかったという先行研究を大量に頂いたため
外観
まずキタミ式イラストIT塾基本情報技術者を使いました。 かなり分厚いですが関係のある部分だけだったら2時間ぐらいで一周できます。これでどんな分野があるかつかみました。 その結果次の順序で勉強していくことにしました。
- 半導体
- 組み合わせ回路
- 論理演算
- 順序回路
----↑ 電気系の学科にいるのですでに勉強している部分-----
- CPU・メモリの外観
- 機械語(x86)
- CPU
- コンパイラ
- OS
- DB
- ネットワーク
- セキュリティ
脱線しまくったのでもちろんこの通りには進んでないです。 結構行ったり来たりしてます。
半導体 ~ 順序回路
ここは若干触れたことがあったこともあった & あんまり深入りしすぎるときりがないのでさらーと進めました。1 半導体、組み合わせ回路については
- ざっくりとした半導体の歴史
- p型・n型半導体
- 各FETとCMOSの仕組み、CMOSの消費電力について
- なぜNAND回路が実世界で主に使われているか
あたりがわかっとけば現状いいと判断しました。 論理演算・順序回路に関してはカルノー図や状態遷移図を用いた論理設計を軽くおさらい程度です。 ここはあまり時間をかけていません。
CPU・メモリの概観
メモリに関しては以前からちまちまやっていたコンパイラブックで触れていたのに 加えてRust in Actionの第6章が非常に面白くて良い教材でした。 先日日本語版も出ました。
ポインタ・(Rustにおける)参照・生ポインタ・メモリアドレス・スマートポインタの話が盛り沢山です。Cコンパイラを作る際にポインタ型の実装がまったく理解できていなかったのですが、この本をやったおかげでちょっとだけ視界が晴れました。
上記以外では書籍を読むよりもCやRustで気になった部分を色々実験したり調べながら進めました。 Cのメモリ脆弱性に関する部分(バッファーオーバーフロー、ダブリングポインターなど)を調べたりしていました。2
機械語
こちらもコンパイラブックで基礎的な命令や規則はほとんど勉強しました。x86-64です。
CPU
前述のRust in Actionの第5章でRustで簡単なCPUエミュレータを作りました。書籍をメモし忘れていたのですがCでもエミュレータを作りました。まだhdlには触れていません。じつはあまり深堀りできていのでどうにかするつもりでいます。パタヘネ本とか見たほうがいいのか🤔3
コンパイラ
コンパイブックで(以下略
手作りCコンパイラくんはgdbデバックも虚しく謎のセグフォで積みました。
ここでかなり寄り道をしていて、
- Dive into ASTをみた
- Goで作るインタプリタをRustで書く
- rust-clippyでたまたま踏んだバグがissueに上がっていたのでコントリビュート。
- ↑に付随してASTとHIRやMIRといった中間表現に関してすこしかじる。Guide to Rustc Developmentやこちらの記事を参考に進めました。
OS
ここまでいけませんでした…
反省
CSの勉強というより言語処理の勉強になっていた。コンパイラ関連に比重が偏り過ぎている😇
終わりに
- 自分にしてはわりと続いた
- コンパイラブックはいいぞ!
Footnotes
-
物理層に近づくほど量子力学や統計力学の知識が必要になって重い。未だに雰囲気しかわからない… ↩
-
脆弱性に関してHacking: 美しき策謀 ―脆弱性攻撃の理論と実際という面白そうな本が積読状態だ。 ↩
-
最近までずっと
ペタハネ
だと勘違いしていた。パタヘネ
だった。 ↩