JIT 编译器用于将 java 字节码转换为本地机器语言。而且据我所知,没有任何程序可以直接将java字节码转换为.exe文件等二进制文件。那么为什么不能使用 JIT 编译器从字节码生成二进制文件呢?
5 回答
JIT 编译器动态编译代码。
- 它为不同风格的 CPU 生成不同的代码。
- 它为不同的内存模型生成不同的代码,例如对于 64 位 JVM,如果最大堆大小为 < 4 GB、< 24 GB、< 32 GB 或更多,您将在每种情况下生成不同的代码。
- 它将在加载和卸载类时重新编译代码。
- 它将根据代码的使用方式重新优化代码。例如,如果曾经关闭的标志未打开,反之亦然。
静态编译器不能做这些事情。
JIT = 及时。*.exe 是在执行之前编译的。</nitpick>
;)
正如其他人所说,JVM 不仅仅是将字节码编译为本机机器码。但是,可以将 JVM 的这些部分放入本机库(“dll”)中。
至少有一个项目可以用 java 代码生成本地二进制文件:GCJ ( http://en.wikipedia.org/wiki/Gcj )。我不知道它有多好,是否有可用的 windows 版本。那里可能还有其他 Java 到本机的编译器。
JIT 和编译器的目标通常不同,我认为这是主要原因。
也就是说,Maxine VM包含一个用 Java 编写的 JIT,用于编译整个 VM 本身,并将输出写入所谓的引导映像,本质上是一个二进制文件。然而,即使这个二进制文件也需要一个名为 loader 的可执行文件才能启动。
因此,至少有一个用于生成二进制文件的 JIT 示例,但通常情况下,JIT 的目标不包括生成二进制文件。
Jit 是一个重新编译器,因此对于任何特定的系统平台,它都会将字节码编译成特定的系统代码。所以我们不能直接使用 Jit 将 Java 字节码转换为二进制可执行文件。
当 jit 生成二进制代码时,其二进制格式将不支持其他平台。Jit 编译器的主要用途是快速编译,作为 Java 的第二个编译器。因此,Jit 不能从 Java 字节码生成二进制文件。
IBM Java Runtime is capable of storing the results of dynamic bytecode to native code compilation in its shared data cache and sharing it between JVMs (prooflink).