了解什么是程序集,以及编译器如何生成它,有助于理解WebAssembly。在我关于JIT的上一篇文章中,我描述了与计算机打交道就像与外星人打交道。现在想想“外星”大脑是如何工作的——机器的“大脑”是如何分析和理解我们输入给它的内容的。在“大脑”中,有一个部分负责思考——处理加减法或逻辑运算。还有其他部分分别负责短期记忆和长期记忆。这些不同的部分有名称:进行思考的部分称为算术逻辑单元(ALU)寄存器提供短期记忆随机存取存储器(RAM)提供长期记忆机器代码中的语句称为指令。那么指令进入“大脑”后会发生什么呢?它们会被切割成不同的部分,然后送到不同的单位进行加工。“大脑”分割指令是通过不同的连接线进行的。例如,“大脑”将指令的前6位通过管道传递给ALU。ALU会通过0和1的位置来决定两个数相加,这串01叫做“操作码”,它告诉ALU要进行什么样的运算。然后“大脑”会取下面两个连续的3位01串来决定把哪两个数加在一起,这3位指的是寄存器的地址。注意上面机器码的注释:“ADDR1R2”,人类很容易理解它的意思。这就是汇编,也叫符号机器码,使人类能够理解机器码的含义。可见汇编与本机的机器码之间存在直接映射关系。正因为如此,不同机器架构的计算机有不同的装配系统。如果你的机器有自己的内部结构,它就需要有自己的汇编语言。从上面的分析可以知道,我们的机器码翻译并不仅仅只有一种。不同的机器有不同的机器码。正如我们人类也会说各种语言一样,机器也会“说”不同的语言。人类和外星人之间的语言翻译,可能从英语、德语或汉语翻译成外星语言A或外星语言B。在编程世界中,它从C、C++或JAVA转换为x86或ARM。你想从任何一种高级语言翻译成多种汇编语言中的一种(取决于机器内部结构),其中一种方法是创建不同的翻译器来完成各种高级语言的映射组装。这种翻译效率太低了。为了解决这个问题,大多数编译器都会在中间多加一层。它会将高级语言翻译成较低的层次,而这个较低的层次并不比机器码层次低。这就是中间代码(intermediaterepresentation,IR)。这意味着编译器将高级语言翻译成IR语言,编译器的另一部分将IR语言编译成特定目标结构的可执行代码。再总结一下:编译器前端将高级语言翻译成IR,编译器后端将IR翻译成目标机的汇编代码。总结一下这篇关于汇编是什么以及编译器是如何将高级语言翻译成汇编语言的文章,下一篇我们将介绍WebAssembly是如何工作的。
