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