コンパイラ作成の一番の参考書、ドラゴンブックとしても知られる『Compiler: Principles, Techniques, and Tools』(邦訳『コンパイラ―原理・技法・ツール』)が出版されたのは、1986年のことだ。Channel 9のインタビューで、Turbo Pascal、Delphi、C#、TypeScriptで有名なAnders Hejlsberg氏は、現在のコンパイラ作成が30年前のやり方とどう違うのか説明した。
古典的なコンパイラの大きな特徴は、入力をシーケンシャルに処理することだ。それは主要なコンポーネントのパイプラインのように見える。
Lexer -> Parser -> Type Checker -> Code Generator -> Emitter
この10年で、IDEとツールは、自動コンパイル、リファクタリング、コードナビゲーション、静的解析といった機能を提供することが期待されるようになった。Microsoftのユーザー調査によると、これらの機能は、入力に対して100ms以下の遅延で応答することが求められるという。さもないと、遅すぎると感じるようだ。これは、中規模サイズで1分以上かかることのあるプロジェクト全体のコンパイル時間とは大違いだ。
IDEの高速なフィードバックを実現するためには、コンパイラがリアルタイムで実行できるよう、処理をできるだけ限定する必要がある。したがって、キーを押すたびにプログラム全体をコンパイルする、というのは選択肢にならない。代わりに、コンパイラはユーザーに答えを提供するのに必要十分な情報を用意する。
高速な応答は、処理を限定するとともに、古いデータ構造をできるだけ再利用することで実現される。ユーザーが文字をタイプするたびに、メモリにあるデータ構造は消去されると考えるが、応答性を高めるために、変更されていないものを全て再利用するのだ。例えば、AST(Abstract syntax trees、抽象構文木)では、それが表現するソースファイルが変更されていなければ、再利用することができる。
データ構造が変更されても、再利用は可能だ。イミュータブルな永続的データ構造では、変更されていない部分を保持したまま、新しいインスタンスを生成して返すことにより、変更を取扱うことができる。ASTにとって、これは現在のノードとルートまでの上位ノードを変更することを意味する。残りの構文木は同じまま、新しいインスタンスの構築に再利用できる。
数年前より、IDEがリアルタイムに提供する機能のため、C#コンパイラとIDE機能実装との間でコードが重複するようになった。このことはRoslynを作った大きな理由のひとつだった。Roslynは最初から、コマンドラインだけでなくIDEからも使えるよう設計されている。
最後にAnders氏とSeth氏は、現代のコンパイラ作成について学ぶためのリソースについて話した。彼らは例としてRoslynとTypeScriptプロジェクトを挙げた。どちらもオープンソースで、GitHubから入手できる。
Rate this Article
- Editor Review
- Chief Editor Action