首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么VM不直接执行程序集?

为什么VM不直接执行程序集?
EN

Software Engineering用户
提问于 2014-08-03 23:53:12
回答 4查看 2.3K关注 0票数 3

许多VM执行一种二进制形式的语言,称为“字节码”,它是从人类可读的“程序集”语言中组装而来的。

例如,程序集指令push 1 push 2 add被翻译成一系列的1和0,然后由VM执行。

为什么?为什么JVM和JVM不直接执行组装指令呢?

他们没有物理计算机的限制,只能处理1和0。JVM可以很好地接受文本指令(如push 1 push 2 )并按原样执行它们。为什么要增加编译的步骤?

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2014-08-04 00:43:37

以下是思考的几个理由:

使用人类可读的汇编语言会浪费磁盘和内存上的空间。这会影响缓存,因此也会影响性能。在您的示例中,指令“push”占用四个字节。为什么不对所有指令使用一个字节标记来压缩程序,而不是使用人类可读的字符串?

它在处理器上浪费周期。您的VM可能至少有两个以'p‘开头的指令助记符。为了让VM知道指令是“push”还是“pop”,它必须至少比较两个字节。如果可以通过查看单个字节来唯一地标识每条指令,则效率要高得多。您的指令的参数是一个表示数字的字符串。字符串必须转换成适合它们底层CPU的二进制格式,然后才能用于算术。这种转换本身将需要数十条指令。为什么每次程序运行时都这样做?在创建字节码时,在一次传递中这样做效率要高得多。

票数 7
EN

Software Engineering用户

发布于 2014-08-04 00:13:05

程序集不是二进制代码。程序集是二进制代码的文本表示形式。为了执行它,您必须首先通过生成字节码或机器代码的汇编程序运行它,这需要时间。

虽然可以从字节码汇编程序组装字节码程序,但大多数程序员不这样做。相反,他们使用一种高级语言直接编译成字节码.

因此,不需要组装步骤。

字节码与实际执行程序的处理器指令不一样。VM必须首先将字节码转换为处理器指令,然后执行这些处理器指令。这样做是因为字节码与机器无关;您可以在拥有完全不同的指令集的处理器上使用相同的字节代码,只要您为该处理器拥有一个VM。

票数 8
EN

Software Engineering用户

发布于 2014-08-04 00:34:45

字节码的存储效率更高,对VM的解析更容易(因此更快)。

字节码(“程序集”语言)的文本表示主要用于理解字节码编译器的内部和/或分析优化传递。正如Robert所说,大多数程序员永远不会直接处理字节码,因此几乎没有理由这么做。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/252178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档