Gia*_*ani 7 assembly cil bytecode virtual-machine machine-code
这个问题可能看起来很奇怪,但我仍然试图掌握虚拟机的概念.我已经阅读了几个答案,但是如果Java字节码(以及MSIL)与汇编语言相同,我仍然无法得到.据我所知,字节码和汇编都被编译成机器码,所以从抽象的角度讲,它们处于同一级别,即比机器码高出一步.字节码也只是汇编语言,即人类可读的机器代码形式.如果是,那么为什么仍然使用汇编语言?为什么不用字节码(可以在不同的机器上移植)而不是汇编语言(特定于单个机器架构)进行编程?谢谢
没有。
Java字节码是二进制编程语言,不是“人类可读的形式”,除非您认为一堆数字可读,或者使用反汇编程序将其反转为字节码文本助记符,或者最终是Java源代码形式本身。
汇编通常是目标机器的实际指令的文本助记符,彼此之间以1:1映射,因此汇编源中的一条指令将直接转换为一条机器代码指令(尽管某些CPU和汇编器存在某些例外,例如许多RISC汇编程序会根据需要将“立即数加载寄存器”转换为多条指令-以加载任何立即数,而本机机器代码只能加载特定位,并且您必须通过多条指令来组合整个值)。
与大多数CPU机器代码相比,Java字节码是相当高级的抽象语言,指令和内存模型的重叠很小。唯一的相似之处在于,字节码以二进制形式存储,就像机器代码一样。
编辑:
JVM原则上是解释器,即。它将字节码即时转换为机器码。就是这样,在编译时由编译器以其他语言完成。
现代的JVM并不是经典的纯解释器,而是在执行之前使用“ JIT”(Just In Time)编译器将Java字节码小片段编译为本地机器代码,并使用缓存来避免对已知的.class文件进行第二次编译。 ,还使用性能数据的运行时跟踪更好地指导JIT编译器,哪些字节码应进行优化(经常运行或内部循环),而哪些则应尽快编译,而不必关注性能。
因此,对于现代JVM,很难谈论解释器,它是一个非常复杂的复杂解决方案。C#经常走得更远,有时会为通用平台提供一部分预编译为机器代码的二进制文件(字节码形式仅作为不常见平台的后备)。
机器代码不会发生所有这些(甚至不相似)。它仅在CPU上执行。
归档时间: |
|
查看次数: |
1108 次 |
最近记录: |