10月から学生ニート状態でした。そのため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デバックも虚しく謎のセグフォで積んでしまい先日廃車確定しました。
ここでかなり寄り道をしていて、
- azuさんのDive into ASTをみながら結構あやふやにしていたASTの基本的な部分を学びました。
- Goで作るインタプリタをRustでつくりました。
- rust-clippyでたまたま踏んだバグがissueに上がっていたのでコントリビュートしたりしてました。
- ↑に付随してASTとHIRやMIRといった中間表現に関してすこしかじりました。Guide to Rustc Developmentやこちらの記事を参考に進めました。(あんまり理解できてないですが😇)
といろいろやってました。
OS
12/10日時点でここまでいけませんでした…頑張って続けます。
反省
CSの勉強というより言語処理の勉強になっていた。コンパイラ関連に比重が偏り過ぎている😇😇😇
その他
- めっちゃライプニッツとかシャノンについて調べてました。
nix
クレートを使ってrustで自作のShellを作ろうとしてました。が、nix
の情報が少なく全然進んでません。parserつくってpipeやredirectあたりは実装したいところ。
終わりに
- 自分にしてはわりと続いた
- コンパイラブックはいいぞ!
Footnotes
-
物理層に近づくほど量子力学や統計力学の知識が必要になって重い。未だに雰囲気しかわからない… ↩
-
脆弱性に関してHacking: 美しき策謀 ―脆弱性攻撃の理論と実際という面白そうな本が積読状態だ。 ↩
-
最近までずっと
ペタハネ
だと勘違いしていた。パタヘネ
だった。 ↩