许多VM执行一种二进制形式的语言,称为“字节码”,它是从人类可读的“程序集”语言中组装而来的。
例如,程序集指令push 1 push 2 add被翻译成一系列的1和0,然后由VM执行。
为什么?为什么JVM和JVM不直接执行组装指令呢?
他们没有物理计算机的限制,只能处理1和0。JVM可以很好地接受文本指令(如push 1 push 2 )并按原样执行它们。为什么要增加编译的步骤?
发布于 2014-08-04 00:43:37
以下是思考的几个理由:
使用人类可读的汇编语言会浪费磁盘和内存上的空间。这会影响缓存,因此也会影响性能。在您的示例中,指令“push”占用四个字节。为什么不对所有指令使用一个字节标记来压缩程序,而不是使用人类可读的字符串?
它在处理器上浪费周期。您的VM可能至少有两个以'p‘开头的指令助记符。为了让VM知道指令是“push”还是“pop”,它必须至少比较两个字节。如果可以通过查看单个字节来唯一地标识每条指令,则效率要高得多。您的指令的参数是一个表示数字的字符串。字符串必须转换成适合它们底层CPU的二进制格式,然后才能用于算术。这种转换本身将需要数十条指令。为什么每次程序运行时都这样做?在创建字节码时,在一次传递中这样做效率要高得多。
发布于 2014-08-04 00:13:05
程序集不是二进制代码。程序集是二进制代码的文本表示形式。为了执行它,您必须首先通过生成字节码或机器代码的汇编程序运行它,这需要时间。
虽然可以从字节码汇编程序组装字节码程序,但大多数程序员不这样做。相反,他们使用一种高级语言直接编译成字节码.
因此,不需要组装步骤。
字节码与实际执行程序的处理器指令不一样。VM必须首先将字节码转换为处理器指令,然后执行这些处理器指令。这样做是因为字节码与机器无关;您可以在拥有完全不同的指令集的处理器上使用相同的字节代码,只要您为该处理器拥有一个VM。
发布于 2014-08-04 00:34:45
字节码的存储效率更高,对VM的解析更容易(因此更快)。
字节码(“程序集”语言)的文本表示主要用于理解字节码编译器的内部和/或分析优化传递。正如Robert所说,大多数程序员永远不会直接处理字节码,因此几乎没有理由这么做。
https://softwareengineering.stackexchange.com/questions/252178
复制相似问题