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

时间:2014-01-02 10:20:07

标签: java jvm jit interpreted-language

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

7 个答案:

答案 0 :(得分:15)

这里有一点误解。

在正常情况下,java编译器(javac)将java代码编译为字节码,java解释器(java)解释这些字节码(逐行),将其转换为机器语言并执行。

JIT(Just in time)编译器有点不同的概念。 JVM维护函数执行的次数。如果超过限制,那么JIT就会出现。 java代码直接编译成机器语言,用于执行该函数。

答案 1 :(得分:9)

Java是一种编程语言

它有一个规范(JLS),定义了Java程序应该如何行动。

作为一种语言本身,它没有指定如何在不同平台上执行它。它使用JIT或没有JIT运行的方式完全基于实现。

  • 如果我明天编写一个Java运行时根本不进行JIT编译,我可以调用Java解释。

  • 如果我使用Java字节码作为程序集的Java机器(and people seriously made those),我可以调用严格编译的Java。

许多其他语言都这样做:

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

答案 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中间语言字节代码解释为本机机器语言,如下所示:

enter image description here

Source

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编译器)。

List of Java virtual machines

答案 5 :(得分:0)

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

答案 6 :(得分:0)

与其他编程语言不同,java是编译和解释语言。 Java IDE充当编译器,JVM(java虚拟机)的行为类似于解释器。即当任何程序说Hello时,在编译为Hello.java后保存,编译完这个文件后我们得到Hello.Class扩展文件,称为类文件,字节码或中间代码。字节代码不依赖于任何特定的机器,因此它也被称为中间代码。 要将此字节代码转换为机器代码或机器可理解的格式,使用的JVM对于不同的操作系统是不同的。 JIT(即时编译器)是JVM的一部分,默认情况下启用将字节码编译为“及时”编译的本机机器代码。