どんな本?
RubyでつくるRuby ゼロから学びなおすプログラミング言語入門(紙書籍)www.lambdanote.com
言語処理系の実装を体験するための本。 言語処理系の実装はパーサの実装が面倒臭くて、大抵の人はそこで力尽きます。 そこで、パーサは著者の方が用意しておいて、構文木の解釈だけを読者が実装するスタイルです。
ところで著者の方は
NES(ファミコン)のエミュレータを ruby で書いた、Rubyハッカーの方です。 さらに
個人的に盛り上がってきたので、そこから 1 週間で全 8 回(当時)の原稿をすべて書き上げました
130ページの本の第1稿を1週間で書いたとか、ちょっと意味わかんないです・・・(汗
どんな縁?
咳マニアなので、Tochigi RubyKaigi 07 に参加しました。 そこで「RubyでつくるRuby」読書会があったので、読み始めました。
「RubyでつくるRuby」にサインもらえたし、読書会も面白かった。木を走査する関数の実装が簡単になるデータ構造にたどり着くように、関数を説明する前に、頑張って丁寧に説明しているのが面白かった。一人で読んでも気づかなかったと思う。 #toruby pic.twitter.com/vkgPe3bmlX
— ぎゃばんV8!V8! 怒りのデスロード (@ledsun) 2017年8月27日
サインももらえました!やったね!!
何をした?
一通り読んだ後に、インタプリタのソースコードの最終形を写経して動かしてみました。 120行に満たないRubyのソースコードを打ち込んだだけで、インタプリタが動いた!すごい!(そういう趣旨の本です)
淡々と条件分岐を打ち込んでいくのは、正直、面倒臭い作業でした。 パーサ部分を実装していないのに、この面倒臭さ!言語処理系の実装は大変ですね。
既存のRubyのソースコードをいくつか試したら、動かないものもありました。 たとえばArray#starts_withを使っているソースコードです。 組み込みライブラリが入っていないので当然ですね。 まともに言語処理系を作るには、パーサ加えて、組み込みライブラリも必要です。 ますます大変ですね。
最終形を写経するだけでは、どういうことを考えながら判断しながら言語処理系を実装していくのかは、あまり理解できませんでした。 もうちょっとゆっくり、手順を守って実装してみたほうが良いかもしれません。
次に何をしてみる?
JavaScriptで同じようなことをしてみようと考えると、JavaScript界ではASTの定義やパーサライブラリは整っています。
Esprimaで作ったASTを使ってJavaScript(のサブセットの)インタプリタを実装すれば、言語処理系実装への理解がもうちょっと進みそうです。