valid,invalid

関心を持てる事柄について

#builderscon 「コンパイラをつくってみよう」に触発されてRubyでも書いてみた

builderscon 2019 で @DQNEO さんが コンパイラをつくってみよう / How to make a compiler - Speaker Deck という発表をされていた。ライブコーディングの緊張感と会場の一体感もすごかったが、そのうえ自分はプレゼンの中で言及されていた想定聴衆にストライクだったためとても楽しんだ。*1

「どの言語でどの言語のコンパイラを書いてもよい」「学んでから作るのではなく作りながら学ぶ」という言葉が刺さったのでさっそくRubyで実装してみた。今回の発表のために用意されたレポジトリのcommit logを一つ一つ読み、bashからの実行を小さく小さく繰り返しながら進めること1時間半ほどで、四則演算ができる程度の極小コンパイラが書けた。

github.com

実は過去に『RubyでつくるRuby ゼロから学びなおすプログラミング言語入門』を読んでRubyインタプリタ実装についてわかった気持ちになったことがあるのだがそちらではtokenizeやparseの実装はスキップしていた*2ので、今回その辺をかじることができて足りなかったピースがハマった感覚があってよかった。*3

また、発表の質疑応答にて「次に何を実装するのが良いでしょうか?」という質問に対し「if、for、関数あたり」とのこと。まさに同書の知識+未知の部分で学びが多そうなので続きをやっていきたい。

その他の感想:

  • コンパイラ実装においてはとにかく型が欲しい気持ちがすごいので型がある言語でも書いてみたい
  • Golangとの違いを意識しながら書けたのが面白かった
  • Rubyで書き上げることを目標にしたがリファクタリングの余地がだいぶあるので設計を考えてみたい
  • 特にRuby 2.7のパターンマッチを使ってすっきり書けるところはあるかも
RubyでつくるRuby ゼロから学びなおすプログラミング言語入門
遠藤 侑介
ラムダノート
売り上げランキング: 451,219

*1:発表に関するまとめはクラスメソッド社の [builderscon 2019 レポート] コンパイラを作ってみよう #builderscon | DevelopersIO が詳しい

*2:書籍のやり方に従うとminruby_parseというgemを使うことになる。もちろん自分で書くチャンスも無限にあるがそのスキルがなかった

*3:よかった…が、こういうの皆さん大学でやってきているのかな〜、はぁ〜〜〜と思うと改めてビハインドを感じるのでやっていくしかない