我读到这一点,一个java源代码被编译成'字节码',然后由JIT再次'编译'成'机器码'。也就是说,首先将源代码编译成与平台无关的字节码,然后再将其编译为特定于机器的代码。那为什么它被称为解释和编译语言?解释发生在哪里?
这里有一点误会。
在正常情况下,java编译器(javac
)将java代码编译为字节码,java解释器(java
)解释这些字节码(逐行),将其转换为机器语言并执行。
JIT(Just in time)
编译器有点不同的概念。 JVM维护函数执行的次数。如果超过限制,那么JIT就会出现。 java代码直接编译成机器语言,用于执行该函数。
它有一个规范(JLS),定义了Java程序应该如何操作。
作为一种语言本身,它没有指定如何在不同平台上执行它。它使用JIT或没有JIT运行的方式完全基于实现。
许多其他语言都这样做:
为了精确起见,让我们明确这不是Java编程语言问题,而是JVM功能。
在JVM的第一个实现中,JIT不存在,并且始终解释字节码。这是由于设计决定使编译代码独立于运行java的物理机器和操作系统,并且今天仍然有效。
作为后来的改进,JIT在JVM实现中被引入以便更快地执行,但字节码必须仍然有效并在转换为二进制之前传递所有验证。这样,您可以保持平台独立性,所有健全性和安全性检查,并获得性能。
javac是一个编译器,它将java代码转换为字节码(参见字节码),如果我们有一个JVM(java虚拟机),它很容易在任何机器上运行。和解释器将java字节码转换为机器码。
Java是混合语言,即它既是Compiled(先前完成的工作)又是Interpreted(完成接收端的工作)。
字节代码是Java的IL(中间语言)。 Java源代码由javac
编译为Bytecode。有时,这个字节代码再次编译成Machine语言,称为JIT(Just-In-Time)编译。
JIT编译是一种执行计算机代码的方法,它涉及程序执行期间的编译 - 在运行时 - 而不是在执行之前。 source
JVM(不带JIT)将java中间语言字节代码解释为本机机器语言,如下所示:
JVM是一个抽象的计算机器,它有几个实现:
它有两个目的。第一个是确保代码在语法和语义上都是正确的。其次,编译过程产生字节码。如您所知,这是一种与体系结构无关的中间语言,可以由JVM针对特定的机器体系结构进行解释或即时编译为本机代码。通过编译为字节代码,可以提前完成与编译相关的大部分开销,使JVM从中生成本机代码或解释事先经过彻底和严格检查的字节代码。
与其他编程语言不同,java是编译和解释语言。 Java IDE充当编译器,JVM(java虚拟机)的行为类似于解释器。即当任何程序说Hello时,在编译为Hello.java后保存,编译完这个文件后我们得到Hello.Class扩展文件,称为类文件,字节码或中间代码。字节代码不依赖于任何特定的机器,因此它也被称为中间代码。要将此字节代码转换为机器代码或机器可理解的格式,使用的JVM对于不同的操作系统是不同的。 JIT(即时编译器)是JVM的一部分,默认情况下启用将字节码编译为“及时”编译的本机机器代码。