首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字节码到底是如何被“解析”的?

字节码到底是如何被“解析”的?
EN

Software Engineering用户
提问于 2016-11-03 14:40:37
回答 2查看 2.5K关注 0票数 4

字节码是如何“解析”的?

据我所知,字节码是给定编程语言语法的二进制中间表示。某些编程语言将其源文本转换为字节码,然后将其写入文件。这些语言的虚拟机如何“解析”它们的字节码?

为了缩小这个问题的范围,以Python的字节码为例。当Python开始从*.pyc文件中读取字节码时,虚拟机如何将它正在读取的字节流转换成特定的指令?

当虚拟机从文件中读取字节码时,我的理解是字节码是一个很长的字节流。那么,字节码是如何分解成有用的块的呢?如何将其转换为操作码和操作码参数?

例如,假设虚拟机正在字节码中读取以添加两个数字。Virtal看到指令0x05,这意味着“添加两个数字”。

每个数字可以用不同的字节数表示,那么虚拟机如何知道需要提前读取多少字节才能收集op 0x05的参数呢?

EN

回答 2

Software Engineering用户

发布于 2016-11-03 17:07:07

字节码被解码。它们的设计类似于处理器指令集。因为字节码是可变长度的,即使我们知道它们在哪里,为了对它们进行解码,您必须从一开始就解码(通常是一种方法)。

当您到达分支指令(特别是有条件的)时,您可以选择遵循分支目标或秋季指令(下一条指令)。如果你是在解释,你会做前者,当JITing时,你可能会做后者。

每个编码字节表示要执行的指令及其长度。简单、通用的操作是在一个字节内编码的。其他操作使用额外的字节。解码器查看到目前为止字节的值,然后可以最低限度地确定指令是完成了还是多了一个字节。一些编码可能指示多个附加字节。

看看Java字节码类文件格式,以及VAX指令集体系结构,这是一个可变长度和高度规则的体系结构。Java字节码使用堆栈体系结构,级别相当高(就像字节码一样),而VAX是寄存器机器,级别较低。(您也可以查看x86,但这不太常见,因此更复杂。)

票数 4
EN

Software Engineering用户

发布于 2016-11-03 16:36:57

该文件将有一个包含有关版本、可执行字节码所在位置(可能还包括包含在其中的函数的信息)和常量数据(如字符串)的信息的小标题。关于堆栈溢出,有关python字节码的问题已经被问到了.

字节码本身通常是一个非常简单的语法。其中前几个字节指示必须执行的操作以及需要什么操作数。字节码的设计使得当每个字节读取字节时,对指令的解释是明确的。

为了给出一个使每个操作的字节非常显式的例子,有斯皮尔-V。每条指令的前4字节字被构造为2字节长+2字节操作码.

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

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

复制
相关文章

相似问题

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