Go編譯過程

2022-10-10 22:18:31 字數 1273 閱讀 1446

一、 go編譯流程

二、過程說明

1. 詞法解析

讀取go原始檔,將字串行轉換為符號(token)序列,比如將「:=」轉換為_define

**中的識別符號、關鍵字、運算子和分隔符等字串都將轉化為對應的符號

2. 語法解析

根據go語言規範對符號化的go原始檔進行解析,識別可能出現的語法錯誤,比如

1

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 {

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作業系統下最常見的可執行且可鏈結的檔案格式。

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項,預設用於編譯和鏈結的工具。位於...