- 原文地址:A crash course in assembly
- 原文做者:Lin Clark
- 译文出自:掘金翻译计划
- 译者:zhouzihanntu
- 校对者:Tina92、zhaochuanxing
本文是 WebAssembly 系列文章的第三部分。若是你尚未阅读过前面的文章,咱们建议你 从头开始。前端
理解汇编和编译器如何生成它的有助于你后续理解 WebAssembly 的工做原理,react
在介绍 JIT 的文章里,我谈到了与机器交流的方式和与外星人通讯是类似的。android
我如今真想看看外星人大脑的思考方式——即机器大脑解析和理解通讯的机制。ios
大脑中有一部分专门用来思考(例如作加减或其余逻辑运算),一部分提供短时间记忆存储,还有一部分提供长期记忆存储。git
这几个不一样的部分都有各自的名称:github
机器码中的句子被称为指令。web
当一条指令进入大脑时会发生什么?它会被分解成带不一样含义的不一样部分。编程
指令分解的方式是特定于当前大脑构造的。后端
例如,这种结构的大脑可能老是将前六个字节传送给 ALU。ALU 根据接收到的序列中 1 和 0 的排列,就会明白须要将两个东西加在一块儿。架构
这个字段称为操做码(opcode),它的做用是告诉 ALU 要执行的操做。
接下来大脑会取后续两个三字节的字段来肯定要相加的两个数。这两个数会存储在寄存器中。
注意这里机器码上方的注释,有助于咱们理解这个过程。这就叫作汇编。这段代码称为符号机器码。符号机器码是人类理解机器码的一种方式。
你会发现汇编和这台机器的机器码有很直接的关系。所以不一样的机器架构对应有不一样的汇编方式。当你遇到使用不一样架构的机器时,可能就得按它们本身的方式进行汇编。
所以,咱们的翻译对象并不止一个。机器码不止一种语言,有许多不一样种类的机器码。就像咱们人类会说不一样的语言同样,机器也会使用不一样的语言。
随着人类和外星人之间的翻译问题解决,你也能够将英语、俄语、普通话等语言转化成外星文A、外星文B了。对编程而言,就是将 C、C++、Rust 等语言转化成 x8六、ARM。
若是你想将任意一种高级语言编译成对应任意体系结构的汇编语言,一种方法是建立一整套不一样语言到不一样汇编的转化器。
但这样的作法很是低效。大部分编译器会在中间放置至少一个中间层。编译器接收高级编程语言并将其转化成相对底层的形式,转化结果也不能和机器码同样直接运行。这类形式称为(IR)。
这意味着编译器能够将任意一种高级编程语言翻译成一种 IR 语言。编译器的另外一部分将获得的 IR 内容编译成特定于目标架构的语言。
编译器的前端部分将高级编程语言翻译成 IR 语言,再由后端将它们从 IR 语言编译成目标架构的汇编代码。
以上就是汇编的简要说明,以及编译器将高级程序语言转成汇编的过程。在下一篇文章里,咱们将会看到 WebAssembly 是如何实现的。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、React、前端、后端、产品、设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划。