本文是圖說 WebAssembly 系列文章的第三篇。若是您還未閱讀以前的文章,建議您從第一篇入手。前端
爲了更好的理解 WebAssembly ,咱們有必要去先理解什麼是彙編(Assembly),以及編譯器是如何產生彙編的。
由於 WebAssembly 在瀏覽器中的做用跟彙編相似,這也是爲何 WebAssembly 稱爲 WebAssembly 的緣由。編程
在上一篇文章中,咱們提到,咱們跟計算機的交流就像是跟外星人的交流。segmentfault
如今,咱們來看看外星人的大腦是如何工做的。類比一下就是,計算機的大腦如何分析並理解咱們跟它交流的內容。後端
計算機的大腦中有一塊區域是專門負責思考的,這個思考就是咱們所說的加法、減法和其餘邏輯操做。
在這個區域的附近,也有一塊區域是負責短時間記憶的。固然,相對的,也存在負責長期記憶的區域。瀏覽器
人類給這些區域分別取了獨特的名字:架構
機器語言中的句子咱們把它稱爲指令。dom
當這些指令傳給計算機的大腦時會發生什麼呢?
計算機會把指令拆分紅不一樣的部分,每部分都有它們本身獨特的含義。編程語言
計算機拆分指令的方式跟計算機大腦內部的實現相關。spa
舉例來講,一種實現方式可能老是取出最開始的 6 位數據,並把它送給 ALU。
而後, ALU 根據這些 0 和 1 發現,原來它的意思是要把兩個整數加起來。翻譯
咱們把這 6 位數據組成的數據塊稱爲操做碼(Operation Code),由於告訴 ALU 須要作什麼操做。
當計算機大腦知道是要作加法操做後,它會把接下來的兩個 3 位數據塊取出來,以此來定位是哪兩個數要相加。取出的兩個 3 位數據塊對應的就是寄存器的地址,寄存器中保存的數據就是待相加的整數。
注意上圖中咱們對機器碼的註釋,根據這些註釋人類能夠很簡單地明白其中發生了什麼。
這些註釋就是彙編,也稱爲符號機器碼。它是人類把機器碼變成可直接閱讀的方式。
你可能已經發現,彙編跟該機器的機器碼有着至關直接的關係。好比上面說的 6 位、3 位數據塊等,換一臺機器可能就變成了 7 位、4 位等。
所以,實際上有不少種不一樣的彙編,分別對應不一樣的計算機架構。當你有一臺不一樣架構的計算機時,極可能你就得使用它專有的彙編。
因此,咱們的翻譯目標不止一個。
它並不只僅是一種稱爲機器碼的語言,而是多種不一樣的機器碼。這就像不一樣國家的人們說不一樣的語言同樣,不一樣架構的計算機也使用不一樣的機器語言。
在人類和外星人之間的語言翻譯中,你可能要從英語、或者俄語、或者漢語翻譯爲外星語 A、或者外星語 B。
編程語言領域也同樣,咱們須要把 C、C++、Rust 翻譯爲 x86 或者 ARM 架構的彙編。
對應不一樣架構的計算機,咱們須要一種可以把任何一種高級編程語言翻譯爲不一樣彙編的能力。
其中一種辦法就是建立全部可能的映射關係,而後實現每種語言到每種彙編的翻譯。
但這種方法是至關低效的。爲了提高效率,大多數的編譯器都會在二者之間新增一箇中間層。
這種編譯器會把高級編程語言翻譯成一種介於高級語言和機器碼之間的中間產物,稱爲中間代碼(Intermediate Representation,IR)。
這樣的話,編譯器就能夠接受任何一種高級語言,而後把它翻譯成中間代碼。
以後,編譯器的另外一部分再把中間代碼變成特定架構計算機的彙編。
按照中間代碼的生成能夠把編譯編譯流程劃分爲前端和後端。
編譯器前端接收高級編程語言,輸出中間代碼;編譯器後端則是接收中間代碼,輸出目標架構的彙編代碼。
以上的內容就是什麼是彙編以及它是如何從高級編程語言翻譯過來的。
在下一篇文章中,咱們將看到 WebAssembly 是如何生成的。