JVMはコンパイラですか、それともインタプリタですか?


83

JVMについて非常に基本的な質問があります。それはコンパイラですか、それともインタプリタですか。

インタプリタの場合、JVM内に存在するJITコンパイラはどうですか?
どちらでもない場合、JVMとは正確には何ですか?(バイトコードをマシン固有のコードに変換するというjVMの基本的な定義などは必要ありません)


16
JVMは仮想マシンです。Bytcodeが入ると、プログラムの観察可能な効果が発生します。それ以外はすべて実装の詳細です。

1
はい、「the」JVMはありません。仕様には複数の実装があります。
paxdiablo 2011年

@delnan、答えとして書いてください。私は本当にそのような答えに賛成したいと思います。
aioobe 2011年

@aioobe:私はしません。ここで尋ねられた質問に答えるとは思いません-それは非常に有用な視点ですが、質問(タイトルと投稿に明確に記載されています)はこれらの実装の詳細を明示的に要求します。

けっこうだ。私はそれが言うと思いますですへの答え「どちらも、そして正確に何されていない場合はJVM?」しかし一部。(Java仮想マシンは実装というよりも仕様です。)
aioobe 2011年

回答:


170

まず、次の用語について明確に考えてみましょう。

JavacisJavaコンパイラ-Javaコードをバイトコードにコンパイルします

JVMJava仮想マシンです-バイトコードを実行/解釈/ネイティブマシンコードに変換します

JITis Just In Timeコンパイラ-ネイティブで実行する前に、実行に指定されたバイトコード命令シーケンスをマシンコードにコンパイルします。主な目的は、パフォーマンスを大幅に最適化することです。

それでは、あなたの質問に対する答えを見つけましょう。

1)JVM: is it a compiler or an interpreter? -回答:通訳

2)what about JIT compiler that exist inside the JVM? -回答この返信を完全に読んだら、おそらく今それを知っているでしょう

3)what exactly is the JVM? -回答:

  • JVMは、RAM上に存在する仮想プラットフォームです
  • そのコンポーネントであるクラスローダーは、.classファイルをRAMにロードします
  • JVMのバイトコードベリファイアコンポーネントは、コードにアクセス制限違反があるかどうかをチェックします。(これは、Javaが安全である主な理由の1つです)
  • 次に、Execution Engineコンポーネントは、バイトコードを実行可能なマシンコードに変換します

これがお役に立てば幸いです。


あなたは、JVMがバイトコードをネイティブマシンコードに変換すると言います。ここで「翻訳」という用語が正しいかどうかはわかりません。
Koray Tugay 2015年

高く評価。コンパイルと解釈、バイトコードとm / cコードの違いについての私の疑問はほぼ解消されました。あなたの答えは、バイトコードがインタプリタによってマシンコードに変換され、コンパイラがソースコードをバイトコードに変換することを教えてくれました。
ハーシマー2016年

2
また、ネイティブコードとは何ですか?機械語ですか?私はこのコンパイルと解釈のプロセス全体を学ぼうとしていますが、これらの中間用語は非常に混乱しています。
ハーシマー2016年

6
つまり、JVMとJITはどちらも、バイトコードをプラットフォーム固有のマシンコードに変換します。では、両者の違いは何でしょうか。大まかに説明していただけますか?
aditya 2016

6
「バイトコードをネイティブマシンコードに実行/解釈/変換する」は意味がありません。それはどちらかの「実行/解釈」または「ネイティブのマシンコードに変換バイトコード」。同時に両方ではありません。
ローン侯爵2017

32

それは両方のほんの少しですが、伝統的な意味ではどちらでもありません。

最新のJVMはバイトコードを受け取り、最初に必要になったときにネイティブコードにコンパイルします。この文脈での「JIT」は「ジャストインタイム」を意味します。これは外部からのインタプリタとして機能しますが、実際には舞台裏でマシンコードにコンパイルされています。

JVMは、ソースコードをバイトコードにコンパイルするJavaコンパイラと混同しないでください。したがって、それを「コンパイラ」と見なすことは有用ではありませんが、バックグラウンドで何らかのコンパイルを行うことを知っておくのは有用ではありません。


