この投稿が古いことは承知していますが、見落としていた点があるため、議論に少し追加できると思いました。したがって、将来の読者はこれが役立つと思うかもしれません。
誰もがここで要点を見逃しているのだろうか。ほとんどすべての種類のコンパイラ、インタープリター、または仮想マシンを、ほぼすべての言語で作成できます。C を使用して C コンパイラを作成する場合、新しいコンパイラをコンパイルするには C コンパイラが必要です。ただし、出力は、指定されたプラットフォームで実行されるネイティブ コードです。JVM が JVM で実行される言語で記述されているからといって、出力が JVM で実行されるコードにならなければならないというわけではありません。たとえば、C、Basic、Pascal コンパイラ、さらにはアセンブラを Java で作成できます。この場合、コンパイラまたはアセンブラを作成するために JVM が必要になりますが、最初のコードがネイティブ コードになった場合、JVM は不要になる可能性があります。もう 1 つの方法は、入力言語を受け取り、それをネイティブの機械語に変換するトランスレーターを作成して、言語 A でプログラムを作成し、それを言語 B にコンパイルしてから機械語コードにコンパイルすることです。マイクロコントローラーの世界では、これをよく見かけます。誰かが Basic または Java でプログラムを書きたいと思っているので、Basic/Java コンパイラを書いて、既存の C コンパイラ用の C コードを生成します。次に、結果の C コードは、ネイティブの Basic/Java コンパイラを提供する機械語にコンパイルされます。通常、このアプローチは、Basic/Java コンパイラをマシン コードで直接記述するよりも簡単です。誰かが Basic または Java でプログラムを書きたいと思っているので、Basic/Java コンパイラを書いて、既存の C コンパイラ用の C コードを生成します。次に、結果の C コードは、ネイティブの Basic/Java コンパイラを提供する機械語にコンパイルされます。通常、このアプローチは、Basic/Java コンパイラをマシン コードで直接記述するよりも簡単です。誰かが Basic または Java でプログラムを書きたいと思っているので、Basic/Java コンパイラを書いて、既存の C コンパイラ用の C コードを生成します。次に、結果の C コードは、ネイティブの Basic/Java コンパイラを提供する機械語にコンパイルされます。通常、このアプローチは、Basic/Java コンパイラをマシン コードで直接記述するよりも簡単です。
何年も前に、6800 および Z80 マイクロのアセンブリ コードを生成する BasicA および GWBasic プログラムを作成しました。私のポイントは、出力が入力またはターゲットと同じものである必要はないということです。IE Java で JVM を作成しているからといって、最終結果を Java JVM で実行する必要があるわけではありません。