web-dev-qa-db-ja.com

JIT対通訳

JITと通訳の違いがわかりませんでした。

Jitはインタプリタとコンパイラの仲介者です。実行時に、バイトコードをマシンコード(JVMまたは実際のマシン?)に変換します。次回は、キャッシュから取得して実行しますか?

インタープリターは、バイトコードをマシンコードに変換せずに直接実行します。そうですか?

私たちのPCの実際のプロセッサはどのように命令を理解しますか?

私の疑問を解消してください。

41
Manoj

まず最初に:
JVMでは、インタプリタとコンパイラの両方(JVMコンパイラであり、javacのようなソースコードコンパイラではありません)ネイティブコード(x86のような基礎となる物理CPUのマシン言語コード)byte codeから。

違いは何ですか:
違いは、ネイティブコードを生成する方法、最適化の方法、最適化のコストにあります。非公式に、インタープリターは、事前に定義されたJVM命令とマシン命令のマッピングを検索することにより、各バイトコード命令を対応するネイティブ命令にほぼ変換します(以下の写真を参照)。興味深いことに、バイトコードのセクションを取得してマシンコードに変換すると、実行速度がさらに向上します-論理セクション全体を検討すると、変換ではなく最適化の余地が得られることが多いためです(解釈)各行を分離して(to machine instruction)。バイトコードのセクションを(おそらく最適化された)機械命令に変換するこの行為は、(現在のコンテキストでは)コンパイルと呼ばれます。コンパイルが実行時に行われる場合、コンパイラーはJITコンパイラーと呼ばれます。

enter image description here

相互関係と調整:
Javaデザイナーは(ハードウェアとOS)の移植性を求めて以来、インタプリタアーキテクチャ(Cスタイルのコンパイル、アセンブル、リンクとは対照的に)。ただし、より高速化するために、コンパイラーもオプションでJVMに追加されます。それでも、プログラムが解釈されると(および物理CPUで実行されます)JVMによって「ホットスポット」が検出され、統計が生成されます。そのため、インタプリタからの統計を使用して、これらのセクションがコンパイルの候補になります(最適化されたネイティブコード)。コンパイラー)とコンパイルされたマシン命令が(解釈されるのではなく)後で使用されます。当然のことながら、JVMはそのようなコンパイルされたコードの断片もキャッシュします。

注意事項:
これらはほとんど基本的な概念です。 JVMの実際の実装者が少し異なる方法で実行しても、驚かないでください。他の言語のVMの場合も同様です。

注意事項:
「インタプリタが仮想プロセッサでバイトコードを実行する」、「インタプリタがバイトコードを直接実行する」などのステートメントは、最終的に実行する必要がある一連の機械語命令があることを理解している限り、すべて正しいです。物理ハードウェアで。

参考資料:[広範囲にわたる検索は行っていません]

  • [論文]ハードウェア翻訳ベースの命令フォールディングJava仮想マシンby大井仁
  • [本]コンピューターの構成とデザイン、第4版、D。A.パターソン。 (図2.23を参照)
  • [web記事] JVMパフォーマンスの最適化、パート2:コンパイラー、Eva Andreasson(JavaWorld)

PS:次の用語を同じ意味で使用しました-「ネイティブコード」、「機械語コード」、「機械命令」など

46
KGhatak
  • インタープリター:ソースコードまたはその中間表現(バイトコード)を読み取り、実行します直接

  • JITコンパイラー:ソースコード、またはより一般的にはその中間表現(バイトコード)を読み取り、その場でコンパイルしてネイティブコードを実行します。

20
gpeche

Jitはインタプリタとコンパイラの仲介者です。実行時に、バイトコードをマシンコード(JVMまたは実際のマシン?)に変換します。次回は、キャッシュから取得して実行しますか?

はい、そうです。

インタープリターは、バイトコードをマシンコードに変換せずに直接実行します。そうですか?

はい、そうです。

私たちのPCの実際のプロセッサはどのように命令を理解しますか?

インタープリターの場合、仮想マシンは、バイトコードの各命令に対応するネイティブJVMプロシージャを実行して、期待される動作を生成します。ただし、Jitコンパイラーのように、コードが実際にネイティブコードにコンパイルされるわけではありません。 JVMは、各命令の予想される動作をエミュレートします。

16
Vivien Barousse

A JITコンパイラ は、バイトコードをマシンコードに変換してから、マシンコードを実行します。

インタープリター 高水準言語を読み取り(解釈し)、プログラムから要求された内容を実行します。インタプリタは通常、バイトコードとjitのコンパイルを通過しません。

しかし、実行速度を向上させるために、多数のインタープリターが内部バイトコンパイルとjitコンパイルに移行しているため、2つの世界は溶けています。

8
Jérôme Radix

JITが、必要に応じてバイトコードをマシンコードに変換して、実行中のマシンを正しく実行できると確信しています。これに代わる方法は、Java仮想マシンでバイトコードを実行することです。これがコードの解釈と同じかどうかはわかりません。 RubyまたはPerlのような)スクリプト(コンパイルされていない)言語の実行について説明する.

0
Aaron