譯文出自:掘金翻譯計畫
譯者:zhouzihanntu
校對者:tina92、zhaochuanxing
本文是 webassembly 系列文章的第三部分。如果你還沒有閱讀過前面的文章,我們建議你 從頭開始。
理解彙編和編譯器如何生成它的有助於你後續理解 webassembly 的工作原理,
在介紹 jit 的文章裡,我談到了與機器交流的方式和與外星人通訊是相似的。
乙個人用源**示意,外星人以二進位制回應
我現在真想看看外星人大腦的思考方式——即機器大腦解析和理解通訊的機制。
大腦中有一部分專門用來思考(例如做加減或其他邏輯運算),一部分提供短期記憶儲存,還有一部分提供長期記憶儲存。
這幾個不同的部分都有各自的名稱:
圖為 cpu,包含 alu、暫存器和 ram
機器碼中的句子被稱為指令。
當一條指令進入大腦時會發生什麼?它會被分解成帶不同含義的不同部分。
指令分解的方式是特定於當前大腦構造的。
例如,這種結構的大腦可能總是將前六個位元組傳送給 alu。alu 根據接收到的序列中 1 和 0 的排列,就會明白需要將兩個東西加在一起。
這個字段稱為操作碼(opcode),它的作用是告訴 alu 要執行的操作。
從 16 位元組指令中取出 6 個位元組並傳送給 alu
接下來大腦會取後續兩個三位元組的字段來確定要相加的兩個數。這兩個數會儲存在暫存器中。
兩個 3 位元組欄位被解碼用以確定源暫存器
注意這裡機器碼上方的注釋,有助於我們理解這個過程。這就叫做彙編。這段**稱為符號機器碼。符號機器碼是人類理解機器碼的一種方式。
你會發現彙編和這台機器的機器碼有很直接的關係。因此不同的機器架構對應有不同的彙編方式。當你遇到使用不同架構的機器時,可能就得按它們自己的方式進行彙編。
因此,我們的翻譯物件並不止乙個。機器碼不止一種語言,有許多不同種類的機器碼。就像我們人類會說不同的語言一樣,機器也會使用不同的語言。
隨著人類和外星人之間的翻譯問題解決,你也可以將英語、俄語、普通話等語言轉化成外星文a、外星文b了。對程式設計而言,就是將 c、c++、rust 等語言轉化成 x86、arm。
如果你想將任意一種高階語言編譯成對應任意體系結構的組合語言,一種方法是建立一整套不同語言到不同彙編的轉化器。
圖中左側為程式語言 c、c++ 和 rust,右側為組合語言 x86 和 arm,各組合分別以箭頭連線
但這樣的做法非常低效。大部分編譯器會在中間放置至少乙個中間層。編譯器接收高階程式語言並將其轉化成相對底層的形式,轉化結果也不能和機器碼一樣直接執行。這類形式稱為(ir)。
圖中解釋了高階語言和組合語言以及中間表示(ir)的關係,箭頭由高階程式語言指向 ir,又由 ir 指向組合語言
這意味著編譯器可以將任意一種高階程式語言翻譯成一種 ir 語言。編譯器的另一部分將得到的 ir 內容編譯成特定於目標架構的語言。
編譯器的前端部分將高階程式語言翻譯成 ir 語言,再由後端將它們從 ir 語言編譯成目標架構的彙編**。
與上圖相同,增加了前端和後端的注釋
反彙編快速入門
我從事組合語言研究大概幾年前,因為是我為了開發sepl計算機語言編譯器。雖然到現在還沒有開發出 來,但是已經看到曙光了。為了研究彙編,我從反彙編入手,做了破解,脫殼,除錯等。但是彙編對我來說一直是讀天書,沒有任何突破。直到最近幾天我有了重大發現。有人說做黑客從反彙編sqlserver.exe檔案開始...
GNU ARM彙編快速入門
以前用arm的ide工具,使用的是arm標準的組合語言。現在要使用gnu的工具,當然要了解一點gnu arm彙編的不同之處。其實非常的簡單,瀏覽一下文件然後再看看程式就完全可以搞定了,或者你硬著頭皮看gnu arm的匯程式設計序,用不了多少時間你就就可以無師自通了。個人比較健忘,還是把文件翻譯了一下...
GNU ARM彙編快速入門
燕舞龍飛 前言 以 前用arm的ide工具,使用的是arm標準的組合語言。現在要使用gnu的工具,當然要了解一點gnu arm彙編的不同之處。其實非常的簡單,瀏覽一下文件然後再看看程式就完全可以搞定了,或者你硬著頭皮看gnu arm的匯程式設計序,用不了多少時間你就就可以無師自通了。個人比較健忘,還...