【问题标题】:Why JIT compilers can't be used to produce binary?为什么 JIT 编译器不能用于生成二进制文件?
【发布时间】:2012-04-30 14:16:49
【问题描述】:

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

【问题讨论】:

  • JIT 只是其中的一部分。你需要了解为什么需要 JVM。它不仅仅是编译。还有内存管理、线程控制等
  • 它们不能开箱即用,可能是因为:1) JIT 是 Java 二进制/发行版的一部分 2) JIT 不会将整个程序转换为本机代码,只有热点。
  • 因为 JIT 仅“及时”编译相关部分 - 在代码实际执行时。这意味着您需要启动并运行正常的 JVM 才能真正达到这一点。
  • convert JIT to EXE?的可能重复
  • “那么为什么不能使用 JIT 编译器从字节码生成二进制文件?” 为什么要这样做?没有意义。

标签: java jit


【解决方案1】:

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

  • 它为不同风格的 CPU 生成不同的代码。
  • 它为不同的内存模型生成不同的代码,例如对于 64 位 JVM,如果最大堆大小为
  • 它会在加载和卸载类时重新编译代码。
  • 它将根据代码的使用方式重新优化代码。例如如果曾经关闭的标志未打开,反之亦然。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 十年前曾经有六个这样的编译器:TowerJ、JOVE、NaturalBridge,现在除了 GCJ 和 Excelsior JET 之外都消失了。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-25
          • 2019-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-23
          相关资源
          最近更新 更多