我知道Java是字节码编译的,但是在使用JIT时,它会将“热点”编译为本机代码。为什么没有选择将程序编译为本机代码?
答案 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编译器。一些差异包括:
因此,对于某个应用程序子集,可以编译为本机代码,但随着VM变得越来越快,上面的问题#5并未真正得到改进(尽管项目Jigsaw应该有所帮助对于现实世界的应用程序来说,它不是一个非常引人注目的选择。
答案 4 :(得分:0)
因为编译字节码就足够了。 如果您要编译自己的代码 - 您还编译了所有库。 从两个角度来看这是真正的问题: 1.许可 - 大多数代码都不会改变 2.你“重新编译”了大量的代码: - )
答案 5 :(得分:0)
这是Sun决定不允许这样做的,因为他们希望将Java定位为固有的多平台。因此,他们希望确保编译的任何Java应用程序都可以在任何具有JVM的平台上运行。这可以防止在线提供不能在某些硬件或操作系统上运行的Java二进制文件。