3

JIT コンパイラは、Java バイトコードをネイティブの機械語に変換するために使用されます。また、私の知る限り、Java バイトコードを .exe ファイルなどのバイナリ ファイルに直接変換できるプログラムはありません。では、JIT コンパイラを使用してバイトコードからバイナリを生成できないのはなぜでしょうか?

4

5 に答える 5

4

JIT コンパイラは、コードを動的にコンパイルします。

  • 異なるフレーバーの CPU に対して異なるコードを生成します。
  • メモリ モデルごとに異なるコードが生成されます。たとえば、64 ビット JVM の場合、最大ヒープ サイズが 4 GB 未満、24 GB 未満、32 GB 未満、またはそれ以上の場合、それぞれのケースで異なるコードが生成されます。
  • クラスがロードおよびアンロードされると、コードが再コンパイルされます。
  • 使用方法に基づいてコードを再最適化します。たとえば、オフになっていたフラグがオンになっていない場合や、その逆の場合などです。

静的コンパイラはこれらのことを行うことができません。

于 2012-04-30T14:43:52.017 に答える
2

JIT=ジャストインタイム。* .exeは、実行前にコンパイルされます。</nitpick>;)

他の人が言ったように、JVMには、バイトコードをネイティブマシンコードにコンパイルするだけではありません。ただし、JVMのこれらの部分は、ネイティブライブラリ(「dll」)に入れることができます。

Javaコードからネイティブバイナリを生成するプロジェクトが少なくとも1つあります:GCJ(http://en.wikipedia.org/wiki/Gcj)。それがどれほど優れているか、そして利用可能なWindowsバージョンがあるかどうかはわかりません。他のJavaからネイティブへのコンパイラもあるかもしれません。

于 2012-04-30T15:03:57.810 に答える
1

通常、JIT とコンパイラの目的は異なります。それが主な理由だと思います。

つまり、Maxine VMには Java で記述された JIT が含まれており、これは VM 自体全体をコンパイルするために使用され、出力はいわゆるブートイメージ (本質的にはバイナリ) に書き込まれます。ただし、このバイナリでも起動するにはローダーと呼ばれる実行可能ファイルが必要です。

そのため、バイナリの生成に使用される JIT の例が少なくとも 1 つありますが、通常、JIT の目的にはバイナリの生成は含まれません。

于 2012-05-01T10:27:10.010 に答える
0

IBM Java Runtime は、動的バイトコードからネイティブ コードへのコンパイルの結果を共有データ キャッシュに格納し、JVM 間で共有することができます (証明リンク)。

于 2012-05-03T09:00:32.927 に答える
0

Jit は re コンパイラであるため、特定のシステム プラットフォームに対して、バイトコードを特定のシステム コードにコンパイルします。したがって、Jit を直接使用して Java バイト コードをバイナリ実行可能ファイルに変換することはできません。

jit がバイナリ コードを生成する場合、そのバイナリ形式は別のプラットフォームをサポートしません。Jit コンパイラの主な用途は、Java の 2 番目のコンパイラとしての高速コンパイルです。したがって、Jit は Java バイトコードからバイナリを生成できません。

于 2012-04-30T14:30:11.180 に答える