構文解析は、十分に研究されていますが、コンパイルの最も重要でない部分です。(例外:独自の具体的な構文を設計していて、言語を継続的に改良および変更しています。)
Yacc、Bison、およびその仲間たちは、64Kのメモリを搭載したマシンの時代のために設計されました。メモリが限られているマシンで高速に実行するのに最適です。しかし、文法をLALR(1)形式に強制するために必要な人間工学の量は、今日ではばかげています。Ira Baxterは、GLRがおそらく最高の、最も柔軟な解析テクノロジであるということは正しいですが、PEG(Parsing Expression Grammars)も優れています。どちらの場合も、人間工学は古いツールよりも光年進んでいます。
解析を却下したので、今度は別のテクノロジーフードファイトを開始します:-)コンパイルは、最終的にアセンブリコードまたはマシンコードに到達するまで、プログラムをあるフォームから別のフォームに何度も書き直すことで構成されます。この種の問題では、CまたはC++を実際には使用したくありません。
Q :(デイブハンソンがクリスフレイザーと一緒にlccに関する素晴らしい本を出版したときに尋ねられました)「あなたとクリスは、これまでに作られた中で最も注意深く設計されたコンパイラの1つであるかもしれないものを構築するのに10年を費やしました。あなたは経験から何を学びましたか?」
A:「まあ、Cはコンパイラを書くのにひどい言語です。」
HaskellやStandardMLなどの人気のある関数型言語の1つを試してみることをお勧めします。この分野で働く人々は、コンパイラーが関数型言語の「キラーアプリ」であると広く信じています。代数的データ型とパターンマッチングは、抽象構文を中間コードから機械語に書き込むためにカスタマイズされています。これらのテクニックの力を見るのに良い場所は、AndrewAppelの本CompilingWithContinuationsです。(Appelのコンパイラの教科書もよく読まれており、非常にエレガントなデザインですが、なぜデザインがそのようになっているのかを常に説明しているわけではありません。)