私は大学でコンパイラのコースを受講しましたが、大変勉強になりましたが、とても勉強になり、とても楽しかったです。実装する言語仕様が与えられたので、私があまり学ばなかったのは言語設計でした。私は今、楽しみのために簡単なおもちゃの言語を作成することを考えています。これにより、さまざまな言語設計の原則を試したり実験したりできます。
まだ決めていないことの 1 つは、コンパイラに出力させたい言語または形式です。理想的には、使いやすく、デバッグ用の機能も備えた仮想マシン用のバイトコードを出力したいと考えています (たとえば、実行を一時停止して、いつでもスタックを確認できるなど)。しかし、私の空想はまだです。私が探しているもののアイデアを提供するために、私が検討したいくつかのオプションと、それらの長所と短所を以下に示します。
テキスト形式の x86 アセンブリ言語を出力してから、NASM や FASM などのアセンブラを呼び出すことができました。以前のコンパイラ作業は VM 上で行われていたため、これにより、実際のハードウェア用にコンパイルする経験が得られます。gdb を使用して生成されたプログラムをデバッグすることはおそらく可能ですが、デバッグをサポートする VM を使用するほど簡単ではないかもしれません。これの主な欠点は、x86 アセンブリの経験が限られていることと、CISC 命令セットとして少し気が遠くなるということです。
JVM や Lua 仮想マシンのような一般的な仮想マシンのバイトコードを出力できました。これらの長所と短所は、選択した特定の VM によって異なる可能性がありますが、一般的に、ここで見られる欠点は、将来のプロジェクトへの適用が制限される可能性のあるバイトコードを学習する必要がある可能性があることです。また、どの VM が自分のニーズに最も適しているかもわかりません。
大学でこの目的のために特別に設計された、私のコンパイラ コースで使用したのと同じ VM を使用できました。私はすでにその設計と命令セットに精通しており、まともなデバッグ機能を備えているので、それは大きなプラスです. ただ、機能が極端に限られていて、そこそこ高度なことをやろうとするとすぐに限界にぶつかってしまう気がします。
LLVM を使用してLLVM Intermediate Representationを出力できます。 LLVM IR は非常に強力なようで、これに慣れていれば、将来必ず役に立ちます。一方で、作業とデバッグがどれほど簡単かはまったくわかりません。そのため、その分野の経験者からのアドバイスをいただければ幸いです。
独自の仮想マシンを設計して実装できました。 これには大きな明らかなマイナス面があります。基本的に、プロジェクトを2 つのプロジェクトに分割することになり、実際に何かを成し遂げる可能性が大幅に低下します。ただし、必要な言語機能を「ファースト クラス」でサポートする VM を作成できるという点で、それでもいくらか魅力的です。たとえば、Lua VM はテーブルをファースト クラスでサポートしているため、簡単にLua バイトコードでそれらを操作します。
要約すると、私は比較的習得しやすく、操作しやすく、デバッグしやすい VM またはアセンブラーを探しています。これは趣味のプロジェクトであるため、理想的には、二度と使用しないツールや言語の学習に多くの時間を費やす可能性を最小限に抑えたいと考えています. ただし、この演習から得たい主なことは、言語設計の複雑さを直接理解することです。そのため、比較的迅速な実装を容易にするものは何でも優れています。