研究Java语言的编译器和虚拟机源代码
现在使用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语言的编译器和虚拟机源代码的更多相关文章
- IT兄弟连 Java语法教程 Java语言入门 典面试题
1.请说明JVM.JRE和JDK是什么?它们有什么关系? JVM是Java虚拟机,Java Virtual Machine的缩写,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实 ...
- 学了编译原理能否用 Java 写一个编译器或解释器?
16 个回答 默认排序 RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...
- java语言与jvm虚拟机简介
一.java语言 1.1 支持面向对象编程oop 强调支持,因为java同样可以面向过程编程. oop的三大特性是:封装.继承.多态. 封装主要针对成员变量而言,oop的思想要求成员变量均为私有,不应 ...
- 【总结】java命令解析以及编译器,虚拟机如何定位类
学Java有些日子了,一直都使用IDE来写程序.这样的好处就是能让我连如何用命令行编译,解释执行Java源代码都不知道,就更不清楚JDK中的编译器和虚拟机(包含字节码解释器)是如何定位到类文件的.悲哀 ...
- 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势
0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...
- 瘋耔java语言笔记
一◐ java概述 1.1 ...
- 《JAVA语言程序设计》上课笔记
教学目标:1.使学生了解JAVA课程的性质.定位.作用:为什么要学习JAVA?让学生知道如何学好JAVA: 教学内容: 一. 问几个问题 1. 你们到这里来干什么 ...
- Java 语言的发展史
维基百科引入 早期的Java 语言最开始只是Sun计算机(Sun MicroSystems)公司在1990年12月开始研究的一个内部项目.Sun计算机公司的一个叫做帕特里克·诺顿的工程师被公司自己开发 ...
- 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词
第01章 计算机.程序和Java概述 CPU(Central Processing Unit) * 中央处理器 Control Unit * 控制单元 arithmetic/logic unit /ə ...
随机推荐
- 使用animate.css
今天有个一前辈来看了一下我的小程序啊,说写的还行就是可以不用只按照ui给的图写界面,自己可以添加一些动态的炫酷效果,不用不知道一用吓一跳啊,用之前觉得好好一个界面为什么要搞那些花里胡哨的东西,单纯一点 ...
- Django中ORM的优化
1. exists( ) 什么时候用 count( ) 和 len( )什么时候合适, 用values( )或values_list( )只取需要的列的数据 iterator()对数据对象生成迭代器, ...
- Unity 单例模式
明天十一放假,今天不知什么原因看到一篇unity单例模式的介绍,瞬间来了戾气. (一)最简单的单利 public class WebRequestUtility : MonoBehaviour { p ...
- 透明度设置opacity
透明度设置opacity属性 示例 <!DOCTYPE html> <html> <head> <style> div { background-col ...
- 详细讲解IPython
ipython是一个python的交互式shell,比默认的python shell好用得多,支持变量自动补全,自动缩进,支持bash shell命令,内置了许多很有用的功能和函数.学习ipython ...
- Arthas - Java 线上问题定位处理的终极利器
前言 在使用 Arthas 之前,当遇到 Java 线上问题时,如 CPU 飙升.负载突高.内存溢出等问题,你需要查命令,查网络,然后 jps.jstack.jmap.jhat.jstat.hprof ...
- python基础-列表List及内置方法
数据类型之列表-List 用途:用于存一个或多个不同类型的值 定义:通过中括号存值,每个值之间通过逗号进行分隔 l1 = [1,'a',3,'b'] 特性:有序.可变.存多个值的数据类型 常用方法: ...
- 学习笔记15_ASP母版页
*网页母版页设计通用样式#header:{height:100px;width:1000px}#leftDiv:{float:left;width:200px}#mainDiv:{margin-lef ...
- 聚类(一)——Kmeans
Clustering 聚类K-means 聚类是机器学习和数据挖掘领域的主要研究方向之一,它是一种无监督学习算法,小编研究生时期的主要研究方向是“数据流自适应聚类算法”,所以对聚类算法有比较深刻的理解 ...
- echarts动态刷新数据
在这次的项目中图表显示的部分比较多,这边给分享下用到的图表的数据刷新 饼图最后的效果 先看下 前端部分 <div div style="height: 40%; width: 17.5 ...