kitak.blog

Kみたいなエンジニアになりたいブログ

Create Your Own Programming Language を読んだ

Create Your Own Programming Language を読んだ。

どこかで、CoffeeScript の作者はこの本がきっかけで CoffeeScript を作った、と紹介されていて気になっていた。

この本では、言語処理系について学びながら、PythonRuby を足して2で割ったような Awesome という言語を Ruby で実装する(最後の章では mio という Io のサブセットを実装する)。 目次を見ると、たったの100ページに字句解析、構文解析、ランタイム、インタプリタ仮想マシン、ネイティブコンパイルといったプログラミング言語をつくるために必要な知識・技術が詰まっていて、非常に濃い。

学生のときに言語処理系の講義をとったのだけど、半期で、全体の概要を学んで、lex とか yacc をちょっと使ってみておしまい、というかんじで実際に手を動かすことも少なく、言語処理系に対する理解がぼんやりしたものになっていた。
社会人になってみて、「言語処理系を作ることで得られるものは多い」と色々な人が本やインタビューで述べているし、個人的な実用に目を向ければ、JavaScript 関係のツールの多くが何かの言語を別の言語に変換したり(CoffeeScript, Babel, TypeScript, ...)、AST を扱っている(ESLint, unassert, power-assert, ...)。
ということで、ここらでひとつ学び直すか、という気持ちになった。

簡単な英語で書かれているのと、ソースコードが多いので、1章、大体1~2時間で読める(サンプルコードの写経・デバッグ含む)。自分の場合は、帰宅途中にカフェに寄って1日1章を目安にちょっとずつ進めて、大体1週間で読み切った。

読んだ感想として、コンパイルのフェーズが具体的に何をおこなっているか、各フェーズで世の中で利用されているツール(例えば字句解析であれば lex とか)の紹介、仮想マシンの必要性などを丁寧かつ細部に立ち入り過ぎずに解説している良書だと感じた。
たしかにこれ一冊読めば、(最適化や効率の良い実装は置いておいて)自分のプログラミング言語をなんとか作ることができる能力が身につくし、次のステップとして、これよりも固い・厚い本を読むための足がかりになりそう。

作るプログラミング言語の仕様や実装は Ruby自身のそれに影響を受けているので、事前に メタプログラミングRuby に書かれているぐらいの Ruby の知識があると読みやすいのではないかと感じた。