jvm 为什么Java既是编译语言又是解释语言,而JIT也编译字节码?

f87krz0w  于 2022-11-07  发布在  Java
关注(0)|答案(7)|浏览(130)

我读到,一个java源代码被编译成“字节码”,然后它被JIT再次“编译”成“机器码”。也就是说,源代码首先被编译成一个与平台无关的字节码,然后再编译成一个机器特定的代码。那么为什么它被称为解释和编译语言呢?解释发生在哪里?

zqry0prt

zqry0prt1#

这里有一点误解。
在正常情况下,java编译器(javac)将java代码编译成字节码,java解释器(java)解释这些字节码(逐行),将其转换成机器语言并执行。
JIT(Just in time)编译器是一个有点不同的概念。JVM维护一个函数被执行的次数计数。如果它超过了这个限制,那么JIT就出现了。java代码被直接编译成机器语言,然后用它来执行那个函数。

u3r8eeie

u3r8eeie2#

Java是一种编程 * 语言 *。

它有一个规范(JLS),定义了Java程序应该如何运行。
作为一种语言本身,它并没有规定它应该如何在不同的平台上执行,它的运行方式,无论有没有JIT,都完全是基于实现的。

  • 如果我明天编写一个完全不进行JIT编译的Java运行时,我可以调用Java interpreted。
  • 如果我使用一个Java机器(and people seriously made those),它使用Java字节码作为汇编,我可以调用严格编译的Java。

很多其他语言都是这样做的:

  • python是一种解释语言吗?(CPython)还是JIT(PyPy)?
  • Lua是解释的(旧的Lua解释器)还是编译的(LuaJIT)?
  • JavaScript是解释的(IE6风格)还是编译的(v8)?
jtoj6r0c

jtoj6r0c3#

为了精确起见,让我们明确这不是Java编程语言的问题,而是JVM特性的问题。
在JVM的第一个实现中,JIT并不存在,字节码总是被解释的。这是由于设计决定使编译后的代码独立于运行java的物理机器和操作系统,这在今天仍然有效。
作为后来的改进,在JVM实现中引入了JIT,以加快执行速度,但字节码必须仍然有效,并在转换为二进制之前通过所有验证。这样,您可以保持平台独立性、所有健全性和安全性检查,并获得性能。

zd287kbt

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

r1zhe5dt

r1zhe5dt5#

javac是一个编译器,它把java代码转换成字节码(见字节码),如果我们有JVM(java虚拟机),字节码很容易在任何机器上运行。

wyyhbhjk

wyyhbhjk6#

它有两个目的。第一个目的是确保代码在语法和语义上是正确的。第二个目的是编译过程产生字节码。正如您所注意到的,这是一种与体系结构无关的中间语言,可以由JVM针对特定的机器体系结构解释或即时编译为本机代码。通过编译为字节码,与编译相关的大部分开销可以提前完成,让JVM从事先经过彻底和严格检查的字节码中生成本机代码或解释字节码。

hgb9j2n6

hgb9j2n67#

与其他编程语言不同,Java是编译和解释的语言。Java IDE充当编译器,JVM(Java虚拟机)充当解释器。即,当任何程序让说Hello,编译后保存为Hello.java,编译后我们得到Hello.Class扩展文件称为class-file,字节码或中间码。字节码不依赖于任何特定的机器,因此它也被称为中间码。为了将这种字节码转换成机器码或机器可理解的格式,使用了JVM,对于不同的操作系统,JVM是不同的。JIT(Just in Time Compiler)是JVM的一部分,它默认将字节码编译成本地机器码,以“Just in Time”方式编译。

相关问题