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 代码生成本地二进制文件:GCJ ( http://en.wikipedia.org/wiki/Gcj )。我不知道它有多好,是否有可用的 windows 版本。那里可能还有其他 Java 到本机的编译器。

于 2012-04-30T15:03:57.810 回答
1

JIT 和编译器的目标通常不同,我认为这是主要原因。

也就是说,Maxine VM包含一个用 Java 编写的 JIT,用于编译整个 VM 本身,并将输出写入所谓的引导映像,本质上是一个二进制文件。然而,即使这个二进制文件也需要一个名为 loader 的可执行文件才能启动。

因此,至少有一个用于生成二进制文件的 JIT 示例,但通常情况下,JIT 的目标不包括生成二进制文件。

于 2012-05-01T10:27:10.010 回答
0

Jit 是一个重新编译器,因此对于任何特定的系统平台,它都会将字节码编译成特定的系统代码。所以我们不能直接使用 Jit 将 Java 字节码转换为二进制可执行文件。

当 jit 生成二进制代码时,其二进制格式将不支持其他平台。Jit 编译器的主要用途是快速编译,作为 Java 的第二个编译器。因此,Jit 不能从 Java 字节码生成二进制文件。

于 2012-04-30T14:30:11.180 回答
0

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).

于 2012-05-03T09:00:32.927 回答