天天看點

編譯器如何生成彙編

了解什麼是彙編,以及編譯器如何生成它,對于了解 webassembly 是很有幫助的。

在上一篇關于 jit 的文章中,我介紹了和計算機打交道,就像同外星人打交道一樣。

編譯器如何生成彙編

現在來思考一下“外星人”的大腦是如何工作的——機器的“大腦”是如何對我們輸入給它的内容進行分析和了解的。

“大腦”中,有一部分負責思考——處理加法、減法或者邏輯運算。還有其他的部分分别負責短暫記憶和長期記憶的。

這些不同的部分都有自己的名字:

負責思考的部分叫做算數邏輯單元(alu)

寄存器提供短暫記憶功能

随機存取存儲器(ram)提供長期記憶功能

編譯器如何生成彙編

機器代碼中的語句稱作指令。

那麼在指令進入“大腦”以後都發生了什麼呢?它們會被切分為不同的部分傳送到不同的單元進行處理。

“大腦”切分指令通過不同連接配接線路進行。舉個例子,“大腦”會将指令最開始的 6 比特通過管道送到 alu 中。而 alu 會通過 0 和 1 的位置來決定對兩個數做加法。

這串 01 串就叫做“操作碼”,它告訴了 alu 要執行什麼樣的操作。

編譯器如何生成彙編

然後“大腦”會取後面兩個連續的 3 比特 01 串來确定把哪兩個數加到一起,而這 3 比特指的是寄存器的位址。

編譯器如何生成彙編

注意看上面機器碼的注釋:“add r1 r2”,這對于人類來講很容易了解其含義。這就是彙編,也叫符号機器碼,它使人類也能看懂機器代碼的含義。

可以看到彙編和這台機器的機器碼之間有直接的映射關系。正是因為如此,擁有不同機器結構的計算機會有不同的彙編系統。如果你有一個機器,它有自己的内部結構,那麼它就需要它所獨有的彙編語言。

從上面的分析可以知道我們進行機器碼的翻譯并不是隻有一種,不同的機器有不同的機器碼,就像我們人類也說各種各樣的語言一樣,機器也“說”不同的語言。

人類和外星人之間的語言翻譯,可能會從英語、德語或中文翻譯到外星語 a 或者外星語 b。而在程式的世界裡,則是從 c、c++ 或者 java 翻譯到 x86 或者 arm。

你想要從任意一個進階語言翻譯到衆多彙編語言中的一種(依賴機器内部結構),其中一種方式是建立不同的翻譯器來完成各種進階語言到彙編的映射。

編譯器如何生成彙編

這種翻譯的效率實在太低了。為了解決這個問題,大多數編譯器都會在中間多加一層。它會把進階語言翻譯到一個低層,而這個低層又沒有低到機器碼這個層級。這就是中間代碼( intermediate representation,ir)。

編譯器如何生成彙編

這就是說編譯器會把進階語言翻譯到 ir 語言,而編譯器另外的部分再把 ir 語言編譯成特定目标結構的可執行代碼。

重新總結一下:編譯器的前端把進階語言翻譯到 ir,編譯器的後端把 ir 翻譯成目标機器的彙編代碼。

編譯器如何生成彙編

<a></a>

作者:胡子大哈

來源:51cto

繼續閱讀