title: [A crash course in WebAssembly] assembly
date: 2018-3-22 23:58:00
categories: 翻譯
tags: WebAssembly
source: 原文地址
auther: Lin Clark
[A carsh course to WebAssembly] assembly
這是WebAssembly系列中的第三部分。如果您還沒有閱讀其他文章,我們建議您[從頭開始](starting from the beginning)。
為了理解WebAssembly是如何工作的,對彙編的理解是必須的,這篇文章有助於理解assembly是什麼以及編譯器如何生成它。
在上篇講JIT的文章中,我談到了與機器進行通訊就像是與外星人進行交流。
![[譯][A crash course in WebAssembly] assembly](https://i.iter01.com/images/cdc8a6e30ec599b7ba3301b15e08f7b0d2584f2e8d649ecb68d498cfd52dadc7.png)
我想現在看看這個外星人的大腦是如何工作的————這個機器的大腦如何解析和理解傳遞給它的資訊。
這個大腦的一部分專門用於思考,比如加法和減法,或者邏輯運算。還有一部分大腦提供短期記憶,另一部分提供長期記憶。
這些不同的部分有不同的名字:
- The part that does the thinking is the Arithmetic-logic Unit (ALU).
- The short term memory is provided by registers.
- The longer term memory is the Random Access Memory (or RAM).
![[譯][A crash course in WebAssembly] assembly](https://i.iter01.com/images/ca62fb6ca21f91feae36569ccb2f2b5162acc770f1c40dfa55d5d764dc841694.png)
機器程式碼中的句子稱為指令(instruction)。
當一條指令進入大腦時發生了什麼呢?指令被劃分為不同的部分並且代表了不同的意義。
指令的分割方式取決於大腦的佈線方式(the wiring of this brain)。
例如,像這樣連線的大腦可能總是會佔用前六位,並將它傳送給ALU。 ALU會根據1和0的位置來確定它需要將兩件事情加在一起。
這塊被稱為“操作碼(opcode)”或operation code,因為它告訴ALU要執行的操作。
![[譯][A crash course in WebAssembly] assembly](https://i.iter01.com/images/e7f9b48338e72f0a741e42d5426b3d66d95d67e02e7a64200c9db1a724ad91f0.png)
然後,這個大腦會分別接下來的兩個三位資料塊,以確定它應該新增哪兩個數字。這些將是暫存器的地址。
![[譯][A crash course in WebAssembly] assembly](https://i.iter01.com/images/543d4b8dd03403f9876d5acf28330c026d62c2cd66d5557aac654c69199dc5b8.png)
請注意機器程式碼上方的註釋,這使得我們人類更容易理解正在發生的事情。這就是assembly。它被稱為符號機器碼。這是人類理解機器碼的一種方式。它被稱為符號機器碼。這是人類理解機器碼的一種方式。
你可以在這裡看到,這個機器的assembly和機器碼之間有一個非常直接的關係。正因為如此,您可以擁有不同種類的機器體系結構。當你在機器內部有不同的架構時,它可能需要自己的裝配方言(dialect of assembly)。
因此我們不會只有一個翻譯的目標。這不只是一種被稱為機器碼的語言。就像我們人與人之間也會說不同的語言,機器碼也有許多種。
要是人類語翻譯到外星語,你可能使用的是英語、俄語然後轉換成外星文A、外星文B,從程式設計的角度來看,這就像從C或C++或Rust到x86或到ARM。
你如果想要能夠將一個高階程式語言向下編譯到一個組合語言(這對應於不同的體系結構),做到這一點的一種方法是建立一大堆不同的編譯器,將每種彙編碼對映到機器碼。
![[譯][A crash course in WebAssembly] assembly](https://i.iter01.com/images/a8b0ba1eb53c09179d2aae65439e04cd87898dce494c70c87139bcc2117d6f5f.png)
這會是十分低效的。為了解決這個問題,大多數編譯器至少添置一箇中間層,編譯器會獲取高階程式語言並將其編譯到並不那麼高階也不是機器碼的中間碼,這個中間碼被稱為 IR(intermediate representation)。
![[譯][A crash course in WebAssembly] assembly](https://i.iter01.com/images/3521bc1cc3f506e6fe5c81d741dd11d9dcb08571c5a5f44e64070a80de99f134.png)
這意味著編譯器可以獲取任何高階語言並且翻譯到一種IR語言。從那裡開始,編譯器的另一部分可以採用該IR並將其編譯為特定於目標體系結構的內容。然後,另一部分的編譯器可以將IR語言向下編譯到目標架構。
編譯器的前端將高階語言翻譯到IR,編譯器的後端將IR翻譯到目標架構的彙編碼。
結論
這就是assembly到底是什麼,並且編譯器是如何將高階程式語言編譯到彙編碼的。在下一篇文章中,我們會看到WebAssembly如何適應這種處理模型。