Go言語でつくるインタプリタの写経完

ここ2~3ヶ月、twitterのTL上で言語処理系が話題が多かったので、言語処理系入門として写経しました。
言語処理系の流れを、テスト駆動で実装しながら理解できる良書です。

言語処理系書く場合、理論を学ぶことが必要だと感じました。
また、テストを足掛かりに、インクリメンタルに開発することの重要性が協調されており、その点も評価ポイントだと思います。
写経中にバグを作ってしまっても、すぐに解消することができました。

Go言語

昔、一度構文をざーっと眺めたことがある程度で、初めて書きました。
複雑な構文がなく、Go言語自体の解説自体は書籍内に全くないにも関わらず、スラスラ読めました。

合計4000行強を書いて、普段見かけるGo言語を好きな人、批判している人、双方の主張がちょっとだけ理解できました。

良いと感じた点

  • 複雑な構文がなく、愚直に書くので、読みやすい
  • コンパイル速い
  • レイアウトがフォーマッター任せで良いので、どうでも良いところで悩む必要がない

不満に感じた点

  • 個人で書くには冗長
  • 言語組込みのテストフレームワークでテスト書くの辛い

テストフレームワークについては、読むときに理解しやすいので、一概に悪い点というわけではないです。ただ、写経の間、テストを書くのは割と退屈な作業でした。
ajito fmのいつかの回で、assertionだけは外部パッケージ使いたい、ということが言われていた記憶があり、今なら少し理解できます。

Pratt構文解析

第2章構文解析、Pratt構文解析器の実装、が個人的には、一番面白かったです。
言語処理系技術は、大学時代に計算機言語論の講義と学生実験でちょろっとコンパイラ書いたくらいでした。
EBNFくらいしか知らなかったので、Pratt構文解析器を実装してみて、勉強になりました。

マクロシステム

実は、C言語のマクロしか知らなかったので、Rustマクロシステムの理解に苦しんでいました。
基礎となる考え方が同じものを作ることで、ずいぶん理解が進みました。

今後

Rustで再実装したいですね。

Go言語でつくるインタプリタ

Go言語でつくるインタプリタ