图说 WebAssembly(三):什么是汇编

本文是图说 WebAssembly 系列文章的第三篇。若是您还未阅读以前的文章,建议您从第一篇入手。前端

为了更好的理解 WebAssembly ,咱们有必要去先理解什么是汇编(Assembly),以及编译器是如何产生汇编的。
由于 WebAssembly 在浏览器中的做用跟汇编相似,这也是为何 WebAssembly 称为 WebAssembly 的缘由。编程

上一篇文章中,咱们提到,咱们跟计算机的交流就像是跟外星人的交流。segmentfault

03-01-alien03.png

什么是汇编

如今,咱们来看看外星人的大脑是如何工做的。类比一下就是,计算机的大脑如何分析并理解咱们跟它交流的内容。后端

计算机的大脑中有一块区域是专门负责思考的,这个思考就是咱们所说的加法、减法和其余逻辑操做。
在这个区域的附近,也有一块区域是负责短时间记忆的。固然,相对的,也存在负责长期记忆的区域。浏览器

人类给这些区域分别取了独特的名字:架构

  • 负责思考的区域称为算术逻辑单元(Arithmetic-logic Unit, ALU)
  • 负责短时间记忆的区域称为寄存器(Register)
  • 负责长期记忆的区域称为随机存储器(Random Access Memory, RAM),也就是内存

03-02-computer_architecture09.png

机器语言中的句子咱们把它称为指令dom

当这些指令传给计算机的大脑时会发生什么呢?
计算机会把指令拆分红不一样的部分,每部分都有它们本身独特的含义。编程语言

计算机拆分指令的方式跟计算机大脑内部的实现相关。spa

举例来讲,一种实现方式可能老是取出最开始的 6 位数据,并把它送给 ALU。
而后, ALU 根据这些 0 和 1 发现,原来它的意思是要把两个整数加起来。翻译

咱们把这 6 位数据组成的数据块称为操做码(Operation Code),由于告诉 ALU 须要作什么操做。

03-03-computer_architecture12.png

当计算机大脑知道是要作加法操做后,它会把接下来的两个 3 位数据块取出来,以此来定位是哪两个数要相加。取出的两个 3 位数据块对应的就是寄存器的地址,寄存器中保存的数据就是待相加的整数。

03-04-computer_architecture17.png

注意上图中咱们对机器码的注释,根据这些注释人类能够很简单地明白其中发生了什么。
这些注释就是汇编,也称为符号机器码。它是人类把机器码变成可直接阅读的方式。

汇编的生成

你可能已经发现,汇编跟该机器的机器码有着至关直接的关系。好比上面说的 6 位、3 位数据块等,换一台机器可能就变成了 7 位、4 位等。
所以,实际上有不少种不一样的汇编,分别对应不一样的计算机架构。当你有一台不一样架构的计算机时,极可能你就得使用它专有的汇编。

因此,咱们的翻译目标不止一个。
它并不只仅是一种称为机器码的语言,而是多种不一样的机器码。这就像不一样国家的人们说不一样的语言同样,不一样架构的计算机也使用不一样的机器语言。

在人类和外星人之间的语言翻译中,你可能要从英语、或者俄语、或者汉语翻译为外星语 A、或者外星语 B。
编程语言领域也同样,咱们须要把 C、C++、Rust 翻译为 x86 或者 ARM 架构的汇编。

对应不一样架构的计算机,咱们须要一种可以把任何一种高级编程语言翻译为不一样汇编的能力。
其中一种办法就是建立全部可能的映射关系,而后实现每种语言到每种汇编的翻译。

03-05-langs05.png

但这种方法是至关低效的。为了提高效率,大多数的编译器都会在二者之间新增一个中间层。
这种编译器会把高级编程语言翻译成一种介于高级语言和机器码之间的中间产物,称为中间代码(Intermediate Representation,IR)。

03-06-langs06.png

这样的话,编译器就能够接受任何一种高级语言,而后把它翻译成中间代码。
以后,编译器的另外一部分再把中间代码变成特定架构计算机的汇编。

按照中间代码的生成能够把编译编译流程划分为前端和后端。
编译器前端接收高级编程语言,输出中间代码;编译器后端则是接收中间代码,输出目标架构的汇编代码。

03-07-langs09.png

结束

以上的内容就是什么是汇编以及它是如何从高级编程语言翻译过来的。
下一篇文章中,咱们将看到 WebAssembly 是如何生成的。

相关文章
相关标签/搜索