繁体   English   中英

JVM 是编译器还是解释器?

[英]Is the JVM a compiler or an interpreter?

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

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

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

Javac是 Java Compiler -- 将你的 Java 代码编译成字节码

JVM是 Java 虚拟机——运行/解释/将字节码转换为本地机器码

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

那么现在,让我们为您的问题寻找答案..

1) JVM: is it a compiler or an interpreter? -- Ans:翻译

2) what about JIT compiler that exist inside the JVM? -- Ans:如果你完整地阅读了这个回复,你现在可能知道了

3) what exactly is the JVM? ——答:

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

希望这对你有帮助..

两者兼而有之,但都不是传统意义上的。

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

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

就像@delnan已经在评论部分中提到的那样,它既不是.

JVM是运行Java 字节码的抽象机器。

JVM 有几种实现:

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

...以及许多其他人

在谈论 JVM 时,大多数其他答案是指 HotSpot 或上述实现 JVM 的方法的某种混合。

两者都是。 它从解释字节码开始,然后可以(如果它认为值得)将该字节码编译为本地机器码。

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

Javac 是一个编译器,但不是传统的编译器。 编译器通常将源代码转换为机器级语言以供执行,这是一次性完成的,即一次性完成整个代码并转换为机器级语言。 (下面有更多内容)。 同时,JavaC 将其转换为字节码而不是机器级语言。

JIT 是 Java 编译器,但也充当解释器。 典型的编译器会将所有代码一次从源代码转换为机器级语言。 相反,JIT 逐行(逐行执行是解释器的一个特性)并将 JavaC 生成的字节码转换为机器级语言并执行它。 包含 JIT 的 JVM 有多种实现。 Hotspot 是 Java 编程的主要热点之一。 Hotspot 实现使 JIT 通过将重复的代码块一次转换为机器级语言(如上面提到的编译器)来优化执行,以便它们可以更快地执行,而不是一一转换每一行代码。因此,对于编译器和解释器的典型定义,答案不是黑白分明。

这是我看了几个网上的回答、博客等后的理解,如果有人对提高这种理解有建议,请随时提出建议。

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

如果是解释器,那么JVM内部的JIT编译器呢?
如果两者都不是,那么JVM到底是什么? (我不想要将字节码转换为机器特定代码等的 JVM 基本定义。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM