专注虚拟机与编译器研究

研究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 

 

 

 

 

posted on 2019-11-28 19:28  鸠摩(马智)  阅读(1328)  评论(0编辑  收藏  举报

导航