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

2022-09-03 17:34:47

我读到,Java源代码被编译成“字节码”,然后由JIT再次“编译”成“机器代码”。也就是说,源代码首先被编译成一个独立于平台的字节码,然后再次编译成一个机器特定的代码。那么为什么它被称为解释型和编译型语言呢?解释在哪里进行?


答案 1

这里有一点误解。

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

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


答案 2

Java是一种编程语言

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

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

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

  • 如果我使用Java机器(人们认真制作了这些机器)使用Java字节码作为汇编,我可以调用Java严格编译。

许多其他语言都这样做:

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

推荐