Java代码被编译成字节码,这使得它能在许多平台上移植。但是Java也会进行即时编译,而这是在运行时发生的。
这是否意味着Java需要被编译两次?第一次是由我们编译产生字节码,第二次是由JVM编译吗?谢谢。
在编译时,您是针对JVM平台进行编译的。然后,在任何计算机上在JVM上运行应用程序时,某些经常使用的代码部分会被编译成本机优化代码。
简而言之:是的,但有很好的理由。
如果您的代码足够“热”,JVM可能会将其从字节码编译为本机代码;并且根据程序的运行时特性,它可能会被多次编译,旧版本会被丢弃。
JIT是一个复杂的东西;事实上,Sun JVM有两个JITs(-client和-server),它们之间的行为不同,一些实现甚至支持同时运行这两个JITs(因此,您的应用程序中可能会有解释的字节码与由两个不同的JIT编译的代码并存)。
如果您真的对此主题感兴趣,我建议您阅读更多关于Hotspot(最常见的JIT,因为它是Sun的JIT)的内容。您可以从Sun的页面开始。
简短回答:有点是。
最长的回答:这是两件不同的事情。 第一次编译是从源代码到字节码的过程,通常在编译领域中称为中间表示(IR)。
然后虚拟机将字节码转换回本地代码,安装在哪个平台上就在哪个平台上。
这是两种完全不同类型的编译。第二种甚至不算是编译,因为没有语法检查器和作用域分析器……好吧,有一些检查,但不是编译器中所具有的那种检查。