现在使用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. Visual Studio Code 添加C/C++编译功能

    VS Code作为一个文本/代码编辑器,相较于VS比较轻量化,而且可以支持C/C++.Python等多种语言,并具有丰富的拓展模块. 但是作为一个编辑器,在VS Code上安装C/C++模块之后,并不 ...

  2. The usage of Markdown---链接的使用

    目录 1. 序言 2. 网页链接 3. 图片链接 4. 页内跳转 更新时间:2019.09.14 1. 序言   在编辑文章的时候,我们常常需要插入各种链接,比如说网页链接,图片链接等等.当文章篇幅过 ...

  3. 身为一个 CS专业的留学生,你还在为堆积如山的编程assignment而发愁吗?

    每个人都渴望圆梦,当我们看见梦想在别人身上实现时,总在抱怨幸运之神为何不眷顾自己:其实更多的时候,梦想就在你身边的不远处,只要你迈出正确的步伐. 记得刚入大学时,意气风发.我以全班前几名的优异成绩考入 ...

  4. C加加学习之路 2——两招让你成为牛X的T型人才

    有个小伙伴在微信上问我: 我刚工作半年,有时候对于Java的发展方向有点迷茫,Java的范围是在是太广了,我有时候会不知道从哪开始入手,我想问一下,您有什么好的建议吗? 我理解这位朋友的问题是:工作中 ...

  5. MongoDB Java API操作很全的整理

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,一般生产上建议以共享分片的形式来部署. 但是MongoDB官方也提供了其它语言的客户端操作API.如下图所示: 提供了C.C++ ...

  6. Xcode添加 eclipse 删除行、复制行快捷键

    在使用eclipse过程中,特喜欢删除一行和复制一行的的快捷键.而恰巧Xcode不支持这两个快捷键,再一次的恰巧让笔者发现了一个小窍门来增加这两个快捷键,以下是步骤: <p> </p ...

  7. SpringBoot中在除Controller层 使用Validation的方式

    说明:Validation 在Controller层使用Validation应该都使用过了,以下方式可以使用 Validation 在Service层完成对dto的属性校验,避免写一堆的 if els ...

  8. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作

    以前写过ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本. 先决条件 我在B站有一个非常入门的ASP.NET Core 3.0的视频教程,如果您对ASP.NET Co ...

  9. IDEA复制多行及对多行代码上下左右移动

    复制: 复制一行可不需要选中 多行需要选中 mac:command+D window:ctrl+D 移动: 选中代码 左移:tab+shift 右移:tab 上移:shift+alt+向上方向键 下移 ...

  10. 查找一个卷对应的osd

    1.首先找到卷的id: 2.使用rados命令找到卷上面的对象数据: 3.通过ceph osd map命令可以查询到对象对应的pgid及pg对应的osd: