Java 1.6以降、JVMはJavaだけでなく、無数のプログラミング言語を実行できます。JavaがJava VM上で実行される方法を概念的に理解していますが、他の言語がJava VM上で実行される方法は理解していません。私には、それはすべて黒魔術のように見えます。私が指摘する記事はありますか?これにより、すべてがどのように組み合わされるかをよりよく理解できますか?
Java 1.6以降、JVMはJavaだけでなく、無数のプログラミング言語を実行できます。JavaがJava VM上で実行される方法を概念的に理解していますが、他の言語がJava VM上で実行される方法は理解していません。私には、それはすべて黒魔術のように見えます。私が指摘する記事はありますか?これにより、すべてがどのように組み合わされるかをよりよく理解できますか?
回答:
キーは、JVMのネイティブ言語であるJavaバイトコードです。JVMが理解できるバイトコードに任意の言語をコンパイルできます。これに必要なのは、バイトコードを出力するコンパイラーだけです。それ以降、JVMの観点から違いはありません。コンパイル済みのScala、Clojure、Jythonなどのクラスファイルを取得し、逆コンパイルすることができます(たとえば、JADを使用して)通常のJavaソースコードに。
詳細については、次の記事/スレッドをご覧ください。
Java 5または6 JVMの根本的な変更を認識していません他の言語で(コードをコンパイルして)実行できるようにする、または簡単にすることを。私の理解では、JVM 1.4はJVM 6とほぼ同じくらいの能力を備えていました(ただし、違いがあるかもしれません。私はJVMの専門家ではありません)。10年前半に人々が他の言語やバイトコードコンパイラの開発を始めたのは、Java 6が公開された2006年頃に結果が現れ始めた(そして広く知られるようになった)だけでした。
ただし、これらすべてのJVMバージョンにはいくつかの制限があります。JVMは本質的に静的に型付けされており、リリース7までは動的言語をサポートしていませんでした。これはinvokedynamic
、動的な型チェックに依存するメソッド呼び出しを可能にする新しいバイトコード命令の導入により変更されました。
JVMなどの仮想マシンは、入力、通常はファイル、一連の単純な命令(通常は実際のCPU命令に簡単に変換できます)を受け取り、実際にネイティブCPU命令としてコンパイルして実行するプログラムです(通常はHotSpotやJITなどのオンデマンドコンパイラ)。
それは本質的に抽象化の層です。通常、VM命令セットの実装をさまざまなプロセッサアーキテクチャに移植する方がはるかに簡単です。これは、いくつかの類似点(スタックベースなど)があるためです。また、さまざまなプログラミング言語をVM命令に移植する方がはるかに簡単です。これは、プリミティブなCPU命令よりも現代のプログラミング言語に向いているためです。JVMやCLR(.NET)などの多くの仮想マシンには、仮想メソッドを呼び出し、オブジェクトインスタンスを作成するための指示が含まれています。
それでは、たとえば言語を見てみましょう。MyLanguageと呼びます。プログラミング言語であるため、最終的にはいくつかのCPUアーキテクチャ命令のセットにコンパイルされます。つまり、互換性のある柔軟な仮想マシンの命令セットがあれば、MyLanguageをそのVMの命令セットにコンパイルすることも可能です。
VM命令セットでネイティブに行う必要のない回避策をハッキングする必要があるかもしれませんが、それでも可能性があるため、常に効率の問題があります。
JVMはチューリング完全なコンピューティングマシン(限られたメモリを除く)であり、チューリング完全なマシン(物理または仮想)はあらゆるプログラミング言語を実行できます(メモリ、パフォーマンス、物理IOの制限を除く)。