8
@NaeemShah:この回答が気に入って、ほぼ一言一句、自分の名前でブログ投稿にコピーできることをうれしく思います。そして、あなたにはそうする権利がありますが、StackOverflowのライセンススキームでは、ここに帰属を返すことが法的に義務付けられており、同じライセンスでブログ投稿のライセンスを取得する必要があります。次のライセンスにリンクしているこのWebサイトのフッターを参照してください:creativecommons.org/licenses/by-sa/3.0。このブログ投稿も参照してください:blog.stackoverflow.com/2009/06/attribution-required
Mark Peters

8

同様@delnanすでにコメント欄で述べたように、それはいませんどちらも

JVMは、Javaバイトコードを実行する抽象マシンです。

JVMにはいくつかの実装があります。

  • HotSpot(インタープリター+ JITコンパイラー)
  • Dalvik(インタプリタ+ JITコンパイラ)
  • ARTAOTコンパイラ+ JITコンパイラ)
  • GCJ(AOTコンパイラ)
  • JamVM(インタプリタ)

...そして他の多くの

JVMについて話すときの他のほとんどの回答は、HotSpotまたはJVMを実装するための上記のアプローチのいくつかの組み合わせのいずれかを参照しています。


1
ARTもインタプリタである:「Androidは、実際に実行することができ.dex、直接解釈またはジャストインタイム(JIT)コンパイル...を経由してコードを」source.android.com/devices/tech/ota/ab/...
イルファン・ラティフ

5

両方です。それはバイトコードを解釈することから始まり、(それが価値があると判断した場合)次にそのバイトコードをネイティブマシンコードにコンパイルすることができます。


あなたはおそらくHotSpotを参照しています
cubuspl 4219

5

それは両方です。バイトコードを解釈し、ネイティブコードにコンパイルできます。


0

他の人が言っているように、それは両方です!あなたが見ることができるよりも詳細にそれを参照したい場合:このIBMの説明


0

Javacはコンパイラですが、従来のコンパイラではありません。コンパイラは通常、実行のためにソースコードをマシンレベルの言語に変換します。これはシングルショットで実行されます。つまり、コード全体が取得され、ONCEでマシンレベルの言語に変換されます。(これについては以下で詳しく説明します)。一方、JavaCはそれをマシンレベルの言語ではなくバイトコードに変換します。

JITはJavaコンパイラですが、インタプリタとしても機能します。一般的なコンパイラは、すべてのコードをソースコードからマシンレベルの言語に一度に変換します。代わりに、JITは行ごとに実行され(行ごとの実行はインタープリターの機能です)、JavaCによって生成されたバイトコードをマシンレベルの言語に変換して実行します。JITを含むJVMには複数の実装があります。ホットスポットは、Javaプログラミングの主要なものの1つです。ホットスポットの実装により、JITは、反復するコードのチャンクを一度にマシンレベルの言語に変換することで実行を最適化し(上記のコンパイラのように)、コードの各行を1つずつ変換する代わりに高速に実行できるようにします。コンパイラとインタープリターの典型的な定義に関して、答えは白黒ではありません。

これは、いくつかのオンライン回答やブログなどを読んだ後の私の理解です。誰かがこの理解を向上させるための提案を持っている場合は、遠慮なく提案してください。


-5

JVMには、コンパイラとインタプリタの両方があります。コンパイラがコードをコンパイルしてバイトコードを生成するためです。その後、インタプリタはバイトコードをマシンが理解できるコードに変換します。

例:プログラムを作成してコンパイルすると、Windowsで実行されます。.classファイルを別のOS(Unix)に移動すると、バイトコードをマシンが理解できるコードに変換するインタープリターが原因で実行されます。


1
キャップをオフにするのを忘れました:)
Aleksej Vasinov 2012年

7
間違って、最初にソースコードをバイトコードにコンパイルし(JVMとは関係ありません)、次にJVMがバイトコードを解釈してネイティブコードにコンパイルします(ただし、すべての部分ではない可能性があります)。
the_Fox 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.