assembly - 字节码和汇编语言是一回事吗?

标签 assembly virtual-machine bytecode cil machine-code

这个问题可能看起来很奇怪,但我仍在尝试掌握虚拟机的概念。我已经阅读了几个答案,但我仍然不知道 Java 字节码(以及 MSIL)是否与汇编语言相同。据我了解,字节码和程序集都被编译为机器代码,因此从抽象的角度来说,它们处于同一级别,即比机器代码高一级。那么字节码只是一种汇编语言,即人类可读的机器代码形式。如果是的话,为什么还要使用汇编语言呢?为什么不使用字节码(可跨不同机器移植)而不是汇编语言(特定于单机架构)进行编程?谢谢

最佳答案

没有。

Java字节码是二进制编程语言,不是“人类可读的形式”,除非你考虑一堆数字可读,或者你使用反汇编程序将其反转为字节码文本助记符,或者最终变成Java源代码本身。

汇编通常是目标机器实际指令的文本助记符,彼此1:1映射,因此汇编源中的一条指令将直接翻译为一条机器代码指令(尽管某些CPU和汇编器存在一些异常(exception),例如,许多 RISC 汇编器会根据需要将“加载具有立即值的寄存器”转换为多条指令 - 加载任何立即值,而 native 机器代码只能加载特定位,并且您必须通过多条指令组合整个值) .

与大多数 CPU 机器代码相比,Java 字节码是相当高级的抽象语言,指令和内存模型的重叠非常小。唯一的相似之处是,字节码以二进制形式存储,就像机器代码一样。

<小时/>

编辑:

JVM 原则上是解释器,即。它将动态字节码转换为机器代码。这就是事情,在其他语言中,这是由编译器在编译时完成的。

现代 JVM 不是经典的纯解释器,而是使用“JIT”(Just In Time)编译器将小段 Java 字节码编译为 native 机器代码,就在其执行之前,使用缓存来避免已知的第二次编译.class 文件,还使用性能数据的运行时跟踪来更好地指示 JIT 编译器,哪些字节码应该进行大量优化(经常运行或内部循环),哪些字节码应该尽快编译,而不关注性能。

因此,对于现代 JVM,很难谈论解释器,它是相当复杂的解决方案。 C# 经常甚至更进一步,有时将部分二进制文件预编译为通用平台的机器代码(字节码形式仅作为不常见平台的后备)。

机器代码不会发生这些(甚至不相似)。它只在 CPU 上执行。

关于assembly - 字节码和汇编语言是一回事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39083991/

相关文章:

c - 编译器会把跳转表放在函数的末尾吗?

汇编 MOV 指令操作数

assembly - 正确编译多个 asm 文件并将其链接到 .vfd - 对于 Oracle VM?

c++ - 使用 C++ 从 .swf 中提取变量

java - 为什么 2 * (i * i) 在 Java 中比 2 * i * i 快?

assembly - 汇编中的 "MOV"指令是分配内存吗?

linux - VNC 服务器正在::1:5901 上运行

sockets - 在 erlang 节点之间发送大文件

java - 如何获取java MethodDeclaration对应的Byte code

assembly - 汇编语言的汇编和链接步骤