編譯器如何生成彙編
理解什麼是彙編,以及編譯器如何生成它,對於理解 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 翻譯成目標機器的彙編程式碼。
總結
本文介紹了什麼是彙編以及編譯器是如何把高階語言翻譯成組合語言的,在下一篇文章中,我們來介紹 WebAssembly 的工作原理。
相關文章
- WebAssembly 系列(三)編譯器如何生成彙編Web編譯
- 淺談彙編器、編譯器和直譯器編譯
- JVM 模板直譯器之如何根據位元組碼生成彙編碼?JVM
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- gcc 編譯器與 clang 編譯器GC編譯
- 編譯、彙編、連結、載入、顯示編譯
- 編譯器是如何工作的?編譯
- 編譯器的編譯基本過程編譯
- 一張圖解析 編譯器編譯流程圖解編譯
- 程式碼線上編譯器(上)- 編輯及編譯編譯
- Java 反彙編、反編譯、volitale解讀Java編譯
- [譯]iOS編譯器iOS編譯
- GCC內聯彙編(2)GCC生成彙編程式碼簡單例項GC單例
- gcc 從語言編譯全過程 預處理---->編譯---->彙編----->連結GC編譯
- CUDAFORTRAN編譯器編譯
- vue編譯器Vue編譯
- [bazel]-如何編譯編譯
- ubuntu x86-64位機器下編譯32位彙編的問題Ubuntu編譯
- 編譯器的自展和自舉、交叉編譯編譯
- 第19篇 Protocol Buffers 編譯器生成proto檔案Protocol編譯
- 競速(二): JavaScript編譯器如何工作JavaScript編譯
- FreeBSD中的GNU C編譯器--編譯器GCC(轉)編譯GC
- mingw 編譯生成的dll 如何在vs中使用編譯
- CSS預編譯器CSS編譯
- 富文字編譯器編譯
- JavaScript編譯器BabelJavaScript編譯Babel
- 編譯器相關編譯
- Oracle編譯器警告Oracle編譯
- 使用C編譯器編寫shellcode編譯
- Go編譯器簡介【譯】Go編譯
- oracle11g編譯生成bbedOracle編譯
- 如何用cmake編譯編譯
- python如何編譯Python編譯
- 如何製作一款線上編譯器編譯
- Vue3原始碼分析——編譯模組和編譯器Vue原始碼編譯
- 在Progress編輯器中批次編譯程式編譯
- x86彙編反編譯到c語言之——(2)if語句編譯C語言
- objc系列譯文(6.2):編譯器OBJ編譯