コンパイラの実装言語にあると良い機能
構造体とか配列とかどんな言語にも大体あるものは除きます。あくまで私の主観です。
- lex/yacc/gperfなどのツール
- 特にyaccがないと複雑な言語のパースは大変。
- バリアント
- 構文木の表現に一番適していると思う。
- パターンマッチ
- コンパイラ内部はパターンマッチだらけ。
- テーブルジャンプを用いた高速な実装ならなおよし。
- ハッシュテーブル
- 名前の管理。必須。
- バイナリ処理
- バイナリファイル触るならもちろん。
- ビットベクトル・ビット行列
- フロー解析で必須。フロー解析に基づく最適化をするなら。
- 高速な集合演算があると良い。
- SetやDisjoint Setなどのコンテナ
- 最適化の実装で使う。Disjoint Setはエイリアス解析で主に使う。もしやるなら。
- グラフ
- GC
- Pretty Printer
- 例外機構
- 入り組んでるので、あった方が楽かも。
- テストツール
- ないよりはあった方がいい。
大体こんなところだと思います。なければ自分で作る必要があります。
おまけ:あまりいらない機能
- オブジェクト指向
- 内部で使うコンテナを作るくらいの目的でしか使わない
- 構文木をクラスと継承で実装するのは面倒
- 遅延評価
- 参照透過性
- 破壊的代入沢山使います
- クロージャとか継続とか
- あってうれしい場面は少ない
具体的な言語について。自分がコンパイラ実装に使ったことあるものに関して。
- C/C++
- Java
- Haskell
- パターンマッチが非常に使いやすい。
- コンパイラはメモリを沢山使うのでつらい。
- フロー解析に基づく最適化はあきらめた方が良い。
- 破壊的代入を沢山使うバックエンドは書きにくいし遅い。
- alex/happyは使いやすい。
- HughesPJ(pretty printer)が非常に使いやすい。
- OCaml
- 速度面・機能面共に最もバランスが良いと思う
- ocamlyacc/ocamllex使いやすい
- Format(pretty printer)はちょっと奇妙だし使いにくいと思う。面白いけど。
- Ruby
- アセンブリ
- 実は、機能が貧弱な分欲張らないのでサクサク作れてバグも全然出なかった。
- もちろん大きなコンパイラは無理。