本書的出版具有里程碑意義:它第一次讓編譯原理不再像是一門高深晦澀的“數(shù)學(xué)課”,而是一個(gè)可以調(diào)試、可以接觸、可以真切感受的理論體系。本書用1140余幅信息量巨大的運(yùn)行時(shí)結(jié)構(gòu)圖和視頻動(dòng)畫取代了同類書中復(fù)雜枯燥的數(shù)學(xué)公式,更加立體和直觀,生動(dòng)地將編譯后的執(zhí)行程序在內(nèi)存中的運(yùn)行時(shí)結(jié)構(gòu)圖展現(xiàn)了出來;它第一次將GCC源代碼、編譯原理、運(yùn)行時(shí)結(jié)構(gòu)、編譯系統(tǒng)原理(包含匯編與鏈接)的內(nèi)在關(guān)系、邏輯與原理梳理清楚了,并將它們結(jié)合成一個(gè)整體。真正能夠讓讀者透徹掌握編譯器如何運(yùn)行和如何設(shè)計(jì),以及為什么要這么設(shè)計(jì);它是第一本系統(tǒng)解讀著名商用編譯器GCC核心源代碼的著作,GCC源代碼一共有600萬(wàn)行,為了便于講解和閱讀,本書進(jìn)行了取舍和裁剪,講解了與編譯本質(zhì)相關(guān)的最核心的60萬(wàn)行代碼。
目 錄
作者簡(jiǎn)介
前 言
第1章 運(yùn)行時(shí)結(jié)構(gòu)及編譯過程概述 1
1.1 一個(gè)簡(jiǎn)單C程序的運(yùn)行時(shí)結(jié)構(gòu) 1
1.2 更為復(fù)雜C程序的運(yùn)行時(shí)結(jié)構(gòu) 16
1.3 編譯過程概述 25
1.3.1 詞法分析 25
1.3.2 語(yǔ)法分析 26
1.3.3 從語(yǔ)法樹到中間代碼再到目標(biāo)代碼 26
第2章 詞法分析 28
2.1 詞法分析概要說明 28
2.2 詞法分析過程 31
2.3 狀態(tài)轉(zhuǎn)換圖 36
2.3.1 狀態(tài)轉(zhuǎn)換圖總體介紹 36
2.3.2 依托狀態(tài)轉(zhuǎn)換圖展現(xiàn)詞法分析過程 42
2.4 GCC實(shí)現(xiàn)詞法分析的源代碼 55
2.4.1 詞法分析源代碼總覽 55
2.4.2 結(jié)合GCC源代碼講解詞法分析過程 55
2.4.3 標(biāo)識(shí)符、數(shù)字、字符和字符串的詳細(xì)分析過程 65
第3章 語(yǔ)法分析 74
3.1 語(yǔ)法分析綜述 74
3.2 語(yǔ)法分析思路 74
3.3 產(chǎn)生式 78
3.3.1 什么是產(chǎn)生式 78
3.3.2 產(chǎn)生式的具體示例 80
3.4 匹配產(chǎn)生式,消除左遞歸 89
3.4.1 用標(biāo)準(zhǔn)產(chǎn)生式做匹配,出現(xiàn)左遞歸 89
3.4.2 消除左遞歸 93
3.4.3 產(chǎn)生式的工作效率 97
3.5 提取左公因子,消除回溯 100
3.5.1 對(duì)“直接聲明符”的產(chǎn)生式提取左公因子 100
3.5.2 用提取過左公因子的產(chǎn)生式再去匹配 102
3.5.3 對(duì)其他產(chǎn)生式都提取左公因子 103
3.5.4 函數(shù)聲明和定義兩部分產(chǎn)生式的合并 105
3.6 語(yǔ)法分析結(jié)果:語(yǔ)法樹 107
3.7 GCC關(guān)于語(yǔ)法分析的源代碼解析 112
3.7.1 GCC語(yǔ)法分析函數(shù)調(diào)用圖 112
3.7.2 全部語(yǔ)句的語(yǔ)法分析 115
第4章 語(yǔ)法樹到目標(biāo)代碼 217
4.1 總述語(yǔ)法樹到中間代碼的轉(zhuǎn)化過程 217
4.2 目標(biāo)代碼到運(yùn)行時(shí)結(jié)構(gòu)的映射 224
4.3 語(yǔ)法樹轉(zhuǎn)高端gimple 232
4.3.1 語(yǔ)法樹到高端gimple的總體步驟及運(yùn)行時(shí) 236
4.3.2 高端gimple的實(shí)際數(shù)據(jù)結(jié)構(gòu) 241
4.3.3 語(yǔ)法樹轉(zhuǎn)高端gimple的GCC源代碼解析 246
4.4 高端gimple到低端gimple 286
4.4.1 高端gimple轉(zhuǎn)低端gimple概述 286
4.4.2 高端gimple轉(zhuǎn)化低端gimple的GCC代碼解析 293
4.5 低端gimple到cfg 297
4.5.1 低端gimple到cfg的轉(zhuǎn)化概述 297
4.5.2 低端gimple轉(zhuǎn)cfg的實(shí)際過程 300
4.6 cfg轉(zhuǎn)ssa 301
4.7 生成RTL 305
4.7.1 為何要有RTL 305
4.7.2 轉(zhuǎn)化RTL階段的主要步驟 306
4.7.3 確定初始RTL中的運(yùn)行時(shí)信息 320
4.8 RTL生成目標(biāo)代碼(匯編) 332
4.8.1 匯編文件介紹 332
4.8.2 創(chuàng)建匯編文件 334
4.8.3 輸出匯編文件總?cè)肟?nbsp; 334
4.8.4 全局變量寫入?yún)R編文件 335
4.8.5 函數(shù)寫入?yún)R編文件 340
第5章 語(yǔ)句拓展案例的編譯過程 353
5.1 總述各個(gè)語(yǔ)句拓展案例的編譯過程 353
5.2 if語(yǔ)句的語(yǔ)法分析 376
5.2.1 多個(gè)變量的聲明語(yǔ)句語(yǔ)法分析 376
5.2.2 if語(yǔ)句的語(yǔ)法分析過程 381
5.2.3 if...else if語(yǔ)句的語(yǔ)法分析過程 387
5.3 帶標(biāo)號(hào)語(yǔ)句的語(yǔ)法分析 395
5.4 switch...case、goto、break語(yǔ)句的語(yǔ)法分析過程 399
5.4.1 switch...case 語(yǔ)句 399
5.4.2 goto語(yǔ)句 407
5.4.3 分析break語(yǔ)句 409
5.5 do...while、while、for語(yǔ)句的語(yǔ)法分析過程 420
5.5.1 do...while語(yǔ)句的語(yǔ)法分析 424
5.5.2 while語(yǔ)句的語(yǔ)法分析過程 433
5.5.3 for語(yǔ)句的語(yǔ)法分析過程 444
5.6 各種語(yǔ)句嵌套組合的語(yǔ)法分析過程 472
5.6.1 兩條變量聲明語(yǔ)句分析的結(jié)果 477
5.6.2 分析while循環(huán)語(yǔ)句 477
5.6.3 進(jìn)入if進(jìn)行分析 480
5.6.4 進(jìn)入else進(jìn)行分析 485
5.7 所有案例語(yǔ)法樹轉(zhuǎn)中間結(jié)構(gòu)的過程 516
5.7.1 案例1的語(yǔ)法樹轉(zhuǎn)高端gimple的總體介紹 516
5.7.2 案例1的語(yǔ)法樹轉(zhuǎn)高端gimple的代碼分析 528
5.7.3 案例1的高端gimple轉(zhuǎn)低端gimple 552
5.7.4 案例1的低端gimple到cfg 552
5.7.5 轉(zhuǎn)化RTL階段的主要步驟 562
5.7.6 案例2的語(yǔ)法樹轉(zhuǎn)高端gimple 587
5.7.7 案例3的語(yǔ)法樹轉(zhuǎn)高端gimple 596
第6章 數(shù)據(jù)拓展案例的編譯過程 612
6.1 數(shù)據(jù)拓展案例的編譯過程總述 612
6.1.1 基礎(chǔ)類型數(shù)據(jù)總述 612
6.1.2 用戶自定義類型數(shù)據(jù)總述 617
6.1.3 指針類型數(shù)據(jù)總述 626
6.1.4 作用域和生存期總述 640
6.1.5 表達(dá)式總述 645
6.2 基礎(chǔ)類型數(shù)據(jù)的語(yǔ)法分析過程 652
6.2.1 非浮點(diǎn)型數(shù)據(jù)的語(yǔ)法分析 653
6.2.2 浮點(diǎn)型數(shù)據(jù)的語(yǔ)法分析 662
6.3 復(fù)合類型數(shù)據(jù)的語(yǔ)法分析過程 670
6.3.1 數(shù)組的語(yǔ)法分析 670
6.3.2 枚舉類型數(shù)據(jù)的語(yǔ)法分析 675
6.3.3 struct類型數(shù)據(jù)的語(yǔ)法分析 678
6.3.4 union類型數(shù)據(jù)的語(yǔ)法分析 683
6.3.5 自定義數(shù)據(jù)聲明和使用的語(yǔ)法分析 684
6.4 指針類型數(shù)據(jù)的語(yǔ)法分析過程 693
6.4.1 對(duì)swap_point函數(shù)中指針的語(yǔ)法分析 693
6.4.2 對(duì)指針使用的語(yǔ)法分析 696
6.5 關(guān)于作用域和生存期的語(yǔ)法分析過程 705
6.5.1 C語(yǔ)言作用域和生存期概述 705
6.5.2 全局變量data語(yǔ)法分析中作用域相關(guān)處理過程 706
6.5.3 fun函數(shù)定義的語(yǔ)法分析中作用域相關(guān)處理 709
6.5.4 main函數(shù)定義中局部變量聲明data作用域處理過程 716
6.5.5 main函數(shù)內(nèi)部語(yǔ)句塊中變量nCount作用域處理過程 719
6.5.6 main函數(shù)中引用變量data時(shí)選擇相應(yīng)聲明節(jié)點(diǎn)的過程分析 719
6.5.7 main函數(shù)中引用變量nCount時(shí)選擇相應(yīng)聲明節(jié)點(diǎn)的過程分析 720
6.5.8 main函數(shù)中退出內(nèi)部語(yǔ)句塊時(shí)更新變量作用域過程分析 721
6.5.9 fun函數(shù)中靜態(tài)變量temp生存期信息的語(yǔ)法分析 726
6.6 表達(dá)式的語(yǔ)法分析過程 728
6.6.1 if條件中的表達(dá)式語(yǔ)法分析 728
6.6.2 if條件下面“語(yǔ)句”部分的表達(dá)式語(yǔ)法分析 740
6.7 所有案例語(yǔ)法樹轉(zhuǎn)中間結(jié)構(gòu)(RTL)的過程 754
6.7.1 基礎(chǔ)類型數(shù)據(jù)語(yǔ)法樹轉(zhuǎn)高端gimple的過程 754
6.7.2 用戶自定義數(shù)據(jù)語(yǔ)法樹轉(zhuǎn)高端gimple的過程 794
6.7.3 指針類型數(shù)據(jù)語(yǔ)法樹轉(zhuǎn)高端gimple的過程 838
6.7.4 作用域和生存期案例語(yǔ)法樹轉(zhuǎn)高端gimple的過程 878
6.7.5 復(fù)雜表達(dá)式案例的語(yǔ)法樹轉(zhuǎn)高端gimple的過程 887
第7章 匯編與鏈接 934
7.1 匯編器 934
7.1.1 詳細(xì)介紹匯編指令到機(jī)器指令的轉(zhuǎn)化 934
7.1.2 .o文件格式總體情況介紹 953
7.1.3 代碼段、數(shù)據(jù)段以及其他各個(gè)表項(xiàng)間的關(guān)系 962
7.1.4 從匯編文件到目標(biāo)文件的實(shí)現(xiàn) 967
7.1.5 匯編器處理的源代碼分析 973
7.2 鏈接器 985
7.2.1 .o文件鏈接總體介紹 985
7.2.2 多個(gè).o文件鏈接時(shí)通過符號(hào)表建立關(guān)系 989
7.2.3 鏈接時(shí)統(tǒng)一計(jì)算地址并回填 997
7.2.4 鏈接器源代碼介紹 999
7.2.5 庫(kù)函數(shù)的鏈接 1002
7.2.6 動(dòng)態(tài)鏈接 1002
第8章 預(yù)處理 1012
8.1 文件包含 1012
8.2 宏定義 1017
8.3 條件編譯 1019
8.4 帶參數(shù)的宏定義 1022
附錄 RTX定義 1031
作者的話 1039