為什么要寫這《深入解析Java編譯器:源碼剖析與實(shí)例詳解》?
Java是一門流行多年的高級(jí)編程語(yǔ)言,相關(guān)的就業(yè)崗位很多,但是最近幾年卻出現(xiàn)了用人單位招不到人,大量研發(fā)人員找不到工作的尷尬局面。究其根本原因還是崗位對(duì)技術(shù)的要求高,不但要會(huì)應(yīng)用,更要懂其內(nèi)部的運(yùn)行原理。對(duì)于想要深入研究Java的從業(yè)者來(lái)說(shuō),目前國(guó)內(nèi)市場(chǎng)上還沒(méi)有一本剖析Java編譯器(Javac)源碼的書籍,也沒(méi)有一本剖析工業(yè)級(jí)編譯器源碼的書籍,這正是本書要填補(bǔ)的市場(chǎng)空白。
本書圍繞市面上的主流編譯器Javac進(jìn)行源代碼剖析,詳細(xì)介紹了詞法分析、語(yǔ)法分析、語(yǔ)義分析及代碼生成等各個(gè)階段的具體實(shí)現(xiàn)。另外,本書有大量的配圖和實(shí)例,以便讀者能更好地理解書中的要點(diǎn)。
《深入解析Java編譯器:源碼剖析與實(shí)例詳解》有何特色
1.內(nèi)容豐富,講解詳細(xì)
《深入解析Java編譯器:源碼剖析與實(shí)例詳解》對(duì)Java編譯器的詞法分析、語(yǔ)法分析、語(yǔ)義分析及代碼生成等各個(gè)階段的源代碼實(shí)現(xiàn)做了詳細(xì)介紹,可以幫助讀者系統(tǒng)地掌握J(rèn)ava編譯器的實(shí)現(xiàn)原理。
2.原理分析與實(shí)例并重
《深入解析Java編譯器:源碼剖析與實(shí)例詳解》對(duì)Java編譯器各個(gè)編譯階段的源代碼實(shí)現(xiàn)都進(jìn)行了重點(diǎn)介紹,同時(shí)也簡(jiǎn)單介紹了一些編譯器的基本原理,并給出了大量的配圖和實(shí)例,能讓讀者真正掌握J(rèn)ava編譯器的具體實(shí)現(xiàn)。
3.分析工業(yè)級(jí)編譯器的源碼實(shí)現(xiàn)
《深入解析Java編譯器:源碼剖析與實(shí)例詳解》分析的編譯器Javac是一個(gè)工業(yè)級(jí)的編譯器,它是大部分Java開(kāi)發(fā)人員將Java源代碼轉(zhuǎn)換為Class文件的首選編譯器。對(duì)于Java從業(yè)人員來(lái)說(shuō),《深入解析Java編譯器:源碼剖析與實(shí)例詳解》可以讓他們學(xué)習(xí)到Javac是如何支持Java語(yǔ)言的相關(guān)特性的,如泛型;而對(duì)于那些對(duì)編譯器感興趣的人來(lái)說(shuō),《深入解析Java編譯器:源碼剖析與實(shí)例詳解》則可以讓他們真正學(xué)習(xí)到如何將編譯器的相關(guān)理論知識(shí)應(yīng)用到開(kāi)發(fā)實(shí)踐中。
《深入解析Java編譯器:源碼剖析與實(shí)例詳解》內(nèi)容
本書深入剖析了Javac的源代碼實(shí)現(xiàn),每一章都會(huì)對(duì)重點(diǎn)的源代碼實(shí)現(xiàn)進(jìn)行解讀。各章的內(nèi)容簡(jiǎn)單介紹如下:
第1章介紹了Javac的目錄結(jié)構(gòu)及源代碼調(diào)試,同時(shí)對(duì)Javac支持的編譯命令的實(shí)現(xiàn)進(jìn)行了簡(jiǎn)單介紹。
第2章介紹了Javac操作文件(如讀取.java文件、讀取JAR包)相關(guān)的類。
第3章介紹了Javac將讀取到的Java源代碼的字符流轉(zhuǎn)換為Token流的過(guò)程。
第4章介紹了抽象語(yǔ)法樹的每個(gè)樹節(jié)點(diǎn),這些樹節(jié)點(diǎn)可以大概劃分為定義及聲明、語(yǔ)句與表達(dá)式。
第5章介紹了如何建立抽象語(yǔ)法樹,即Javac根據(jù)Token流建立一個(gè)完整的抽象語(yǔ)法樹。
第6章介紹了符號(hào)表的結(jié)構(gòu),同時(shí)也對(duì)Javac中使用的符號(hào)及類型做了詳細(xì)介紹。
第7章進(jìn)行符號(hào)表的填充,分兩個(gè)階段對(duì)抽象語(yǔ)法樹進(jìn)行掃描,然后向符號(hào)表中填充相關(guān)的符號(hào)。
第8章介紹了插入式注解的具體實(shí)現(xiàn)過(guò)程。
第9章介紹了Java的類型轉(zhuǎn)換,重點(diǎn)介紹了賦值轉(zhuǎn)換、方法調(diào)用轉(zhuǎn)換、強(qiáng)制類型轉(zhuǎn)換及數(shù)字提升這些上下文環(huán)境中的類型轉(zhuǎn)換實(shí)現(xiàn)。
第10章介紹了語(yǔ)法檢查,主要是對(duì)類型定義、變量定義及方法定義的合法性進(jìn)行檢查。
第11章介紹了引用消解,主要是查找表達(dá)式中所引用的唯一符號(hào),Resolve類中提供了對(duì)類型引用、變量引用及方法引用的具體查找方法。
第12章對(duì)抽象語(yǔ)法樹進(jìn)行了類型與符號(hào)標(biāo)注,重點(diǎn)介紹了一些重要樹節(jié)點(diǎn),如JCIdent和JCFieldAccess等的具體標(biāo)注過(guò)程。
第13章介紹了泛型的實(shí)現(xiàn)。泛型類型或泛型方法等與泛型相關(guān)的特性完全由編譯器來(lái)支持,而在后續(xù)生成Class文件的過(guò)程中需要對(duì)泛型進(jìn)行擦除。
第14章介紹了數(shù)據(jù)流分析,分別從變量賦值、語(yǔ)句活躍性及異常這3個(gè)方面對(duì)if判斷語(yǔ)句、循環(huán)語(yǔ)句及try語(yǔ)句等進(jìn)行分析。
第15章介紹了語(yǔ)法糖去除,分別對(duì)簡(jiǎn)單的語(yǔ)法糖、語(yǔ)句語(yǔ)法糖、枚舉類語(yǔ)法糖與內(nèi)部類語(yǔ)法糖進(jìn)行分析。
第16章介紹了字節(jié)碼指令的生成,通過(guò)簡(jiǎn)單模擬Java虛擬機(jī)運(yùn)行時(shí)的情況來(lái)更好地生成字節(jié)碼指令。
第17章介紹了重要結(jié)構(gòu)的字節(jié)碼指令生成,對(duì)一些常見(jiàn)的控制結(jié)構(gòu),如if語(yǔ)句、循環(huán)語(yǔ)句、switch語(yǔ)句及try語(yǔ)句等指令的生成過(guò)程進(jìn)行了詳細(xì)介紹。
第18章介紹了Class文件的生成,根據(jù)Class文件規(guī)范生成可被Java虛擬機(jī)加載運(yùn)行的文件。
附錄A介紹了Javac支持的命令。
附錄B介紹了Java語(yǔ)言涉及的文法。
附錄C介紹了對(duì)類型的常見(jiàn)操作。
附錄D介紹了對(duì)符號(hào)的常見(jiàn)操作。
附錄E介紹了虛擬機(jī)字節(jié)碼指令。
本書讀者對(duì)象
閱讀本書需要讀者有一定的編程經(jīng)驗(yàn),最好是對(duì)Java語(yǔ)言有一定的了解。具體而言,《深入解析Java編譯器:源碼剖析與實(shí)例詳解》主要適合以下讀者閱讀:
? 想深入學(xué)習(xí)Java語(yǔ)言特性的Java從業(yè)人員;
? 想通過(guò)實(shí)踐學(xué)習(xí)編譯器理論的人員,如高校相關(guān)專業(yè)的學(xué)生;
? 想借鑒編譯器架構(gòu)的人員;
? 對(duì)大型工程源代碼感興趣的人員。
《深入解析Java編譯器:源碼剖析與實(shí)例詳解》閱讀建議
《深入解析Java編譯器:源碼剖析與實(shí)例詳解》每一章都和前后章形成了承前啟后的關(guān)系,所以建議讀者在閱讀本書的過(guò)程中,嚴(yán)格按照章節(jié)的順序進(jìn)行閱讀,同時(shí)也建議讀者在閱讀每一章的過(guò)程中對(duì)書中給出的實(shí)例進(jìn)行實(shí)踐,以便更好地理解本書所講的內(nèi)容。
Javac有10萬(wàn)行以上的源代碼實(shí)現(xiàn),并且代碼的邏輯密度非常大。讀者閱讀相關(guān)源代碼的實(shí)現(xiàn)時(shí),建議不要過(guò)分糾結(jié)于每個(gè)實(shí)現(xiàn)細(xì)節(jié),否則會(huì)陷入細(xì)節(jié)的汪洋大海中。本書對(duì)Javac的重點(diǎn)源代碼進(jìn)行了解讀,讀者可以參考書中對(duì)這些重點(diǎn)源代碼的講解進(jìn)行閱讀和調(diào)試即可。
《深入解析Java編譯器:源碼剖析與實(shí)例詳解》配套資源獲取方式
本書涉及的Javac源代碼已經(jīng)開(kāi)源,可以通過(guò)多種途徑獲取。讀者可以直接訪問(wèn)以下網(wǎng)址獲。
讀者反饋
由于筆者水平所限,書中可能還存在一些疏漏,敬請(qǐng)讀者指正,筆者會(huì)及時(shí)進(jìn)行調(diào)整和修改。聯(lián)系郵箱:hzbook2017@163.com。
致謝
在本書的寫作過(guò)程中,得到了很多朋友及同事的幫助和支持,在此表示由衷的感謝!
感謝歐振旭編輯在本書出版過(guò)程中給予筆者的大力支持與幫助!
最后感謝我的家人在寫作時(shí)給予我的理解與支持,在我遇到挫折和問(wèn)題時(shí),家人都堅(jiān)定地支持著我。愛(ài)你們!
……