为什么JIT编译器不能用于生成二进制文件?

时间:2012-04-30 14:16:49

标签: java jit

JIT编译器用于将java字节代码转换为本机机器语言。据我所知,没有程序可以直接将java字节码转换为二进制文件,如.exe文件。那么为什么JIT编译器不能用于从字节码生成二进制文件?

5 个答案:

答案 0 :(得分:4)

JIT编译器,动态编译代码。

  • 它为不同风格的CPU生成不同的代码。
  • 它为不同的内存模型生成不同的代码,例如:对于tyhe 64位JVM,如果最大堆大小是< 4 GB,< 24 GB,< 32 GB或更多,您将在每种情况下生成不同的代码。
  • 在加载和卸载类时,它将重新编译代码。
  • 它将根据代码的使用方式重新优化代码。例如如果过去的标志没有打开,反之亦然。

静态编译器不能做这些事情。

答案 1 :(得分:2)

JIT =及时。 * .exe在执行之前被编译。 </nitpick>;)

正如其他人所说,JVM不仅仅是将字节码编译为本地机器代码。但是,JVM的这些部分可以放入本机库(“dll”)。

至少有一个项目可以用java代码生成本机二进制文件:GCJ(http://en.wikipedia.org/wiki/Gcj)。我不知道它有多好,是否有可用的Windows版本。可能还有其他Java-to-native编译器。

答案 2 :(得分:1)

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

也就是说,Maxine VM包含一个用Java编写的JIT,用于编译整个VM本身,输出写入所谓的bootimage,基本上是二进制文件。但是,即使这个二进制文件也需要一个名为loader的可执行文件来启动。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

IBM Java Runtime能够将动态字节码的结果存储到其共享数据缓存中的本机代码编译中,并在JVM(prooflink)之间共享。