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

Gia*_*ani 7 assembly cil bytecode virtual-machine machine-code

这个问题可能看起来很奇怪,但我仍然试图掌握虚拟机的概念.我已经阅读了几个答案,但是如果Java字节码(以及MSIL)与汇编语言相同,我仍然无法得到.据我所知,字节码和汇编都被编译成机器码,所以从抽象的角度讲,它们处于同一级别,即比机器码高出一步.字节码也只是汇编语言,即人类可读的机器代码形式.如果是,那么为什么仍然使用汇编语言?为什么不用字节码(可以在不同的机器上移植)而不是汇编语言(特定于单个机器架构)进行编程?谢谢

Ped*_*d7g 5

没有。

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

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

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


编辑:

JVM原则上是解释器,即。它将字节码即时转换为机器码。就是这样,在编译时由编译器以其他语言完成。

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

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

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

  • 可能值得注意的是,没有Java字节码的标准汇编语言。尽管大多数表示看起来很相似,原因是该规范提供了指令的名称和一些伪代码示例,大多数工具都基于它们自己的语言,但它们并不是正式定义的标准,而知名的工具(如Javap)则没有注意他们的拆卸输出是否足以重新组装… (3认同)
  • @GianlucaJohnMassimiani我会说“不”。Java源代码并未按1:1编译为字节码,字节码指令看上去与Java源代码有些不同,因此Java并不是字节码的“汇编”。字节码是已编译Java源代码的二进制形式。主要的区别在于,为什么我不将“ Assembly”一词与Java一起使用:除非您是Java字节码专家,否则您不知道特定Java源的字节码的外观。在汇编中,您有一个非常准确的想法,每行将生成哪些机器代码指令,而CPU将执行什么指令。 (2认同)