見出し画像

Cコンパイラを写経して4ヶ月が経ちました。わからないことが増えました。

Ueyama Rui さんという Google のエンジニアの方が書いている『低レイヤを知りたい人のためのCコンパイラ作成入門』というサイトがあります。これをやるのに 4 ヶ月かかりました。今回はその経緯とか今後の展望とかを話そうと思います。

結論だけ先に言うと、言語処理系のざっくりした全体図と C 言語の基礎知識をいい感じに獲得できて良かったです。また、こうしていわゆる低レイヤの技術に触れられたことで、他の関連する技術にも思いをはせることができました。視野が広がった(つまり分からないことが増えた)のはよい収穫かと思います。

ちなみにこれが写経に使ったリポジトリです。

こちらが写経元となった Ueyama さんのリポジトリ。猫かわいい。

Web 開発に直接関係することは少ない(ように見える)かもしれませんが、どこかの機会にちらっとのぞくだけでも自分の無知さが実感できてよいなあと思いました。

さてここからは、そもそもなぜやろうと思ったのか、何を得たのか、他に何を学びたいと思ったのかなどを振り返ってみたいと思います。

やろうとおもったきっかけ

『 Ruby のしくみ』という本があります。Ruby の内部構造を紹介してくれている本なのですが、読めば読むほど新出単語が出てきます。いろいろ不可解な点はありましたが、これを読んで思ったのは、

・そもそもプログラミング言語はどのように処理されているのか知りたい
・C 言語の知識がないとソースコードすら読めないので勉強したい

の 2 点でした。

何かよいソースはないかなあといろいろ探していたところ、タイトル的にもそそる冒頭の Ueyama さんのサイトに見つけたのでした。ありがとうございます。

実際やってみて得たもの

じゃあ結果はどうだったの?というところ、ざっくり振り返ってみます。

言語処理系のざっくりした流れを知ることができた
書いたコードをトークン化し、抽象構文木にそれぞれパースして、アセンブリに吐き出す、というのが基本的な流れのようです。これさえ分かっていれば、超絶簡単な計算しかできないコンパイラみたいなジョークプログラムとかも作れるようになるんじゃないかな。

C 言語の基礎的なことが分かるようになった
まず C 言語自体を書いたことがなかったので、それ自体の勉強も合わせてできたので一石二鳥という感じでした。とはいうものの、未知の領域なので補助教材として『苦しんで覚えるC言語 [プリント・レプリカ] Kindle版』を読みながら勉強しました。

これ苦しいとか言っときながらかなり丁寧に教えてくれるので、ぶっちゃけ読んでて面白いです。けっこうオススメかも。

CPU のアーキテクチャに思いをはせた
まずエンジニアになってから CPU の構造とか気にしたことなかった(いやないことはない…か)んですけど、今回アセンブリ言語を使っていたので、レジスタがどうとかいうことも学ぶ必要がありました。

アセンブリ言語の書き方とか命令セットとかを参照したかったので『Intel® 64 and IA-32 Architectures Software Developer’s Manual』を読んでいました。これめちゃめちゃ長いドキュメントなんですけど、何やら CPU の歴史とかにも触れてくれているので、単純に読み物として面白いです。じっくり読んでみたい。

今後勉強してみようかなと思っているもの

インタプリタとコンパイラの違いって何?とか OS のしくみってどうなってるの?とか Linux も気になるなあ、という感じで興味の幅がいい感じに広がってきています。以下にざっくり課題図書をあげるので、それらを勉強できると良いなと思います。

・・・

最後に余談ですが、「成果にすぐにはつながらないけど大事なこと」ってありますよね。科学とかにありがちだと思うんですけど。今回の勉強もそれに似てるかもなあと勝手に思ったりしてます。仕事に必要なことだけすべきならもっと他に優先度高そう(というか緊急度高そう)なヤツあると思うんですけど。ちゃんと余白を作ってじっくり勉強する時間を持つ生き方がよいよなあ、というポエム残して終わりにします。