Java字节码是否直接翻译成汇编代码?

4
我知道javac*.java文件编译成*.class文件,这些文件的内容被称为字节码。
我假设每个字节码都被翻译成一个汇编等效指令,比如ADD或SUB。如果这是正确的,那么JIT和我的解释器的最终结果应该是相同的汇编指令,这时我不明白为什么需要我的/usr/bin/java解释器了。
请在有误的情况下进行更正。

Wikipedia关于Java的文章回答了你的问题。如果需要更多细节,建议从官方文档开始阅读。 - Gerald Schneider
我已经将问题缩小到标题中提到的部分。投票重新开放。 - aioobe
为什么要重新开启?类似的问题已经在这里和这里被问过,并且被关闭了,因为它们不具有建设性。那么这个问题有什么不同呢? - Gerald Schneider
在我看来,它们相似但并非重复。这个问题归结为“字节码指令是否直接翻译成相应的汇编指令”。 - aioobe
@aioobe 是的,那是我在用词上玩了个恶劣的游戏,抱歉。首先,我误解了字节码被映射为汇编代码的1对1关系,因此我提出了一个错误的问题。 - Oleg
1
Java几乎和C代码一样快(一旦JIT处理)。因此,即使标题并不完全正确。我认为,问题应该首先询问是否JIT编译的Java代码较慢,然后再问为什么。 - Trilarion
1个回答

2

Java字节码是一种相当高级的语言,与汇编指令远非一一对应。以下是几个需要注意的方面:

  • 垃圾回收 - 这是JVM的保证,通常在谈论本地程序时不会考虑。
  • - 字节码仍然有类和类层次结构(包括多态、虚方法调用等)。
  • 类型安全 - 虽然存在类型安全的汇编语言,但字节码类型系统比任何普通汇编语言都要复杂得多。
  • 数组索引检查 - 每个数组访问都需要(直接或间接地)受到越界检查的限制。这是一个必须由VM处理的高级特性。
  • 空指针检查 - 许多字节码指令可以隐式抛出良好的异常,例如NullPointerException。相应的“本地对应物”是默默失败或段错误。
  • 异常处理 - 一般情况下,异常处理会影响性能。当然,像C++这样的本机语言确实支持异常,但许多C++项目出于性能考虑避免使用它们。

这些你提到的操作不也是由汇编处理的吗? - Oleg
1
如果你比较本地代码(我指的是例如C语言编写的代码),释放内存的责任在于你作为程序员。通常情况下,你的性能会比垃圾回收器更好。数组索引检查通常可以跳过,因为作为程序员,你可能比JVM更了解代码/具有更大的上下文知识。空指针异常也是如此。 - aioobe
请问,我的字节码何时被解释执行,何时被编译?我阅读了Java手册,看到了Xint可以禁用编译,而Xbatch几乎相同。 - Oleg
1
这取决于您使用的虚拟机。如果我没记错,JRockit会预先编译所有内容,而Hotspot在热身期间运行解释器,并编译有意义的代码部分。 - aioobe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接