JIT コンパイラは、Java バイトコードをネイティブの機械語に変換するために使用されます。また、私の知る限り、Java バイトコードを .exe ファイルなどのバイナリ ファイルに直接変換できるプログラムはありません。では、JIT コンパイラを使用してバイトコードからバイナリを生成できないのはなぜでしょうか?
5 に答える
JIT コンパイラは、コードを動的にコンパイルします。
- 異なるフレーバーの CPU に対して異なるコードを生成します。
- メモリ モデルごとに異なるコードが生成されます。たとえば、64 ビット JVM の場合、最大ヒープ サイズが 4 GB 未満、24 GB 未満、32 GB 未満、またはそれ以上の場合、それぞれのケースで異なるコードが生成されます。
- クラスがロードおよびアンロードされると、コードが再コンパイルされます。
- 使用方法に基づいてコードを再最適化します。たとえば、オフになっていたフラグがオンになっていない場合や、その逆の場合などです。
静的コンパイラはこれらのことを行うことができません。
JIT=ジャストインタイム。* .exeは、実行前にコンパイルされます。</nitpick>
;)
他の人が言ったように、JVMには、バイトコードをネイティブマシンコードにコンパイルするだけではありません。ただし、JVMのこれらの部分は、ネイティブライブラリ(「dll」)に入れることができます。
Javaコードからネイティブバイナリを生成するプロジェクトが少なくとも1つあります:GCJ(http://en.wikipedia.org/wiki/Gcj)。それがどれほど優れているか、そして利用可能なWindowsバージョンがあるかどうかはわかりません。他のJavaからネイティブへのコンパイラもあるかもしれません。
通常、JIT とコンパイラの目的は異なります。それが主な理由だと思います。
つまり、Maxine VMには Java で記述された JIT が含まれており、これは VM 自体全体をコンパイルするために使用され、出力はいわゆるブートイメージ (本質的にはバイナリ) に書き込まれます。ただし、このバイナリでも起動するにはローダーと呼ばれる実行可能ファイルが必要です。
そのため、バイナリの生成に使用される JIT の例が少なくとも 1 つありますが、通常、JIT の目的にはバイナリの生成は含まれません。
IBM Java Runtime は、動的バイトコードからネイティブ コードへのコンパイルの結果を共有データ キャッシュに格納し、JVM 間で共有することができます (証明リンク)。
Jit は re コンパイラであるため、特定のシステム プラットフォームに対して、バイトコードを特定のシステム コードにコンパイルします。したがって、Jit を直接使用して Java バイト コードをバイナリ実行可能ファイルに変換することはできません。
jit がバイナリ コードを生成する場合、そのバイナリ形式は別のプラットフォームをサポートしません。Jit コンパイラの主な用途は、Java の 2 番目のコンパイラとしての高速コンパイルです。したがって、Jit は Java バイトコードからバイナリを生成できません。