这是关于 WebAssembly 及其速度优势的系列文章的第三部分。如果您还没有阅读其他部分,我们建议您 从头开始阅读。
为了理解 WebAssembly 的工作原理,了解什么是汇编语言以及编译器如何生成汇编语言是有帮助的。
在关于 JIT 的文章 中,我谈到了如何与机器进行通信就像与外星人进行通信一样。
现在我想看看外星大脑是如何工作的——机器的大脑是如何解析和理解传入的通信的。
这个大脑的一部分专门用于思考——例如加减或逻辑运算。大脑附近还有一部分提供短期记忆,以及另一部分提供长期记忆。
这些不同的部分有不同的名称。
- 进行思考的部分称为算术逻辑单元 (ALU)。
- 短期记忆由寄存器提供。
- 长期记忆是随机存取存储器 (或 RAM)。
机器代码中的句子称为指令。
当其中一条指令进入大脑时会发生什么?它会被分成不同的部分,这些部分具有不同的含义。
指令的划分方式取决于这个大脑的内部连接。
例如,一个内部连接是这样的大脑可能会始终取前六位并将其传输到 ALU。ALU 会根据 1 和 0 的位置确定它需要将两个东西加在一起。
这个部分称为“操作码”或操作代码,因为它告诉 ALU 执行什么操作。
然后,这个大脑会取接下来的两个三位的部分,以确定它应该将哪两个数字加在一起。这些将是寄存器的地址。
请注意机器代码上方的注释,这使我们人类更容易理解正在发生的事情。这就是汇编语言。它被称为符号机器代码。它是人类理解机器代码的一种方式。
您可以在此处看到这种机器的汇编语言和机器代码之间存在非常直接的关系。因此,您拥有的每种类型的机器架构都有不同类型的汇编语言。当机器内部有不同的架构时,它很可能需要自己的汇编语言方言。
因此,我们的翻译目标不仅仅是一个。它不仅仅是一种名为机器代码的语言。它是许多不同种类的机器代码。正如我们人类说不同的语言一样,机器也说不同的语言。
在人与外星人翻译中,您可能从英语、俄语或普通话翻译成外星语 A 或外星语 B。在编程术语中,这就像从 C、C++ 或 Rust 翻译成 x86 或 ARM。
您希望能够将所有这些高级编程语言中的任何一种都翻译成所有这些汇编语言中的任何一种(对应于不同的架构)。一种方法是创建一个大量不同的翻译器,可以从每种语言翻译到每种汇编语言。
这将非常低效。为了解决这个问题,大多数编译器至少在两者之间设置了一层。编译器将使用这种高级编程语言,并将其翻译成不是那么高级的东西,但也无法在机器代码级别上工作。这称为中间表示 (IR)。
这意味着编译器可以接受所有这些高级语言中的任何一种,并将其翻译成一种 IR 语言。从那里,编译器的另一部分可以获取 IR 并将其编译成特定于目标架构的东西。
编译器的前端将高级编程语言翻译成 IR。编译器的后端从 IR 翻译到目标架构的汇编代码。
结论
这就是汇编语言,以及编译器如何将高级编程语言翻译成汇编语言。在 下一篇文章 中,我们将了解 WebAssembly 如何融入其中。
关于 Lin Clark
Lin 在 Mozilla 的高级开发部门工作,专注于 Rust 和 WebAssembly。
6 条评论