一、 Go編譯流程

二、程序說明
1. 詞法決議
讀取Go源檔案,將字符序列轉換為符號(token)序列,比如將“:=”轉換為_Define
代碼中的識別符號、關鍵字、運算子和分隔符等字串都將轉化為對應的符號
2. 語法決議
根據Go語言規范對符號化的Go源檔案進行決議,識別可能出現的語法錯誤,比如
1 package main 2 3 import "fmt" 4 5 func main() 6 { //這里不能單獨一行 7 fmt.Println("Hello world!") 8 } 9 10 # command-line-arguments 11 ./main.go:5:6: missing function body 12 ./main.go:6:1: syntax error: unexpected semicolon or newline before {
3. AST構建
AST,即抽象語法樹(Abstract Syntax Tree)

4. 型別檢查
a. 型別推斷
b. 陣列索引是否為正整數
c. 參考的結構體欄位是否是大寫可匯出的
5. 變數捕獲
主要針對閉包場景而言,閉包函式可能參考閉包外變數
變數捕獲需要明確在閉包中通過值參考還是地址參考來捕獲變數
6. 函式行內
函式行內是指將較小的函式直接組合進呼叫者的函式內
可以減少函式呼叫的開銷
7. 逃逸分析
逃逸分析確定變數記憶體是分配在堆疊區還是堆區
8. 閉包重寫
對閉包函式進行重寫
9. 遍歷函式
遍歷函式中的宣告和運算式,將操作函式替換為具體的執行函式,如map被替換為運行時mapaccess2_fast64函式
10. SSA生成
SSA,即靜態單賦值(Static Single Assignment),可以理解為抽象語法樹到機器碼的中間代碼
11. 機器碼生成
a. 匯編
b. 鏈接
三、可執行檔案
1. ELF
ELF,Executable and Linkable Format是類Unix作業系統下最常見的可執行且可鏈接的檔案格式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/479199.html
標籤:Go
上一篇:1.物件的參考優化,右值參考優化
下一篇:golang 應用自升級
