JVM是编译器还是解释器?

时间:2011-10-06 13:23:41

标签: java jvm

我有一个关于JVM的基本问题:它是编译器还是解释器?

如果是解释器,那么JVM中存在的JIT编译器呢? 如果不是,那么JVM究竟是什么? (我不想要将字节码转换为机器特定代码等的jVM的基本定义。)

8 个答案:

答案 0 :(得分:139)

首先,让我们清楚地了解以下术语

Javac是Java编译器 - 将您的Java代码编译为字节码

JVM是Java虚拟机 - 运行/解释/将Bytecode转换为本地机器代码

JIT是即时编译器 - 在本地执行之前,将给定的字节码指令序列编译为运行时的机器代码。它的主要目的是对性能进行大量优化。

现在,让我们找到你问题的答案..

1)JVM: is it a compiler or an interpreter? - 答案口译员

2)what about JIT compiler that exist inside the JVM? - 答案:如果您完全阅读此回复,您现在可能已经知道了

3)what exactly is the JVM? - 答案

  • JVM是驻留在RAM上的虚拟平台
  • 其组件类加载器.class文件加载到RAM中
  • JVM中的字节代码验证程序组件会检查代码中是否存在任何访问限制违规。 (这是java安全的主要原因之一)
  • 接下来,执行引擎组件将字节码转换为可执行的机器代码

希望这有助于你......

答案 1 :(得分:31)

两者兼而有之,但传统意义上都没有。

现代JVM采用字节码并在首次需要时将其编译为本机代码。在这种情况下,“JIT”代表“及时”。它从外部充当解释器,但实际上它正在编译成机器代码。

不应将JVM与Java编译器混淆,Java编译器将源代码编译为字节码。因此,将它视为“编译器”是有用的,而是知道在后台它确实进行了一些编译。

答案 2 :(得分:5)

两者都是。它首先解释字节码并且可以(如果它确定它值得),然后将该字节码编译为本机机器代码。

答案 3 :(得分:5)

与评论部分中已说明的@delnan一样,既不

JVM是一个运行Java bytecode的抽象机器。

JVM有几个实现:

  • HotSpot(解释器+ JIT编译器)
  • Dalvik(解释器+ JIT编译器)
  • ARTAOT编译器+ JIT编译器)
  • GCJ(AOT编译器)
  • JamVM(翻译)

...和many others

其他大多数人在谈论JVM时都会回答HotSpot或 实现JVM的上述方法的一些混合。

答案 4 :(得分:4)

两者都是。它可以解释字节码,并将其编译为本机代码。

答案 5 :(得分:1)

正如其他人所说的那样!如果您想要详细介绍它,请参阅:This IBM Description

答案 6 :(得分:0)

Javac是编译器,而不是传统的编译器。 编译器通常将源代码转换为机器级别的语言以执行代码,这是一次完成的操作,即在ONCE处将整个代码提取并转换为机器级别的语言。 (有关详情,请参见下文)。 同时,JavaC会将其转换为字节码而不是机器级语言。

JIT是Java编译器,但也充当解释器。典型的编译器会立即将所有代码从源代码转换为机器级别的语言。相反,JIT逐行执行(逐行执行是Interpreters的功能),并将JavaC生成的字节码转换为机器级语言并执行它。带有JIT的JVM具有多种实现。热点是Java编程的主要热点之一。热点实现使JIT通过一次将重复的代码块转换为机器级语言(如上述编译器)来优化执行,从而可以更快地执行它们,而不用将每行代码1转换为1。 因此,就编译器和解释器的典型定义而言,答案不是黑白的。

这是我在阅读一些在线答案,博客等之后的理解。如果有人对您的理解有所帮助,请随时提出建议。

答案 7 :(得分:-5)

JVM有编译器和解释器。因为编译器编译代码并生成字节码。之后,解释器将字节码转换为机器可理解的代码。

示例:编写并编译程序,它在Windows上运行。将.class文件带到另一个操作系统(Unix),它将运行,因为解释器将字节码转换为机器可理解的代码。