Go 語言語法樹是 Go 語言源文件的另一種語義等價(jià)的表現(xiàn)形式,Go 語言自帶的go fmt 和 go doc等命令都是建立在 Go 語言語法樹基礎(chǔ)之上的分析工具。本書從Go 語言語法樹出發(fā),重新審視Go 語言源文件,闡述定制Go 語言的核心技術(shù)。書中通過對(duì) go/ast、go/ssa 等包的分析,-步步深入Go 語言核心,最后簡(jiǎn)要介紹 LLVM,讀者可以結(jié)合 IIVM 和 Go 語言語法樹按需定制,創(chuàng)造一個(gè)語法與 Go 語言語法頭似的簡(jiǎn)單的編程語言及與其對(duì)應(yīng)的編譯器,達(dá)到掌握自制編程語言和編譯器的目的。
本書面向已經(jīng)熟練掌握 Go 語言并在進(jìn)行項(xiàng)目開發(fā)的程序員,也適合想深入了解 Go 語言底層運(yùn)行機(jī)制的程序員閱讀,同時(shí)可作為對(duì)編程語言/編譯器有興趣并想進(jìn)行實(shí)際項(xiàng)目實(shí)踐的程序員的參考書。
1.深入淺出,接觸核心
理解Go語言語法樹的工作原理,提升編程技藝,學(xué)習(xí)編譯器的原理與實(shí)現(xiàn),編寫更效率的代碼;通過理解簡(jiǎn)單的“凹語言”,深刻理解Go語言特性,獲得自制一門編程語言的啟發(fā)。
2.內(nèi)容針對(duì)性與專業(yè)性強(qiáng)
本書面向已經(jīng)熟練掌握 Go 語言并在進(jìn)行項(xiàng)目開發(fā)的程序員,也適合想深入了解 Go 語言底層運(yùn)行機(jī)制的程序員閱讀,同時(shí)可作為對(duì)編程語言/編譯器有興趣并想進(jìn)行實(shí)際項(xiàng)目實(shí)踐的程序員的參考書。
柴樹杉,Go/C/匯編語言愛好者,《Go語言高級(jí)編程》作者之一,關(guān)注與匯編語言相關(guān)的底層技術(shù)。他目前在螞蟻集團(tuán)從事領(lǐng)域特定語言(DSL)的設(shè)計(jì)和開發(fā)工作。
史斌,有十余年編譯器和虛擬機(jī)開發(fā)經(jīng)驗(yàn)。Go和LLVM 開源項(xiàng)目貢獻(xiàn)者,擁有這兩個(gè)項(xiàng)目官方代碼倉(cāng)庫(kù)的提交權(quán)限,目前兩個(gè)項(xiàng)目的提交記錄都超過100次。他在全球Go貢獻(xiàn)者榜上長(zhǎng)期排名TOP50,目前致力于國(guó)產(chǎn)芯片軟件生態(tài)系統(tǒng)的構(gòu)建工作。
丁爾男,Go/C/Web前端技術(shù)愛好者,長(zhǎng)年從事3D開發(fā)工作,熱衷于性能優(yōu)化。他目前在武漢航天遠(yuǎn)景科技股份有限公司分管3D相關(guān)產(chǎn)品的開發(fā)工作。
第 1章 詞法單元 1
1.1 詞法單元簡(jiǎn)介 2
1.2 表示詞法單元的數(shù)據(jù)類型 3
1.3 FileSet和File 6
1.4 解析詞法單元 7
1.5 位置信息 10
1.6 小結(jié) 11
第 2章 基礎(chǔ)字面值 13
2.1 基礎(chǔ)字面值的定義 13
2.2 基礎(chǔ)字面值的語法樹結(jié)構(gòu) 15
2.3 構(gòu)造基礎(chǔ)字面值 16
2.4 解析基礎(chǔ)字面值 17
2.5 標(biāo)識(shí)符字面值 18
2.6 小結(jié) 19
第3章 基礎(chǔ)表達(dá)式 21
3.1 語法規(guī)范 21
3.2 解析表達(dá)式 22
3.3 求值表達(dá)式 25
3.4 標(biāo)識(shí)符:為表達(dá)式引入變量 26
3.5 小結(jié) 28
第4章 代碼結(jié)構(gòu) 29
4.1 目錄結(jié)構(gòu)和包結(jié)構(gòu) 29
4.2 文件結(jié)構(gòu) 30
4.3 診斷語法樹 34
4.4 小結(jié) 36
第5章 通用聲明 39
5.1 導(dǎo)入聲明 39
5.2 類型聲明 42
5.3 常量聲明 44
5.4 變量聲明 46
5.5 聲明分組 48
5.6 小結(jié) 49
第6章 函數(shù)聲明 51
6.1 語法規(guī)范 51
6.2 函數(shù)聲明和方法聲明 52
6.3 參數(shù)列表和返回值列表 54
6.4 小結(jié) 55
第7章 復(fù)合類型 57
7.1 語法規(guī)范 57
7.2 基礎(chǔ)類型 58
7.3 指針類型 61
7.4 數(shù)組類型 63
7.5 切片類型 66
7.6 結(jié)構(gòu)體類型 67
7.7 映射類型 70
7.8 管道類型 71
7.9 函數(shù)類型 72
7.10 接口類型 73
7.11 小結(jié) 75
第8章 更復(fù)雜的字面值 77
8.1 語法規(guī)范 77
8.2 函數(shù)字面值 78
8.3 復(fù)合字面值的語法 80
8.4 數(shù)組字面值和切片字面值 81
8.5 結(jié)構(gòu)體字面值 83
8.6 映射字面值 85
8.7 小結(jié) 86
第9章 復(fù)合表達(dá)式 87
9.1 表達(dá)式語法 87
9.2 類型轉(zhuǎn)換和函數(shù)調(diào)用 88
9.3 點(diǎn)選擇運(yùn)算 90
9.4 索引運(yùn)算 91
9.5 切片運(yùn)算 92
9.6 類型斷言 93
9.7 小結(jié) 95
第 10章 語句塊和語句 97
10.1 語法規(guī)范 97
10.2 空語句塊 98
10.3 表達(dá)式語句 100
10.4 返回語句 101
10.5 聲明語句 103
10.6 短聲明語句和多賦值語句 104
10.7 if/else分支語句 106
10.8 for循環(huán) 108
10.9 類型斷言 111
10.10 go語句和defer語句 113
10.11 小結(jié) 114
第 11章 類型檢查 115
11.1 語義錯(cuò)誤 115
11.2 go/types包 116
11.3 跨包的類型檢查 118
11.4 小結(jié) 122
第 12章 語義信息 123
12.1 名字空間 123
12.2 整體架構(gòu) 127
12.3 小結(jié) 128
第 13章 靜態(tài)單賦值形式 129
13.1 靜態(tài)單賦值簡(jiǎn)介 129
13.2 生成靜態(tài)單賦值 130
13.3 靜態(tài)單賦值解釋執(zhí)行 134
13.4 go/ssa包的架構(gòu) 136
13.5 小結(jié) 138
第 14章 凹語言 139
14.1 Hello,凹語言 139
14.2 訪問全局變量 144
14.3 調(diào)用自定義函數(shù) 153
14.4 四則運(yùn)算 157
14.5 分支控制 160
14.6 導(dǎo)入函數(shù) 165
14.7 小結(jié) 168
第 15章 LLVM簡(jiǎn)介 169
15.1 背景介紹 169
15.2 安裝LLVM 171
15.3 printf函數(shù) 172
15.4 簡(jiǎn)單的四則運(yùn)算 175
15.5 比較運(yùn)算 176
15.6 分支與循環(huán) 177
15.7 基本塊 180
15.8 PHI指令 182
15.9 有限循環(huán) 184
15.10 小結(jié) 185
第 16章 LLVM示例 187
16.1 W語言 187
16.2 W語言編譯器wcc的設(shè)計(jì) 189
16.3 W語言編譯器wcc的實(shí)現(xiàn) 191
16.4 W語言的代碼示例 198
16.5 小結(jié) 200
后記 201