我读到,java源代码被编译成'bytecode',然后由JIT再次'编译'成'机器码'。也就是说,首先将源代码编译成与平台无关的字节码,然后再将其编译为特定于机器的代码。那为什么它被称为解释和编译语言?解释发生在哪里?
答案 0 :(得分:15)
这里有一点误解。
在正常情况下,java编译器(javac
)将java代码编译为字节码,java解释器(java
)解释这些字节码(逐行),将其转换为机器语言并执行。
JIT(Just in time)
编译器有点不同的概念。 JVM维护函数执行的次数。如果超过限制,那么JIT就会出现。 java代码直接编译成机器语言,用于执行该函数。
答案 1 :(得分:9)
它有一个规范(JLS),定义了Java程序应该如何行动。
作为一种语言本身,它没有指定如何在不同平台上执行它。它使用JIT或没有JIT运行的方式完全基于实现。
如果我明天编写一个Java运行时根本不进行JIT编译,我可以调用Java解释。
如果我使用Java字节码作为程序集的Java机器(and people seriously made those),我可以调用严格编译的Java。
许多其他语言都这样做:
答案 2 :(得分:3)
为了精确起见,让我们说清楚这不是Java编程语言问题,而是JVM功能。
在JVM的第一个实现中,JIT不存在,并且始终解释字节码。这是因为设计决定使编译代码独立于运行java的物理机器和操作系统,并且今天仍然有效。
作为后来的改进,JIT在JVM实现中被引入以便更快地执行,但字节码必须仍然有效并在转换为二进制之前传递所有验证。通过这种方式,您可以保持平台独立性,所有健全性和安全性检查,并获得性能。
答案 3 :(得分:1)
javac是一个编译器,它将java代码转换为字节码(参见字节码),如果我们有一个JVM(java虚拟机),它很容易在任何机器上运行。和解释器将java字节码转换为机器码。
答案 4 :(得分:1)
Java是混合语言,即它既是编译(先前完成的工作)又是解释的(完成接收端的工作)。
字节代码是Java的IL( I ntermediate L anguage)。 Java源代码按javac
编译为字节码。有时这个字节代码再次编译成Machine语言,称为JIT( J ust- I n- T ime)编译。
JIT编译是一种执行计算机代码的方法,它涉及程序执行期间的编译 - 在运行时 - 而不是在执行之前。 source
JVM(不带JIT)将java中间语言字节代码解释为本机机器语言,如下所示:
JVM是一个抽象的计算机器,它有几个实现:
HotSpot (Interpreter + JIT编译器):主要参考Java VM实现。由Oracle Java和OpenJDK使用。
JamVM (解释器)与其他人相比,开发成为一个非常小的虚拟机。旨在使用GNU Classpath。支持多种架构。 GPL。
ART (译员+ AOT编译器,即提前编译) A ndroid R un T < / strong> ime是Android操作系统使用的应用程序运行时环境,取代 Dalvik (解释器+ JIT编译器)。
答案 5 :(得分:0)
它有两个目的。第一个是确保代码在语法和语义上都是正确的。其次,编译过程产生字节码。如您所知,这是一种与体系结构无关的中间语言,可以由JVM针对特定的机器体系结构进行解释或即时编译为本机代码。通过编译为字节代码,可以提前完成与编译相关的大部分开销,让JVM从中生成本机代码或解释事先经过彻底和严格检查的字节代码。
答案 6 :(得分:0)
与其他编程语言不同,java是编译和解释语言。 Java IDE充当编译器,JVM(java虚拟机)的行为类似于解释器。即当任何程序说Hello时,在编译为Hello.java后保存,编译完这个文件后我们得到Hello.Class扩展文件,称为类文件,字节码或中间代码。字节代码不依赖于任何特定的机器,因此它也被称为中间代码。 要将此字节代码转换为机器代码或机器可理解的格式,使用的JVM对于不同的操作系统是不同的。 JIT(即时编译器)是JVM的一部分,默认情况下启用将字节码编译为“及时”编译的本机机器代码。