这里有一点误解。 在正常情况下,java编译器(javac)将java代码编译成字节码,java解释器(java)解释这些字节码(逐行),将其转换成机器语言并执行。 JIT(Just in time)编译器是一个有点不同的概念。JVM维护一个函数被执行的次数计数。如果它超过了这个限制,那么JIT就出现了。java代码被直接编译成机器语言,然后用它来执行那个函数。
与其他编程语言不同,Java是编译和解释的语言。Java IDE充当编译器,JVM(Java虚拟机)充当解释器。即,当任何程序让说Hello,编译后保存为Hello.java,编译后我们得到Hello.Class扩展文件称为class-file,字节码或中间码。字节码不依赖于任何特定的机器,因此它也被称为中间码。为了将这种字节码转换成机器码或机器可理解的格式,使用了JVM,对于不同的操作系统,JVM是不同的。JIT(Just in Time Compiler)是JVM的一部分,它默认将字节码编译成本地机器码,以“Just in Time”方式编译。
7条答案
按热度按时间zqry0prt1#
这里有一点误解。
在正常情况下,java编译器(
javac
)将java代码编译成字节码,java解释器(java
)解释这些字节码(逐行),将其转换成机器语言并执行。JIT(Just in time)
编译器是一个有点不同的概念。JVM维护一个函数被执行的次数计数。如果它超过了这个限制,那么JIT就出现了。java代码被直接编译成机器语言,然后用它来执行那个函数。u3r8eeie2#
Java是一种编程 * 语言 *。
它有一个规范(JLS),定义了Java程序应该如何运行。
作为一种语言本身,它并没有规定它应该如何在不同的平台上执行,它的运行方式,无论有没有JIT,都完全是基于实现的。
很多其他语言都是这样做的:
jtoj6r0c3#
为了精确起见,让我们明确这不是Java编程语言的问题,而是JVM特性的问题。
在JVM的第一个实现中,JIT并不存在,字节码总是被解释的。这是由于设计决定使编译后的代码独立于运行java的物理机器和操作系统,这在今天仍然有效。
作为后来的改进,在JVM实现中引入了JIT,以加快执行速度,但字节码必须仍然有效,并在转换为二进制之前通过所有验证。这样,您可以保持平台独立性、所有健全性和安全性检查,并获得性能。
zd287kbt4#
Java是一种混合语言,也就是说,它既可以编译(在前端完成工作),也可以解释(在接收端完成工作)。
字节码是Java的一种中间语言。Java源代码通过
javac
编译成字节码。有时这种字节码又编译成机器语言,称为JIT编译。JIT编译是一种执行计算机代码的方法,它涉及在程序执行期间(运行时)而不是在执行之前进行编译。source
**JVM(不带JIT)**将java中间语言字节代码解释为本机机器语言,如下所示:
Source
JVM是一个抽象的计算机器,它有几种实现:
*HotSpot(解释器+ JIT编译器):主要的参考Java VM实施。Oracle Java和OpenJDK都使用它。
*JamVM(解释器)与其他虚拟机相比,它是一个非常小的虚拟机。设计使用GNU类路径。支持多种体系结构。GPL。
*ART(解释器+ AOT编译器,即提前编译)AndroidRunTime是Android操作系统使用的应用程序运行时环境,用于取代Dalvik(解释器+ JIT编译器)。
List of Java virtual machines
r1zhe5dt5#
javac是一个编译器,它把java代码转换成字节码(见字节码),如果我们有JVM(java虚拟机),字节码很容易在任何机器上运行。
wyyhbhjk6#
它有两个目的。第一个目的是确保代码在语法和语义上是正确的。第二个目的是编译过程产生字节码。正如您所注意到的,这是一种与体系结构无关的中间语言,可以由JVM针对特定的机器体系结构解释或即时编译为本机代码。通过编译为字节码,与编译相关的大部分开销可以提前完成,让JVM从事先经过彻底和严格检查的字节码中生成本机代码或解释字节码。
hgb9j2n67#
与其他编程语言不同,Java是编译和解释的语言。Java IDE充当编译器,JVM(Java虚拟机)充当解释器。即,当任何程序让说Hello,编译后保存为Hello.java,编译后我们得到Hello.Class扩展文件称为class-file,字节码或中间码。字节码不依赖于任何特定的机器,因此它也被称为中间码。为了将这种字节码转换成机器码或机器可理解的格式,使用了JVM,对于不同的操作系统,JVM是不同的。JIT(Just in Time Compiler)是JVM的一部分,它默认将字节码编译成本地机器码,以“Just in Time”方式编译。