WebAssembly 系列(第三部分) - 彙編(assembly)速成課
ofollow,noindex">原文連結
這是 WebAssembly 系列的第三篇,如果你沒讀過第一篇,我建議你讀下。
為了理解 WebAssembly 是如何工作的,有助於理解彙編是什麼,並且編譯器如何生成它的。
在上一篇文章中,我談論過與機器交流就像跟一個外星人交流一樣。

我想看下外星人的大腦是如何工作的 - 機器的大腦是如何解析和理解傳入的交流?
大腦的一部分專門用於思考 - 加法,減法,邏輯運算。附近還有部分大腦提供了短期記憶,另外一部分提供了長期記憶。
這些不同的部分都有名字的。
- 思考的部分是算數邏輯單元(ALU)
- 暫存器提供短期記憶
- 隨機存取儲存器(RAM)提供長期記憶

機器程式碼中的指令被稱為指令。
當有一個指令進入大腦時會發生什麼?被分成不同的部分,代表不同的東西。
指令被分割的方式特定於腦部的佈線。
例如,一個大腦的連線方式是取前六位數字,然後輸送到 ALU。ALU 會基於 0 和 1 的位置辨識出需要執行加法操作。
這個資料塊被稱為 “操作碼”,因為它告訴了 ALU 要執行什麼操作。

然後大腦會獲取兩個包含三個 bite 的資料塊,代表相加的兩個數字。它們可能是暫存器的地址。

機器碼的上面的註釋,對於我們人類來說可以理解發生了什麼。這就是彙編。被稱為象徵性的機器程式碼,對於人來說理解機器碼的一種方式。
你可以看到在 assembly 和機器碼之間有非常明顯的關係。 因此,不同的機器架構的彙編不一樣。當你在一個機器中有一個不同的架構時,它很可能需要自己的彙編方言。
因此,我們翻譯的不止一個目標平臺。機器碼不是一種語言,它包含很多種機器碼。就像我們說不同的語言,機器也說不同的語言。
拿人類語言翻譯為外星人理解的語言來說,你的語言背景可能是英語,俄語,或者普通話,翻譯為外星人語言A,或者外星人語言B。在程式語言中,就像把 C 或者 C++ 翻譯為 x86 或者 ARM。
你想要能夠翻譯任意一種高階程式語言為任意一種組合語言(對應於不同的架構體系)。其中一個解決方法是為每一個高階語言建立一個能夠翻譯為每種彙編的翻譯器。

這可能有些低效。為了解決這個問題,大多數編譯器會在之間放置至少一箇中間層。編譯器將會將高階程式語言轉換為又不是高階程式語言,但也不是機器碼的一種語言,被稱為中間表示(IR)。

這意味著編譯器可以將任何一個高階語言翻譯為 IR 語言。編譯器的另一部分將 IR 編譯為目標架構適合的機器碼。
編譯器的前一部分將高階程式語言為 IR。編譯器的後一部分將 IR 編譯為目標架構的彙編程式碼。

結論
這就是彙編及編譯器是如何將高階程式語言轉換為彙編。在下一篇文章中,我們會討論下 WebAssembly 是如何適合這個的。