研究Java語言的編譯器和虛擬機可參閱的資料


現在使用Java語言的人很多,但是了解Java語言實現的人非常少。如果要研究Java語言的實現,推薦研究Javac和虛擬機HotSpot的源代碼實現,其中Javac相當於Java編譯的前端,HotSpot是Java語言運行的基礎。弄懂了Javac與HotSpot,對Java語言也就達到了“精通”的地步了。

下面我結合自己的研究過程總結一下,如果要研究Javac與HotSpot,目前可參考的一些資料、論文。 

1、如何研究HotSpot虛擬機

目前市面上主流的Java虛擬機有HotSpot、JRockit、J9等,不過Hotspot是開源的,可以獲取源代碼,然后在本地編譯調試。HotSpot是用C++語言編寫的,有100萬行左右的源代碼,如果我們着重去研究C1、C2編譯器、垃圾回收、最基礎的類加載等模塊,以及只針對某一特定平台和架構下的代碼實現(推薦研究linux平台下的x86架構實現),那也有50萬行左右的源代碼,所以對於想研究HotSpot虛擬機的Java程序員來說,挑戰還是不小的。本人結合自己研究HotSpot虛擬機源代碼的過程,給大家推薦一些資料。 

1、C和C++語言相關書籍

對於C語言,市面上經典的C語言書很多,這里只推薦幾本,如《C和指針》、《C專家編程》、《C陷阱和缺陷》等。

       

 

研究好C語言對理解C++語言很重要,而且后面介紹的一些書籍也需要C語言的知識。

C++還是要買一本比較經典權威的,推薦《C++ Primer》(中文版 第5版),這本書介紹的比較全面。 

 

 

2、Linux系統編程相關書籍

針對那些研究Linux平台下HotSpot實現的讀者來說,Linux系統下的編程知識不可少。HotSpot中有許多功能都是調用Linux系統提供的API和ABI來實現的,例如線程,Java只是將Linux的線程進行了封裝抽象,為Java編程人員提供了不同平台下線程的統一使用方式。

研究Linux源代碼實現的書不少,但我們不必研究那么深,只需要熟練掌握相關API與ABI的使用即可,這里推薦閱讀《LINUX系統編程》。

   

3、編譯原理相關書籍 

編譯原理的經典書籍有:龍書《編譯原理》、虎書《現代編譯原理》和鯨書《高級編譯器設計與實現》,封面如下:

              

 

龍書是基礎,而且講的比較全面,如果編譯原理基礎不夠的同學可以選擇先讀這本書。

虎書的實踐性比較強,而且書中提到的一些理論和算法正是龍書沒有詳細介紹的,比如寄存器分配的着色圖算法,SSA等概念,而這些是研究C2以及Graal等編譯器必須要掌握的內容。

鯨書的難度比較高,而且介紹了許多編譯器優化的手段,同時理論性也比較強,比如格理論等。一款編譯器最能體現實力的的地方還是編譯器的優化能力,如果后期想對C2以及Graal等編譯器的實現研究的透徹一些,這本書還是有必要入手的。

另外還要推薦一本不可多得的好書,《可變目標C編譯器》,這本書帶有完整的源代碼,可導入Eclipse CDT等支持C和C++編譯開發的IDEA中進行本地編譯調試,對學習編譯原理有很好的效果。更重要的是,這本書第14章關於指令選擇相關的理論在C2編譯器中也有用到,對C2編譯器實現有很深了解的大神“R 大”也提到了這點。 

4、垃圾回收相關書籍

現在市面上關於HotSpot垃圾回收相關源代碼分析的書籍有兩本,《JVM G1源碼分析和調優》和《新一代垃圾回收器ZGC設計與實現》,都是同一個人寫的,寫的還行,是我們研究G1和ZGC實現最好的參考資料了。

       

5、對JVM整體進行源代碼解讀的相關書籍 

目前市面上主要有2本,《HotSpot實戰》和《揭秘Java虛擬機:JVM設計原理與實現》

     

《HotSpot實戰》這本書出版時間比較早,雖然也有對源代碼實現的分析,但講的比較籠統,不深入,不過也值得一讀。

《揭秘Java虛擬機:JVM設計原理與實現》這本書值得一讀,尤其是對Java虛擬機了解很少並且對C和C++語言也不熟悉的人。這本書把基礎模塊的一些源代碼實現講清楚了,比如類的加載、方法的運行等,沒有涉及到對垃圾回收以及具體編譯器實現的講解。 

6、匯編語言

HotSpot無論采用解釋執行還是編譯執行,最終都會將Java源代碼翻譯為本地的匯編指令,如果讀者是研究linux平台下HotSpot的實現,可以閱讀《深入理解程序設計:使用Linux匯編語言》。另外匯編語言相關的經典書籍還有王爽的《匯編語言》,但是這本書給出的匯編代碼是Intel風格的寫法,有興趣的也可以研究下。

           

 

7、JVM虛擬機研究領域相關的人 

最后給大家推薦一些JVM虛擬機研究相關領域的人,這些人寫了一些文章或論文值得閱讀。

R 大(微信公眾號),個人認為是中文圈子里最了解 Java 虛擬機設計實現的人,尤其是對C2編譯器的實現很了解,大家如果想研究C2編譯器,可以參考他寫的這篇總結性文章,原始鏈接找不到了,找到個轉換的鏈接,如下:

https://blog.csdn.net/fishmai/article/details/77824224

鄭雨迪,在極客時間上寫了一個系列文章《深入拆解Java虛擬機》,里面還是有不少干貨的,大家可以去閱讀。

如果英文好的話,可以多去閱讀Cliff Click、Aleksey Shipilëv等大神發表的論文,相關論文的鏈接在R大寫的那篇文章中已經列出,大家可以去看。 

 

2、如何研究Javac  

Java為了實現跨平台,首先會將Java源代碼翻譯為Java字節碼。翻譯的過程由Javac來實現。Javac大概有10萬左右的代碼,不過是使用Java語言編寫的,所以對於掌握Java的人來說,可以直接將相關源代碼導入IDEA或Eclipse這樣的IDE中進行編譯調試,一步步理解翻譯的過程。  

Javac在將Java語言翻譯為字節碼的過程中到底做了哪些工作呢?如果我們要了解Javac的實現,有哪些可以參考的資料呢?本人結合自己研究的過程,給大家推薦一些資料。  

1、Java語法規范(The Java Language Specification,JLS)   

Javac會嚴格按照Java語法規范對編程人員書寫的Java源代碼進行檢查,如果出現語法錯誤,編譯器會進行錯誤提示,比如,在循環語句或switch語句之外使用break,局部變量在使用前沒有初始化等。  

Java語法規范的鏈接地址:https://docs.oracle.com/javase/specs/   

2、Java虛擬機規范(The Java Virtual Machine Specification,JVMS)   

如果Java源代碼沒有語法錯誤,那么Javac會將Java源代碼按照Java虛擬機規范生成可被虛擬機加載運行的Class文件,Class文件的格式以及為可執行語句生成的指令等都在Java虛擬機規范中進行了明確規定,Javac必須在生成Class文件時嚴格遵守。  

Java虛擬機規范:https://docs.oracle.com/javase/specs/   

3、《深入解析Java編譯器:源碼剖析與實例詳解》  

這是一本專門講解Javac源代碼分析相關的書籍。 

    

詳細情況可通過鏈接https://www.cnblogs.com/mazhimazhi/p/11950146.html了解

如果有志同道合的朋友,我們可以加個微信,一起研究 Javac 與 HotSpot 源代碼,共同進步。我的微信號:mazhimazh 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM