现在使用Java语言的人很多,但是了解Java语言实现的人非常少。如果要研究Java语言的实现,推荐研究Javac和虚拟机HotSpot的源代码实现,其中Javac相当于Java编译的前端,HotSpot是Java语言运行的基础。弄懂了Javac与HotSpot,对Java语言也就达到了“精通”的地步了。

下面我结合自己的研究过程总结一下,如果要研究Javac与HotSpot,目前可参考的一些资料、论文。

1、如何研究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了解

2、如何研究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大写的那篇文章中已经列出,大家可以去看。

研究Java语言的编译器和虚拟机源代码的更多相关文章

  1. IT兄弟连 Java语法教程 Java语言入门 典面试题

    1.请说明JVM.JRE和JDK是什么?它们有什么关系? JVM是Java虚拟机,Java Virtual Machine的缩写,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实 ...

  2. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

  3. java语言与jvm虚拟机简介

    一.java语言 1.1 支持面向对象编程oop 强调支持,因为java同样可以面向过程编程. oop的三大特性是:封装.继承.多态. 封装主要针对成员变量而言,oop的思想要求成员变量均为私有,不应 ...

  4. 【总结】java命令解析以及编译器,虚拟机如何定位类

    学Java有些日子了,一直都使用IDE来写程序.这样的好处就是能让我连如何用命令行编译,解释执行Java源代码都不知道,就更不清楚JDK中的编译器和虚拟机(包含字节码解释器)是如何定位到类文件的.悲哀 ...

  5. 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势

    0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...

  6. 瘋耔java语言笔记

    一◐ java概述                                                                                        1.1 ...

  7. 《JAVA语言程序设计》上课笔记

    教学目标:1.使学生了解JAVA课程的性质.定位.作用:为什么要学习JAVA?让学生知道如何学好JAVA: 教学内容: 一.        问几个问题 1.             你们到这里来干什么 ...

  8. Java 语言的发展史

    维基百科引入 早期的Java 语言最开始只是Sun计算机(Sun MicroSystems)公司在1990年12月开始研究的一个内部项目.Sun计算机公司的一个叫做帕特里克·诺顿的工程师被公司自己开发 ...

  9. 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词

    第01章 计算机.程序和Java概述 CPU(Central Processing Unit) * 中央处理器 Control Unit * 控制单元 arithmetic/logic unit /ə ...

随机推荐

  1. 在.net core3.0中使用SignalR实现实时通信

    最近用.net core3.0重构网站,老大想做个站内信功能,就是有些耗时的后台任务的结果需要推送给用户.一开始我想简单点,客户端每隔1分钟调用一下我的接口,看看是不是有新消息,有的话就告诉用户有新推 ...

  2. StopWatch任务计时器

    介   绍: StopWatch 是用来计算程序块的执行时间工具, 目前有好多框架都有实现提供此工具(实现结果都区别不大), 本文介绍org.springframework.util.StopWatc ...

  3. 使用jquery插件uploadfive、jcrop实现头像上传

    1.html页面部分代码:(实现选着图片时,jcrop能够刷新图片) <script type="text/javascript"> $(function(){ $(& ...

  4. 基于SEER的区块链版赛亚麻将游戏Pre alpha版本内测啦!

    游戏基于SEER测试网络文体平台模块(Culture and Sports Platform,CSP),正在进行数据调试等工作,大家可以尝鲜体验. 此游戏账户和资金等核心系统完全基于区块链,但目前运行 ...

  5. Spring MVC(3)Spring MVC 高级应用

    一.Spring MVC 的数据转换和格式化 前面的应用,都只是用HandlerAdapter去执行处理器. 处理器和控制器不是一个概念,处理器是在控制器功能的基础上加上了一层包装,有了这层包装,在H ...

  6. 关于ArcGIS的OBJECTID生成策略拙见

    目录 诉求SDEOBJECTIDArcMap编辑重置OBJECTID 诉求 非GIS专业的人员可能很难理解ArcSDE中的表OBJECTID的重要性,要么总想着自己动手去维护,要么就想直接忽略它,导致 ...

  7. jwt token

    1 ,session 认证机制: ,用户登录,传递用户名和密码给客户端 ,服务器进行用户名和密码的校验,如果校验成功,将用户保存到session ,将sessionid通过cookie返回给客服端,客 ...

  8. 在移动硬盘中安装win10和macos双系统

    本文通过在SSD移动硬盘中安装win10和macos双系统,实现操作系统随身携带 小慢哥的原创文章,欢迎转载 目录 ▪ 目标 ▪ 准备工作 ▪ Step1. 清空分区,转换为GPT ▪ Step2. ...

  9. SpringBoot整合Swagger实战

    源码地址:https://github.com/laolunsi/spring-boot-examples 目前SpringBoot常被用于开发Java Web应用,特别是前后端分离项目.为方便前后端 ...

  10. C表达式中的汇编指令

    C 表达式中的汇编指令 asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 a ...