彙編快速入門

本文是 WebAssembly 系列文章的第三部分。若是你尚未閱讀過前面的文章,咱們建議你 從頭開始前端

理解彙編和編譯器如何生成它的有助於你後續理解 WebAssembly 的工做原理,react

介紹 JIT 的文章裏,我談到了與機器交流的方式和與外星人通訊是類似的。android

一我的用源代碼示意,外星人以二進制迴應

我如今真想看看外星人大腦的思考方式——即機器大腦解析和理解通訊的機制。ios

大腦中有一部分專門用來思考(例如作加減或其餘邏輯運算),一部分提供短時間記憶存儲,還有一部分提供長期記憶存儲。git

這幾個不一樣的部分都有各自的名稱:github

  • 負責思惟的部分稱爲算術邏輯單元 (ALU)。
  • 短時間存儲由寄存器提供。
  • 長期存儲由隨機存取存儲器 (RAM) 提供。

圖爲 CPU,包含 ALU、寄存器和 RAM

機器碼中的句子被稱爲指令。web

當一條指令進入大腦時會發生什麼?它會被分解成帶不一樣含義的不一樣部分。編程

指令分解的方式是特定於當前大腦構造的。後端

例如,這種結構的大腦可能老是將前六個字節傳送給 ALU。ALU 根據接收到的序列中 1 和 0 的排列,就會明白鬚要將兩個東西加在一塊兒。架構

這個字段稱爲操做碼(opcode),它的做用是告訴 ALU 要執行的操做。

從 16 字節指令中取出 6 個字節並傳送給 ALU

接下來大腦會取後續兩個三字節的字段來肯定要相加的兩個數。這兩個數會存儲在寄存器中。

兩個 3 字節字段被解碼用以肯定源寄存器

注意這裏機器碼上方的註釋,有助於咱們理解這個過程。這就叫作彙編。這段代碼稱爲符號機器碼。符號機器碼是人類理解機器碼的一種方式。

你會發現彙編和這臺機器的機器碼有很直接的關係。所以不一樣的機器架構對應有不一樣的彙編方式。當你遇到使用不一樣架構的機器時,可能就得按它們本身的方式進行彙編。

所以,咱們的翻譯對象並不止一個。機器碼不止一種語言,有許多不一樣種類的機器碼。就像咱們人類會說不一樣的語言同樣,機器也會使用不一樣的語言。

隨着人類和外星人之間的翻譯問題解決,你也能夠將英語、俄語、普通話等語言轉化成外星文A、外星文B了。對編程而言,就是將 C、C++、Rust 等語言轉化成 x8六、ARM。

若是你想將任意一種高級語言編譯成對應任意體系結構的彙編語言,一種方法是建立一整套不一樣語言到不一樣彙編的轉化器。

圖中左側爲編程語言 C、C++ 和 Rust,右側爲彙編語言 x86 和 ARM,各組合分別以箭頭鏈接

但這樣的作法很是低效。大部分編譯器會在中間放置至少一箇中間層。編譯器接收高級編程語言並將其轉化成相對底層的形式,轉化結果也不能和機器碼同樣直接運行。這類形式稱爲(IR)。

圖中解釋了高級語言和彙編語言以及中間表示(IR)的關係,箭頭由高級編程語言指向 IR,又由 IR 指向彙編語言

這意味着編譯器能夠將任意一種高級編程語言翻譯成一種 IR 語言。編譯器的另外一部分將獲得的 IR 內容編譯成特定於目標架構的語言。

編譯器的前端部分將高級編程語言翻譯成 IR 語言,再由後端將它們從 IR 語言編譯成目標架構的彙編代碼。

與上圖相同,增長了前端和後端的註釋

總結

以上就是彙編的簡要說明,以及編譯器將高級程序語言轉成彙編的過程。在下一篇文章裏,咱們將會看到 WebAssembly 是如何實現的。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃

相關文章
相關標籤/搜索