3dwoo大學簡體電腦書店
深入解析Java編譯器:源碼剖析與實例詳解
( 簡體 字)
作者:馬智 著類別:1. -> 程式設計 -> JAVA -> Java
出版社:機械工業出版社深入解析Java編譯器:源碼剖析與實例詳解 3dWoo書號: 52202
詢問書籍請說出此書號!
有庫存
NT售價: 895
出版日:12/1/2019
頁數:650
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787111643388 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
前言
第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
本書以工業級編譯器Javac的源代碼為基礎,詳細介紹了詞法分析、語法分析、語義分析及代碼生成等各個階段的具體實現,同時對重點源代碼的實現進行了詳細解讀,讓讀者能真正掌握從Java源代碼變為Class文件的每個過程。

本書共18章,章節的前后順序與Javac編譯Java源代碼的順序嚴格對應,涵蓋的主要內容有Javac介紹、Javac文件系統、詞法分析、語法分析之認識樹節點、語法分析之建立抽象語法樹、符號表的組織、填充符號表、插入式注解的實現、語義分析之類型轉換、語義分析之語法檢查、語義分析之引用消解、語義分析之語法樹標注、泛型的實現、數據流檢查、語法糖去除、字節碼指令生成、重要結構的字節碼指令生成、生成Class文件。同時,為了讀者能更好地查閱相關信息,本書在附錄中給出了Javac命令、文法、類型常見操作、符號常見操作和虛擬機字節碼指令表的相關內容。

本書語言簡潔,實例豐富,適合Java從業人員閱讀,可以幫助他們深入理解Javac如何支持Java語言的諸多特性,如泛型等;也適合對編譯器感興趣的讀者閱讀,可以幫助他們真正掌握如何將編譯器相關的理論知識應用到開發實踐中。
為什么要寫這本書?

  Java是一門流行多年的高級編程語言,相關的就業崗位很多,但是最近幾年卻出現了用人單位招不到人,大量研發人員找不到工作的尷尬局面。究其根本原因還是崗位對技術的要求高,不但要會應用,更要懂其內部的運行原理。對于想要深入研究Java的從業者來說,目前國內市場上還沒有一本剖析Java編譯器(Javac)源碼的書籍,也沒有一本剖析工業級編譯器源碼的書籍,這正是本書要填補的市場空白。

  本書圍繞市面上的主流編譯器Javac進行源代碼剖析,詳細介紹了詞法分析、語法分析、語義分析及代碼生成等各個階段的具體實現。另外,本書有大量的配圖和實例,以便讀者能更好地理解書中的要點。

本書有何特色

  1.內容豐富,講解詳細

  本書對Java編譯器的詞法分析、語法分析、語義分析及代碼生成等各個階段的源代碼實現做了詳細介紹,可以幫助讀者系統地掌握Java編譯器的實現原理。

  2.原理分析與實例并重

  本書對Java編譯器各個編譯階段的源代碼實現都進行了重點介紹,同時也簡單介紹了一些編譯器的基本原理,并給出了大量的配圖和實例,能讓讀者真正掌握Java編譯器的具體實現。

  3.分析工業級編譯器的源碼實現

  本書分析的編譯器Javac是一個工業級的編譯器,它是大部分Java開發人員將Java源代碼轉換為Class文件的首選編譯器。對于Java從業人員來說,本書可以讓他們學習到Javac是如何支持Java語言的相關特性的,如泛型;而對于那些對編譯器感興趣的人來說,本書則可以讓他們真正學習到如何將編譯器的相關理論知識應用到開發實踐中。

