JVM是编译器还是解释器?

sns*_*sns 76 java jvm

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

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

Sri*_*aru 146

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

Javac是Java Compiler - 将您的Java代码编译为Bytecode

JVM是Java虚拟机 - 运行/解释/将字节码转换为本机代码

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安全的主要原因之一)
  • 接下来,执行引擎组件将字节码转换为可执行的机器代码

希望这对你有所帮助..

  • "运行/解释/将字节码转换为本地机器代码"是无稽之谈.它**'运行/解释'*或*'将Bytecode转换为本地机器代码'.不是两个在同一时间. (5认同)
  • 因此JVM和JIT都将字节代码转换为特定于平台的机器代码那么它们之间有什么不同呢?你可以广泛地解释一下吗? (4认同)
  • 你能告诉我什么是原生代码吗?这是否意味着机器代码?我正在努力学习这整个编译和解释过程,但这些中间术语非常令人困惑. (2认同)

Mar*_*ers 30

它只是两者兼而有之,但在传统意义上都不是.

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

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

  • @NaeemShah:我很高兴你喜欢这个答案足以将它几乎逐字复制到你自己名下的博客文章中.您有权这样做,但根据StackOverflow的许可方案,法律要求您将归属地归还此处,并且您必须在相同的许可下许可您的博客文章.请参阅本网站的页脚,该页面链接到以下许可证:http://creativecommons.org/licenses/by-sa/3.0/.另请参阅此博客文章:http://blog.stackoverflow.com/2009/06/attribution-required/ (7认同)

Pau*_*ger 5

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


Mat*_*Mat 5

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


cub*_*l42 5

就像@delnan在评论部分已经说过的,两者都不是

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

JVM有几种实现:

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

......和许多其他

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