深入解析Java編譯器:源碼剖析與實例詳解( 簡體 字) | |
作者:馬智 著 | 類別:1. -> 程式設計 -> 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源代碼已經開源,可以通過多種途徑獲取。讀者可以直接訪問以下網址獲取: 讀者反饋 由于筆者水平所限,書中可能還存在一些疏漏,敬請讀者指正,筆者會及時進行調整和修改。 致謝 在本書的寫作過程中,得到了很多朋友及同事的幫助和支持,在此表示由衷的感謝! 感謝歐振旭編輯在本書出版過程中給予筆者的大力支持與幫助! 最后感謝我的家人在寫作時給予我的理解與支持,在我遇到挫折和問題時,家人都堅定地支持著我。愛你們! 馬智 |