振り返り
- Study
概要
- こんにちは!今年も月日が経つのが早く 1 年の内の 1/3 が過ぎ去ってしまいました。後輩や友達に今年に入って何を勉強してきたのかを聞かれることがたまにあるので、その記録を残していきたいと思います。基本的に大学院の課題や研究は除いています。
1 月
そもそも今年のテーマは Computer Science の基礎を固めることでした。もう少し具体的に言うと、OS, CPU, Network, Container の仕組みをコードレベルで勉強したいと考えていました。そこで、まずコンピュータの全体像を掴むために、以下の本を 2 月中旬まで読んでいました。
この本は Nand to Tetris とも呼ばれるのですが、CPU を構成する回路 (例えば全加算器や ALU) を VHDL で実装して、エミュレータで動かすところからレイヤーを徐々に上げていきます。作成した基本的な回路を元に、CPU をエミュレートします。その後、機械語やアセンブリ言語やスタックを学び、VM、独自言語のコンパイラをインクリメンタルに実装していきます。この本と付随する演習問題を全て解くことを通して、 CPU や VM と言った普段は意識しない低レイヤなものの振る舞いをなんとなくイメージできるようになりました。
2 月
コンピュータシステムの理論と実装を読んで、特にアセンブリとコンパイラに興味を持ちました。そこで、以下の本と資料を読み始めました。
前者に関しては、CTFer にはおなじみですが、セキュリティ的な観点からスタックやアセンブリを学べました。初心者向けの本だったので、コンピュータシステムの理論と実装の復習にもなり、学びになりました。
後者に関しては、 C 言語のコンパイラをテストコードと共にインクリメンタルに実装していくものです。このコンパイラを実装できれば、自作コンパイラのコードそのものや、xv6 をコンパイルできるとワクワクしていました。しかし、C 言語の理解が学部 1 年生レベルで止まっていたこともあり、型をコンパイルしてアセンブリを吐き出せるようになる手前で挫折してしまいました。毎日付けているノートを振り返ると、C 言語の理解の浅さとアセンブリ言語の知識が足りなかったと反省しています。
3 月
自作コンパイラを挫折したものの、 C 言語で C 言語のコンパイラを書き、苦手だったポインタを使うことを通して、昔程 C 言語に対する苦手意識が下がりました。むしろ、さらに C 言語で何か意味のあるプログラムを書きたいと思うようになりました。また、C 言語を使いこなせずに社会人になるのは恥ずかしいので、C 言語を使って何か実装しつつ低レイヤの理解を深めたいと考えていました。そこで、3 月の下旬から 4 月の上旬にかけて、以下の本を読み始めました。
この本は、システムコールやライブラリ関数を用いて cat や ls と言った Linux コマンドや、最終的には HTTP Server を実装していくものです。この本は半年前に流し読みしたことはあったのですが、当時とのモチベーションとの差もあり、なんとか取り上げられている全てのコマンドを実装することができ、読み切ることができました。その結果、C 言語をもっと書きたいと思うようになっていました。
4 月
C 言語の基礎をやりつつ、たくさんプログラムを書いてアウトプットしたいと考えていました。そこで、以下のサイトを利用しました。 C 言語で基本的な処理やアルゴリズムを組み合わせた問題を約 70 問ほど解き切りました。
4 月末に、このサイトで問題を解ききると、ある程度 C 言語の読み書きはできる自信が出ました。セグフォが出ても焦らずボトルネックを調査して対処したり、malloc() や構造体を使いこなし、文字列の処理も苦手意識なく取り組める状態になっていました。そこで、これまでの集大成として、以下の資料を参考に自作エディタに取り組むことにしました。端末のモードを変更したり入力文字列の処理が大変でしたが、GW 空けには実装できました。
今月から取り組んでいること
C 言語を用いることに対しては、ある程度自信はつきました。しかし、C 言語を用いてさらに何か作りたいと考えていました。本来は自作プロトコルスタックに取り組みたかったのですが、模倣しようとしていたソースコードを眺めていたところ、無謀だということに気づきました。マスタリング TCP/IP レベルの理解では理論と実装の隔たりが大き過ぎるということです。そこで、以下の本やキーワードに対する検証を繰り返して、まずはネットワークプログラミングの基本をコードレベルで学びたいと考えています。
最後に
- 今年もあと 2 ヶ月弱で半年が過ぎ去ってしまいますが、もっと色々なことを勉強していけたらと思っています!