簡潔な答え
私はJava Bytecodeを使います。
長い答え
問題は、コンパイルする言語が高レベルになるほど、
- コンパイルプロセスが遅く、面倒なほど
- 柔軟性が増すほど
たとえば、C にコンパイルすると、C コンパイラ用の多くの可能なバックエンドを取得できます。Java バイトコード、LLVM IR、多くのアーキテクチャ用の asm などを生成できますが、基本的には 2 回コンパイルします。LLVM IR を選択すると、asm へのコンパイルの途中までは進んでいますが (LLVM IR の解析は、C などの言語の解析よりもはるかに高速です)、そこから Java バイトコードを取得するのは非常に困難です。ただし、どちらの中間言語もネイティブにコンパイルできます。
汎用プログラミング言語にコンパイルするよりも、何らかの中間表現にコンパイルする方が望ましいと思います。LLVM IR と Java Bytecode の間では、Java Bytecode を使用します。個人的には LLVM IR の方が好きですが、基本的に両方が必要だと書いているため、Java Bytecode を LLVM IR に変換することはできますが、他の方向は非常に難しい。
残っている唯一の困難は、言語を Java バイトコードに変換することです。これを簡単にするツールに関するこの関連する質問が役立つ場合があります。
最後に、Java Bytecode のもう 1 つの利点は、インタプリタとの相性が良く、ホットスポットのような JITter (またはトレース コンパイラ) を効果的に簡単に生成できることです。