タイトルの通り、一通り実装を終えたので感想など。 www.oreilly.co.jp
全体的な感想
書籍全体を通して著者が語りかけるような文体であり、堅苦しさがなく、読んでいて楽しかったです。もともとの文章が良いのか、翻訳が良いのか、その両方なのかはわかりませんが、1つ実装を進めるたびに著者が褒めてくれます。例えば以下のように。
脱線してしまった。話を元に戻して、言わせてほしい。ついにやったぞ! いや、自覚はあるんだ。私が褒め言葉を使いすぎていることも、お祝いする理由をすぐに見つけてくることも。でも、シャンパンを開けるタイミングがあるとしたら、それは今だ。私たちのインタプリタに何ができるかをちょっと見てみよう。
p.141 条件分岐の評価を追えたあとのコメント
この雰囲気が楽しかったです。
インタプリタを自作するメリットを考える
プログラムに対するメタ的な思考を得られると感じました。メタ的な思考とは、自身の書いたプログラムがどのように解釈されるのかを意識するということです。理解するだけであれば自身の手で書く必要はないかもしれません。概念をいくつか知っておけば、インタープリターが何をしてくれるのかはすっとわかると思います。 一方、この書籍などを通じてしっかり作ると、もう一歩踏み込むことができます。 例えば以下のコードくらいであれば、解析できるイメージはすぐに湧きそうです。
let hoge = 100 * 2;
では以下のコードだとどうでしょうか?(monkey言語で動くコードです)
let hoge = 10;
let fuga = fn(x, y) {
let hoge = "end"
if (x > y) {
puts(hoge)
} else {
fuga(x + 1, y)
}
}
fuga(1, hoge)
変数の束縛とスコープ、ブロック、関数の再帰呼び出しなど、いずれも普段プログラムを書く際には必要なものですが、いざ自身でパースして評価できるかと言われると、難しそうです。この書籍ではここまで実装することができます(正直、僕は理解できていない部分もありますが汗)。
他にもlinterやformatterに対する想像力が深まります。というかプログラムを書いていれば、そこには必ずインタプリタやコンパイラが存在します。自身が書いたソースコードは、インタプリタやコンパイラを経てバイトコードや機械語に翻訳されて実行されます。その解像度を上げることはプログラミング自体を楽しくさせると思いました。
書籍の良いところピック
1. 適度にインクリメンタルである
「インタプリタを作る」と言われると大変な作業に感じます。実際この本は300ページほどあり、一朝一夕でできるものではありません。字句解析、構文解析といった言葉の意味や役割くらいは知っていても、いざ作るとなると進め方に途方がくれてしまいます。それくらい大きなものを作る際に重要なのは、作業を分割すること、そしてゴールへの道標を得ることです。この本はその両方を担ってくれます。例えばAST作成後の「評価」の章で最初にやることは「5を5と評価すること」です。これくらいの実装であれば、書籍がなくともできるかもしれません。一方でif-else構文やクロージャーのことを考えると僕は手が止まってしまいます。そこまで積み上げていけるようにこの書籍が導いてくれます。
また、一度にすべてを作らない点も良いなと感じました。具体的には、文字列(いわゆるstring)の解析ははじめできません。文字列解析がない状態で字句解析→構文解析→評価、までを一通り終えます。その後に文字列や配列などを足していきます。このときにあらためて字句解析からコードを追加することになります。このような進め方をすることによって、各章で同じ作業を繰り返す退屈さを排除し、また復習的にもなるのが良かったです。
2. テスト駆動で開発をする
テストを書くことが判明した際の正直な気持ちは「テストなんて書きたくない!」だったのですが、この書籍に関しては違いました。実際に記述する単体テストは難しいものではありません。だからこそ、単体テストとしての「設計のきれいさ」みたいなものは意識されていません。見る人によってはリファクタしたくなるかもしれないですが、あくまで分かりやすさ重視になっています。そして、テスト自体が仕様になっている点が重要です。ああなるほど、こういうものを今から実装するのね、とテストを見て理解できます。
3. 著者の遊び心を感じる
感想とも重なりますが、随所に著者の遊び心を感じます。
この書籍では実際に作った解析機や評価機の動作確認用のREPLを用意しますが、そのREPLでは無効な構文を入力するとお猿さんがでてきます。

...まぁこれの是非はさておき、楽しく実装を進めることができたと思います。僕はこのAAの作成時に最大の集中力を発揮しました。
終わり
最後にHello World!をmonkey言語で出力させるのは粋でした。
写経に専念して理解できていない箇所もいくつかあるのですが、なにはともあれ動く言語が作れたので、シャンパンを開けてお祝いしようと思います。
