內容簡介
本書以工業級編譯器Javac的原始碼為基礎,詳細介紹了詞法分析、語法分析、語義分析及代碼生成等各個階段的具體實現,同時對重點原始碼的實現進行了詳細解讀,讓讀者能真正掌握從Java原始碼變為Class檔案的每個過程。
本書共18章,章節的前後順序與Javac編譯Java原始碼的順序嚴格對應,涵蓋的主要內容有Javac介紹、Javac檔案系統、詞法分析、語法分析之認識樹節點、語法分析之建立抽象語法樹、符號表的組織、填充符號表、插入式註解的實現、語義分析之類型轉換、語義分析之語法檢查、語義分析之引用消解、語義分析之語法樹標註、泛型的實現、數據流檢查、語法糖去除、位元組碼指令生成、重要結構的位元組碼指令生成、生成Class檔案。同時,為了讀者能更好地查閱相關信息,本書在附錄中給出了Javac命令、文法、類型常見操作、符號常見操作和虛擬機位元組碼指令表的相關內容。
本書語言簡潔,實例豐富,適合Java從業人員閱讀,可以幫助他們深入理解Javac如何支持Java語言的諸多特性,如泛型等;也適合對編譯器感興趣的讀者閱讀,可以幫助他們真正掌握如何將編譯器相關的理論知識套用到開發實踐中。
出版背景
第1章 Javac介紹 1
1.1 初識Javac 1
1.2 Javac源碼與調試 4
1.3 Javac命令 7
第2章 Javac檔案系統 12
2.1 檔案相關實現類 12
2.2 檔案的管理 25
2.2.1 獲取JavacFileManager對象 25
2.2.2 StandardLocation類 28
2.2.3 JavacFileManager類 31
第3章 詞法分析 38
3.1 字元編碼 38
3.2 獲取字元輸入流 40
3.3 Token與Name 43
3.3.1 Token介紹 44
3.3.2 Name對象的生成與存儲 47
3.3.3 Name映射為Token 51
3.4 生成Token流 52
第4章 語法分析之認識樹節點 67
4.1 定義及聲明 68
4.1.1 JCCompilationUnit類 68
4.1.2 JCImport類 69
4.1.3 JCClassDecl類 70
4.1.4 JCModifiers類 71
4.1.5 JCTypeParameter類 72
4.1.6 JCVariableDecl類 72
4.1.7 JCMethodDecl類 74
4.2 語句 75
4.2.1 JCBlock類 75
4.2.2 JCIf類 76
4.2.3 JCWhileLoop、JCDoWhileLoop、JCForLoop與JCEnhancedForLoop類 78
4.2.4 JCSwitch與JCCase類 79
4.2.5 JCTry、JCCatch與JCThrow類 81
4.2.6 JCLabeledStatement、JCReturn、JCContinue與JCBreak類 82
4.2.7 JCSynchronized類 83
4.2.8 JCAssert類 83
4.3 表達式 83
4.3.1 基本表達式 84
4.3.2 含運算符的表達式 88
4.3.3 類型相關表達式 94
4.3.4 註解表達式 97
4.4 生成樹節點 98
第5章 語法分析之建立抽象語法樹 101
5.1 定義及聲明的抽象語法樹 101
5.2 語句的抽象語法樹 112
5.3 表達式的抽象語法樹 121
5.3.1 基本表達式 122
5.3.2 含有運算符的表達式 134
5.4 遍歷抽象語法樹 140
第6章 符號表的組織 143
6.1 符號的定義 143
6.1.1 Symbol類 144
6.1.2 TypeSymbol及其子類 150
6.1.3 VarSymbol類 154
6.1.4 MethodSymbol及OperatorSymbol類 154
6.2 符號表的組織 160
6.2.1 Env類介紹 160
6.2.2 AttrContext類介紹 162
6.2.3 Scope類介紹 163
6.2.4 符號表的建立 164
6.3 類型的定義 169
6.3.1 普通類型的定義 169
6.3.2 泛型相關類型的定義 175
第7章 填充符號表 180
7.1 依賴的處理 180
7.1.1 創建包或類符號 180
7.1.2 輸入包或類下的成員符號 184
7.2 符號輸入的第一階段 189
7.2.1 Enter類 190
7.2.2 visitTopLevel()方法 192
7.2.3 visitClassDef()方法 193
7.2.4 visitTypeParameter()方法 196
7.3 符號輸入第二階段 197
7.3.1 MemberEnter類 197
7.3.2 visitImport()方法 200
7.3.3 visitMethodDef()方法 207
7.3.4 visitVarDef()方法 209
第8章 插入式註解的實現 211
8.1 註解處理器基礎 211
8.1.1 編寫註解處理器 211
8.1.2 註解配置 215
8.1.3 工具類 215
8.2 初始化註解處理器 222
8.3 運行註解處理器 226
第9章 語義分析之類型轉換 233
9.1 類型轉換的種類 233
9.2 賦值轉換 245
9.3 方法調用轉換 253
9.4 強制類型轉換 254
9.5 數字提升 266
第10章 語義分析之語法檢查 269
10.1 類型定義的檢查 269
10.1.1 父類及實現接口的檢查 269
10.1.2 類型定義的唯一性檢查 273
10.1.3 類型中方法的兼容性檢查 276
10.1.4 類型中實現方法的檢查 287
10.2 變數定義的檢查 294
10.3 方法定義的檢查 296
10.3.1 方法的唯一性檢查 296
10.3.2 方法的隱藏 298
10.3.3 方法的覆寫 303
第11章 語義分析之引用消解 307
11.1 Resolve類介紹 307
11.2 類型引用的消解 310
11.3 變數引用的消解 320
11.4 方法引用的消解 323
第12章 語義分析之語法樹標註 345
12.1 Attr類介紹 346
12.2 表達式相關樹節點的標註 348
12.2.1 JCUnary樹節點標註 348
12.2.2 JCBinary樹節點的標註 350
12.2.3 JCAssignOp樹節點的標註 351
12.3 JCIdent樹節點的標註 351
12.4 JCFieldAccess樹節點的標註 354
第13章 泛型的實現 361
13.1 泛型類型 361
13.2 泛型方法 364
13.2.1 類型推斷 365
13.2.2 鑽石語法 383
13.3 泛型擦除 386
第14章 數據流檢查 396
14.1 Flow類介紹 396
14.1.1 語句的活躍性分析 396
14.1.2 變數賦值檢查 398
14.1.3 異常檢查 405
14.2 if語句的分析 405
14.2.1 if語句 405
14.2.2 一元表達式與if語句 409
14.2.3 二元表達式與if語句 410
14.2.4 三元表達式與if語句 412
14.3 循環語句的分析 413
14.3.1 for語句 413
14.3.2 中斷循環語句 416
14.4 try語句與throw語句的分析 419
14.4.1 拋出異常 419
14.4.2 異常檢查 424
14.4.3 變數賦值狀態及語句的活躍性 430
第15章 語法糖去除 435
15.1 簡單語法糖 436
15.1.1 變長參數 436
15.1.2 條件編譯 437
15.1.3 自動裝箱與拆箱 438
15.2 語句語法糖 440
15.2.1 foreach語句 440
15.2.2 switch語句 442
15.2.3 try-with-resources語句 447
15.3 枚舉類語法糖 452
15.4 內部類語法糖 453
15.4.1 調用私有構造方法 454
15.4.2 引用成員 457
15.4.3 super關鍵字引用父類成員 470
15.4.4 訪問自由變數 472
第16章 位元組碼指令生成 486
16.1 位元組碼指令集 486
16.2 生成位元組碼指令 492
16.2.1 實現本地變數表 492
16.2.2 實現運算元棧 495
16.2.3 常量池信息的存儲 497
16.2.4 Code類介紹 499
16.3 Gen類介紹 502
16.4 可定址實體Item 506
16.4.1 LocalItem類 508
16.4.2 ImmediateItem類 512
16.4.3 StackItem類 514
16.4.4 AssignItem類 515
16.4.5 StaticItem類 517
16.4.6 MemberItem類 520
16.4.7 SelfItem類 523
16.4.8 IndexedItem類 524
第17章 重要結構的位元組碼指令生成 527
17.1 控制轉移指令與地址回填 527
17.1.1 認識控制轉移指令 527
17.1.2 地址回填 529
17.2 語句的條件判斷表達式 530
17.2.1 CondItem類 530
17.2.2 一元與二元條件判斷表達式 533
17.2.3 三元條件判斷表達式 534
17.3 if語句 536
17.4 循環語句 537
17.5 switch語句 539
17.6 異常與finally語句 545
17.6.1 異常的拋出 545
17.6.2 異常的捕獲與finally語句 545
第18章 生成Class檔案 553
18.1 Class檔案的結構 553
18.2 魔數與版本 556
18.3 常量池 556
18.4 類定義的基本信息 562
18.4.1 訪問標識符 562
18.4.2 類、父類及接口集合 564
18.5 欄位集合 565
18.6 方法集合 570
18.7 類屬性集合 575
18.8 描述符和簽名 581
18.8.1 描述符 581
18.8.2 簽名 582
18.8.3 描述符與簽名的實現 585
附錄A Javac命令 589
附錄B 文法 592
附錄C 類型常見操作 600
C.1 supertype()方法 600
C.2 interfaces()方法 604
C.3 asSuper()方法 606
C.4 asOuterSuper()方法 608
C.5 isSameType()方法 609
C.6 L()與U()方法 615
C.7 lowerBound()與upperBound()方法 616
C.8 containsType()方法 617
C.9 hasSameArgs()方法 621
C.10 subst()方法 623
C.11 memberType()方法 626
C.12 erasure()與erasureRecursive()方法 628
附錄D 符號常見操作 632
D.1 isInheritedIn()方法 632
D.2 hiddenIn()方法 633
D.3 isMemberOf()方法 634
D.4 overrides()方法 635
D.5 implementation()方法 639
附錄E 虛擬機位元組碼指令表 645
E.1 載入與存儲指令 645
E.2 運算指令 648
E.3 類型轉換指令 650
E.4 對象操作指令 651
E.5 運算元棧管理指令 652
E.6 控制轉移指令 652
E.7 方法調用和返回指令 653
E.8 異常拋出指令 654
E.9 同步指令 654
作者簡介
馬智 畢業於
天津工業大學。在校期間所修專業為軟體工程。畢業後一直從事軟體開發相關工作。先後在掌游天下、京東集團任軟體研發工程師。對程式語言的底層實現有濃厚的興趣,尤其對編譯原理有較為全面和深入的研究。深入研究過openJDK的原始碼實現,其中包括
Javac編譯器的原始碼實現。