研究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 /ə ...
随机推荐
- Spring Cloud ---- 服务消费与负载均衡(Rest + Ribbon )
上一篇主要写了基于Eurake的服务的注册,主要就是创建注册中心,创建服务者,将服务者注册到注册中心,完成服务的暴露.这一篇主要写服务的消费与服务消费的负载均衡. 服务的调用方式有两种,Rest + ...
- MySQL GROUP_CONCAT()函数 -- 字段合并查询
在做查询的时候遇到一个问题,今天分享一下解决方法. 先看一下我想要什么效果. 清单名称类型要点,后面两列为清单步骤(外键表) 但我并不想让主表的内容重复那么多遍,于是 distinct去重.子查询.左 ...
- 实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务
本文为实战SpringCloud响应式微服务系列教程第九章,讲解使用Spring WebFlux构建响应式RESTful服务.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 从本节开始我们 ...
- Mui 长按保存图片
必须先要 引入 mui.js,然后参考具体代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...
- 【原创】go语言学习(十一)package简介
目录 Go源码组织方式 main函数和main包 编译命令 自定义包 init函数以及执行行顺序 _标识符 Go源码组织方式 1. Go通过package的方式来组织源码 package 包名 注意: ...
- 【IT教程-Oracle】尚观Oracle白金级入门教程
链接: https://pan.baidu.com/s/1GMncQN6mpgaH3hZQjGelaA 提取码: qu6j
- 零基础小白入门IT开发指南
先自我介绍以下,本人是一枚刚毕业不到两年的某一线城市的程序员,本科阶段专业是计算机科学与技术.从大四开始出去实习到现在的编码经验也有快2年半了,两年半的时间包括实习在内任职过有4家公司,包括一家互联网 ...
- Xshell6配置ssh免密码登录虚拟机
首先先说明一下有密码的,涉及到root登陆权限的问题: 1.用超级管理员身份登录,修改 vi /etc/ssh/sshd_config, 找到 把其中的permitRootLogin 修改成: # ...
- 用OpenGL画线
. 两点之间的连线称之为线段,在屏幕上显示线段放在现在已经不是稀奇的事情,大多数高级图形API都可以轻松实现,我尝试用OpenGL画线,在这里记录一下收获. . OpenGL这个级别的图形API,通常 ...
- python入门递归之阶乘
def recurursion(n): if n == 1: return 1 else: return n * recurursion(n-1) number = int(input("请 ...