本書內容

  本書深入剖析了Javac的源代碼實現,每一章都會對重點的源代碼實現進行解讀。各章的內容簡單介紹如下:

  第1章介紹了Javac的目錄結構及源代碼調試,同時對Javac支持的編譯命令的實現進行了簡單介紹。

  第2章介紹了Javac操作文件(如讀取.java文件、讀取JAR包)相關的類。

  第3章介紹了Javac將讀取到的Java源代碼的字符流轉換為Token流的過程。

  第4章介紹了抽象語法樹的每個樹節點,這些樹節點可以大概劃分為定義及聲明、語句與表達式。

  第5章介紹了如何建立抽象語法樹,即Javac根據Token流建立一個完整的抽象語法樹。

  第6章介紹了符號表的結構,同時也對Javac中使用的符號及類型做了詳細介紹。

  第7章進行符號表的填充,分兩個階段對抽象語法樹進行掃描,然后向符號表中填充相關的符號。

  第8章介紹了插入式注解的具體實現過程。

  第9章介紹了Java的類型轉換,重點介紹了賦值轉換、方法調用轉換、強制類型轉換及數字提升這些上下文環境中的類型轉換實現。

  第10章介紹了語法檢查,主要是對類型定義、變量定義及方法定義的合法性進行檢查。

  第11章介紹了引用消解,主要是查找表達式中所引用的唯一符號,Resolve類中提供了對類型引用、變量引用及方法引用的具體查找方法。

  第12章對抽象語法樹進行了類型與符號標注,重點介紹了一些重要樹節點,如JCIdent和JCFieldAccess等的具體標注過程。

  第13章介紹了泛型的實現。泛型類型或泛型方法等與泛型相關的特性完全由編譯器來支持,而在后續生成Class文件的過程中需要對泛型進行擦除。

  第14章介紹了數據流分析,分別從變量賦值、語句活躍性及異常這3個方面對if判斷語句、循環語句及try語句等進行分析。

  第15章介紹了語法糖去除,分別對簡單的語法糖、語句語法糖、枚舉類語法糖與內部類語法糖進行分析。

  第16章介紹了字節碼指令的生成,通過簡單模擬Java虛擬機運行時的情況來更好地生成字節碼指令。

  第17章介紹了重要結構的字節碼指令生成,對一些常見的控制結構,如if語句、循環語句、switch語句及try語句等指令的生成過程進行了詳細介紹。

  第18章介紹了Class文件的生成,根據Class文件規范生成可被Java虛擬機加載運行的文件。

  附錄A介紹了Javac支持的命令。

  附錄B介紹了Java語言涉及的文法。

  附錄C介紹了對類型的常見操作。

  附錄D介紹了對符號的常見操作。

  附錄E介紹了虛擬機字節碼指令。

本書讀者對象

  閱讀本書需要讀者有一定的編程經驗,最好是對Java語言有一定的了解。具體而言,本書主要適合以下讀者閱讀:

* 想深入學習Java語言特性的Java從業人員;

* 想通過實踐學習編譯器理論的人員,如高校相關專業的學生;

* 想借鑒編譯器架構的人員;

* 對大型工程源代碼感興趣的人員。

本書閱讀建議

  本書每一章都和前后章形成了承前啟后的關系,所以建議讀者在閱讀本書的過程中,嚴格按照章節的順序進行閱讀,同時也建議讀者在閱讀每一章的過程中對書中給出的實例進行實踐,以便更好地理解本書所講的內容。

  Javac有10萬行以上的源代碼實現,并且代碼的邏輯密度非常大。讀者閱讀相關源代碼的實現時,建議不要過分糾結于每個實現細節,否則會陷入細節的“汪洋大海”中。本書對Javac的重點源代碼進行了解讀,讀者可以參考書中對這些重點源代碼的講解進行閱讀和調試即可。

本書配套資源獲取方式

  本書涉及的Javac源代碼已經開源,可以通過多種途徑獲取。讀者可以直接訪問以下網址獲取:

讀者反饋

  由于筆者水平所限,書中可能還存在一些疏漏,敬請讀者指正,筆者會及時進行調整和修改。
致謝

  在本書的寫作過程中,得到了很多朋友及同事的幫助和支持,在此表示由衷的感謝!

  感謝歐振旭編輯在本書出版過程中給予筆者的大力支持與幫助!

  最后感謝我的家人在寫作時給予我的理解與支持,在我遇到挫折和問題時,家人都堅定地支持著我。愛你們!

馬智
pagetop