为什么java没有非字节码编译器?

时间:2011-11-01 19:37:55

标签: java compilation jvm bytecode

  

可能重复:
  Why isn't more Java software compiled natively?

我知道Java是字节码编译的,但是在使用JIT时,它会将“热点”编译为本机代码。为什么没有选择将程序编译为本机代码?

6 个答案:

答案 0 :(得分:5)

可以选择以二进制代码编译Java源代码文件,它名为GCJ,来自自由软件基金会。

它没有得到Sun / Oracle的正式支持,但是我使用了编译器并且做得很好;)

答案 1 :(得分:3)

Java作为一种语言,可以像许多语言一样以多种方式实现。这包括完整的解释,字节码编译和本机编译。见Java language specification

VM规范定义了如何加载和执行字节码。它定义了编译的类格式和执行语义,例如线程问题,以及所谓的“内存模型”。见Java VM specification

虽然orignally意味着要在一起,语言和VM是不同的规范。您可以将另一种语言编译为Java字节码并在JVM之上运行它。并且您可以以不同的方式实现Java语言,特别是没有VM,只要您遵循预期的语义。

当然,两者仍然相关,如果没有字节码解释,Java的某些方面可能很难支持,例如返回字节码的自定义ClassLoader(请参阅ClassLoader.defineClass)。我想字节码需要立即JIT到本机代码,或者根本不支持。

答案 2 :(得分:1)

它应该编译哪个平台本机代码?
Windows,Mac,Linux?
如果开发人员在与应用程序运行不同的平台上工作,该怎么办? 如果应用程序平台在服务器机房或桌面上发生更改会怎样?

我没有看到好处,现在JVM似乎足够快以满足一般用途需求。

答案 3 :(得分:1)

有几种产品可以将java程序编译为本机代码,但它们并不完美,完全不像JIT编译器。一些差异包括:

  1. Write Once Run Everywhere - 它只适用于你编译它的目标。
  2. 动态代码 - 您无法在运行时加载jar或其他Java代码,这通常是应用程序服务器,GUI构建器等的功能。
  3. 运行时分析 - 许多JIT编译器操作涉及了解代码在运行时所执行的操作,而不是在静态分析下可能执行的操作,这意味着JIT在适当的情况下可以胜过本机编译的应用程序。
  4. 无法支持所有Java功能。反思之类的东西在编译程序中不会有意义。
  5. 占用空间大 - 当它被编译为本机代码时,JVM为您提供的所有库都必须捆绑到包中,从而导致非常大的占用空间。找出可以省略的东西是一个棘手的问题。
  6. 因此,对于某个应用程序子集,可以编译为本机代码,但随着VM变得越来越快,上面的问题#5并未真正得到改进(尽管项目Jigsaw应该有所帮助对于现实世界的应用程序来说,它不是一个非常引人注目的选择。

答案 4 :(得分:0)

因为编译字节码就足够了。 如果您要编译自己的代码 - 您还编译了所有库。 从两个角度来看这是真正的问题: 1.许可 - 大多数代码都不会改变 2.你“重新编译”了大量的代码: - )

答案 5 :(得分:0)

这是Sun决定不允许这样做的,因为他们希望将Java定位为固有的多平台。因此,他们希望确保编译的任何Java应用程序都可以在任何具有JVM的平台上运行。这可以防止在线提供不能在某些硬件或操作系统上运行的Java二进制文件。