https://www.amazon.co.jp/Language-Implementation-Patterns-Domain-Specific-Programming/dp/193435645X
Deep Learningの勉強を止めて、昨年末から読んでました。ようやく読み終えたので感想を。
どんな本
ANTLRの作者が作った、コンパイラのテクニックが載っている本です。本格的なコンパイラを作る手前の簡単なDSLを作れるようになるためのトピックとANTLRの考え方や実装について書かれています。Javaによる疑似コードも載っています。ただ、JavaよりはC++のスコープが良く題材にされるので、少しC++やったことがあるとわかりやすいと思います。時々、sedやawkのスクリプトが出てきて、パターンマッチングからアクションというのが、コンパイラの基本動作の一つであることを教えてくれます。面白いです。
どんな事がのってるの?
コンパイラので使われるアルゴリズムやデータ構造について広く浅く取り上げています。浅くと書いているのは、おそらくこの本だけではコンパイラを作るところまで行かないから。どちらかというと、いろんな選択肢を教えてくれる本です。個人的に一番、勉強になったのはASTをwalkするための話(Visitorパターンといういうらしい)でした。
例えば、(+ 1 2)のような構文ツリーを
+ DOWN 1 2 UP
のように移動順も含めて、1次元のテキスト情報にしてしまう方法なんかは感心してしまいました。(使い道はよくわからない)
普通にASTを作りきってからターゲットコードを作るパターンよりは、文法ファイルにパターンとアクションの組み合わせであったり、パターンと対応するテンプレートを書いてしまうやり方が多く紹介されています。もうちょっと言うとあまりEOFがでてこないです。これはネットワーク越しに取得するファイルのパースを意識しているからだと思います。順番にデータを取得していって、あるパターンにはまったところで何かの処理をするというケースが良くあるんじゃないでしょうか。最近のコンパイラはこうなっているという話では無く、ANTLRならこういう事がすぐできるよって事だと思います。あんまり文法ファイルに文法以外の事を書くのはちょっと嫌だと思うので、あくまで参考という形で読みました。
そういえば自分が作っているコキュートスも、大半はテンプレートからソースコードを生成しています。これは、僕の実力から考えてちゃんとしたものを作る時間が無く、一番手っ取り早いと思ったからそうしました。そんなに悪手では無いと言うことが分かって良かったです。
本文以外の所
この本は本筋から少し離れた所のトピックも楽しく読めました。コンパイラの本は堅いイメージがあるのでこういうの大事だと思います。
- 古い文法をサポートするgccのようなコンパイラで、オプションで文法が変わる仕組みをどう扱うか。
- 2009年にAndoroidのDralvik VMを作っていたDan Bornsteinを話したときの話
等、興味がある人は是非購入して読んでみて下さい。
お勧めの人
コンパイラの勉強をしようとして挫折した人にお勧めです。パーサーのところはすっ飛ばして読めます。全体的に面白いトピックを集めた本なので、読み物として楽しく読めます。ただ、これ一冊でつくりきるぞって本では無いので、あくまで副読本的な位置づけになると思います。ボリューム的に説明すっ飛ばしているところも結構ありそうです。