📘

文系卒エンジニアがどうやって独学でコンパイラを作ったか

2023/11/29に公開2

この記事の内容

コンパイラには興味があるが情報学科を出てないのでどう学べばいいか分からないといった人のヒントになるように、雑ですがメモを残しておきます。

高評価が多ければ、もうちょい詳しく書こうかなと思います。

自分の経歴

大学は文系を卒業し、建築関係の仕事をしている会社の事務職として就職しました。

入社2年目の途中からシステムの部署に移動してエンジニアになり、Ruby on Railsをちょろっと教えてもらいました。その後独学して副業先を見つけ、副業先のdigglueという会社に転職しCTOになっています。

作った言語

Javascript-- というJavascriptの下位互換言語を作りました。

Javascriptのsemicolon邪魔だろって思ったのでsemicolonなしでもコンパイルできます。(確か

classなどをサポートしてない単純な言語です。

作った動機

元々はウェブ上で動くいい感じのVisual Editorを持ったブログサイトを作りたくて、言語の予測補完の仕組を理解したく関係分野のコンパイラを作ってみることから始めました。

途中でZennやNotionが出てきて、自分の理想を体現しすぎていたのでEditorを作るモチベがなくなりました。

ただコンパイラの学習を中途半端に辞めるのは嫌だったので、コンパイラの勉強はそのまま続けています。単純に物事の仕組みを理解するのは楽しいです。

プログラミング言語を作れるようになるまでにやったこと

まず何もわからないので色々調べたのですが、 東大の情報学科のカリキュラムを見てみることから始めました。

右下の方に、コンパイラの設計と実装というコースがあります。

プロセッサ・コンパイラ実験
FPGAを用いたコンピュータシステムの
設計と実装、コンパイラの設計と実装

3年生のAセメスターでコンパイラを作るようなので、3年生のSセメスターの内容まで理解すれば作れそうなことが読み取れます。

これをヒントに色んな本を読んでみました。

その中で直接的に役に立った書籍を載せておきます。
それぞれさらっと読んだものと、熟読したものがあります。

直接的に役に立った本

  1. コンパイラ関係
    一番直接的にコンパイラが分かります

一番入門で全体像が分かるお勧め本

https://www.amazon.co.jp/コンピュータシステムの理論と実装-―モダンなコンピュータの作り方-Noam-Nisan/dp/4873117127/ref=sr_1_6?__mk_ja_JP=カタカナ&crid=24SZZKD277G9U&keywords=低レイヤー&qid=1701181570&sprefix=低レイヤ%2Caps%2C158&sr=8-6

これもいい

https://www.amazon.co.jp/gp/product/4320029224/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

https://www.amazon.co.jp/gp/product/432002382X/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

めっちゃ分かりにくいけどわかってくるとめっちゃコンパクトでいい

https://www.amazon.co.jp/gp/product/4274130134/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

https://www.amazon.co.jp/gp/product/432002382X/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

落丁だらけだけど落丁がないページはすごくいい。頑張って読むのが大事。

https://www.amazon.co.jp/gp/product/1292024348/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

  1. 形式言語理論
    なくてもいいけど、理論的に知ってた方が色々としっくりきます。

https://www.amazon.co.jp/gp/product/4627852711/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

https://www.amazon.co.jp/gp/product/4339024767/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

  1. 集合理論
    形式言語理論を読む時に、集合の基礎的な用語が分からないとしんどかったので読みました。
    今ならChat GPTで十分かも。

https://www.amazon.co.jp/gp/product/0486497089/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

作成期間

自分で取り入れた文法のプログラミング言語が動くようになるまで1年くらいかかり、コンパイラを理解した感じがしてくるまでが3年くらいかかりました。

次はyaccとlexをもうちょっとカジュアルな構文やDSLで記述できるようなものを作りたいと思っています。

学習の辛さなど

最初はエディターを作りたいというモチベで学習を始めたのですが、コンパイラの学習がどこまで直接的に関係するのかは分からず、またコンパイラを学んだ結果エディターを作れるようになるのかもよく分からなかったので結構しんどくなる時はありました。

その人の学習の目的などにもよりますが、合理的に考えると挫折する理由は無限に出てくるので、とにかくやり切るってことにピンを止めて、効率が悪かろうが必要かもしれないことは無駄かもしれなくても全部学ぶ心持ちはあったほうがいいかもしれません。

自分自身はeditorのソースコードを片っ端から読んでみる、大学の教科書をとりあえずいっぱい買ってみる、テキストの専門的な記述を理解するための数学の本を買う、何冊も読んでみて全体像を感じ取る、関係ありそうな分野を特定していく、といった感じで結構遠回りして大変でした。

振り返りなど

OSの仕組み、OSの作り方、コンパイラの作成、アセンブリ言語なども並行して学んでいて、今では色んなソフトウェアが一通り高いレイヤーから低いレイヤーまでうっすらイメージできるようになってきた感じがします。

コンパイラを学んでも役に立たないから無駄という批判の声もあると思いますが、プログラムの仕組みが見えている目になれること自体が最高の対価です。
(ちなみにコンパイラの仕組みを利用して入力を補助する入力フォームを実装したので自分は業務で使っています。)

Discussion

Nknight AMAMIYANknight AMAMIYA

凄いですね👏
自分も言語開発しているのですがなかなか難しいですがお互い頑張りましょ( ̄▽ ̄;)

Kuuubo@digglueKuuubo@digglue

ありがとうございます!

言語開発楽しいですが、大変な部分も沢山ありますよね
頑張りましょう!