一、 go編譯流程
二、過程說明
1. 詞法解析
讀取go原始檔,將字串行轉換為符號(token)序列,比如將「:=」轉換為_define
**中的識別符號、關鍵字、運算子和分隔符等字串都將轉化為對應的符號
2. 語法解析
根據go語言規範對符號化的go原始檔進行解析,識別可能出現的語法錯誤,比如
13. ast構建package main
23 import "
fmt"45
func main() 6 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 {
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作業系統下最常見的可執行且可鏈結的檔案格式。
go 編譯過程 day01
將高階語言編譯成機器可以執行的語言的過程 go語言編譯方式 go build 源 gogo run 源 go 交叉編譯 cgo enabled 0 goos linux goarch amd64 go build main.go編譯流程 源 source code 預處理器 preprocessor...
go交叉編譯
指定叉編譯目標 goarch 目標平台 編譯後的目標平台 的處理器架構 386 amd64 arm goos 目標平台 編譯後的目標平台 的作業系統 darwin freebsd linux windows 一 windows 下編譯linux 64位可執行程式 set cgo enabled 0 ...
Go交叉編譯
使用go語言做了乙個微服務,微服務中的乙個功能,需要呼叫底層so。該微服務執行於arm64架構,系統為aarch64 gnu linux。因此需要交叉編譯。第一步 編寫編譯指令碼,指令碼中需要設定環境變數 go build v 第二步 調整gcc編譯環境。如下圖中5項,預設用於編譯和鏈結的工具。位於...