Java Virtual Machineは、他の言語で記述されたコードをどのように実行しますか?


12

Java 1.6以降、JVMはJavaだけでなく、無数のプログラミング言語を実行できます。JavaがJava VM上で実行される方法を概念的に理解していますが、他の言語がJava VM上で実行される方法は理解していません。私には、それはすべて黒魔術のように見えます。私が指摘する記事はありますか?これにより、すべてがどのように組み合わされるかをよりよく理解できますか?


2
Intel / AMD / Solaris(??)プロセッサがネイティブアセンブリコードにコンパイルできる「任意の言語」を実行できるのと同じように(実際には言語は実行しませんが、ここではフローを実行します)。
Apoorv Khurasia

13
実は、JVM Javaを実行していません。明確な(ただし、Javaコンパイラが意図的に簡単に作成できる)より低レベルの言語を実行します。

それは本当です。しかし、JVMはバージョン6から他の言語の実行を開始しました。バージョン1.4.2では、PythonまたはGroovyを実行できませんでした(または誰も実行しませんでした)。どうしてこんなことに?変化したこと?
ポマリオ

@delnanまたは、「javacプログラムがJavaコードからビルドする方法を知っている、より低レベルの実行モデル」。
Apoorv Khurasia

9
@Pomario Jythonはしばらくの間存在しています。そして、このページには、Jythonスクリプトは、1.4.2で実行できることを示唆しているようです。
Apoorv Khurasia

回答:


23

キーは、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、動的な型チェックに依存するメソッド呼び出しを可能にする新しいバイトコード命令の導入により変更されました。


8
JVMが動的言語を「サポート」していなかったというのは、正確には真実ではありません。彼らは深刻な欠点を抱えた回避策を使用する必要がありました。
マイケルボルグワード

3
@ MichaelBorgwardt、v7より前のJVMが動的言語を(ある程度)許容していたことに同意できますか?:-)
ペテル・トレック

1
それはそれを置く良い方法です:)
マイケルボルグワード

3

JVMなどの仮想マシンは、入力、通常はファイル、一連の単純な命令(通常は実際のCPU命令に簡単に変換できます)を受け取り、実際にネイティブCPU命令としてコンパイルして実行するプログラムです(通常はHotSpotやJITなどのオンデマンドコンパイラ)。

それは本質的に抽象化の層です。通常、VM命令セットの実装をさまざまなプロセッサアーキテクチャに移植する方がはるかに簡単です。これは、いくつかの類似点(スタックベースなど)があるためです。また、さまざまなプログラミング言語をVM命令に移植する方がはるかに簡単です。これは、プリミティブなCPU命令よりも現代のプログラミング言語に向いているためです。JVMやCLR(.NET)などの多くの仮想マシンには、仮想メソッドを呼び出し、オブジェクトインスタンスを作成するための指示が含まれています。

それでは、たとえば言語を見てみましょう。MyLanguageと呼びます。プログラミング言語であるため、最終的にはいくつかのCPUアーキテクチャ命令のセットにコンパイルされます。つまり、互換性のある柔軟な仮想マシンの命令セットがあれば、MyLanguageをそのVMの命令セットにコンパイルすることも可能です。

VM命令セットでネイティブに行う必要のない回避策をハッキングする必要があるかもしれませんが、それでも可能性があるため、常に効率の問題があります。


3

JVMはチューリング完全なコンピューティングマシン(限られたメモリを除く)であり、チューリング完全なマシン(物理または仮想)はあらゆるプログラミング言語を実行できます(メモリ、パフォーマンス、物理IOの制限を除く)。


えーと...どうしてコンパイラが必要なの?;-)
ペテル・

コンパイラーおよびインタープリター自体は、Turingマシン上で(おそらくゆっくり)実行できます。おそらく、いくつかの事前コンパイル/翻訳手順は、特定の言語で特定のプログラムを実行するパフォーマンスを向上させることができますか?
hotpaw2

1
私のポイントは、「チューリング完全なマシン(物理または仮想)はすべてのプログラミング言語を実行できる」という文言は、私のラップトップのx86 CPUが現在作業中のこの素晴らしいJavaソースファイルを直接実行できることを意味します。または、PowerPCプロセッサのマシンコード。コンパイラなし-CPUにはコンパイラが含まれていませんか?:-)
ペテル・トレック

あなたの「マシン」は単なるCPUではありません。
hotpaw2

1
@PéterTörökあなたの主張がわかります。彼は私たちのようにVMについて詳しく説明しませんでした。しかし、私は彼の答えがまだOPの質問に簡潔に答えていると思います。JVMは、チューリングが完了しているため、あらゆるプログラミング言語を「実行」できるため、他のプログラミング言語を「実行」できます。精巧ではないかもしれませんが、それでも簡潔で有効なポイントです。:)
ヤムマルコビッチ

2

しばらくの間、JVMをx86のような独自の命令セットを備えたプロセッサと考えてください。プロセッサは、機械語にコンパイルされたCコードを実行できます。JVMに同じ類推を適用すると、他の言語がJVMのマシン命令にコンパイルされている場合、他のプロセッサと同様にJVMで他の言語を実行できます。JVMは、言語Xに対してこれらの命令を実行できます。


あなたのアナロジーはいいものです
コビ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.