如何研究 Javac 与 HotSpot - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mazhimazh
V2EX    Java

如何研究 Javac 与 HotSpot

  •  7
     
  •   mazhimazh 2019-11-29 09:11:21 +08:00 5561 次点击
    这是一个创建于 2142 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在使用 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 Shipilv 等大神发表的论文,相关论文的链接在 R 大写的那篇文章中已经列出,大家可以去看。

    传不了图处,看书的封面图片可查阅这篇文章 https://www.cnblogs.com/mazhimazhi/p/11953116.html

    如果有志同道合的朋友,我们可以加个微信,一起研究 Javac 与 HotSpot 源代码,共同进步。我的微信号:mazhimazh

    guxingke
        1
    guxingke  
       2019-11-29 10:08:44 +08:00   2
    顶, 这种总结可不多见.
    easynoder
        2
    easynoder  
       2019-11-29 10:26:33 +08:00   1
    赞,总结很深刻
    pws22
        3
    pws22  
       2019-11-29 10:35:49 +08:00
    赞赞赞
    Mikukko
        4
    Mikukko  
       2019-11-29 11:14:34 +08:00 via iPhone
    赞一波!
    foamvalue
        5
    foamvalue  
       2019-11-29 13:07:35 +08:00
    赞一波
    ZredoC
        6
    ZredoC  
       2019-11-29 14:37:33 +08:00
    硬核
    pumpkimn
        7
    pumpkimn  
       2019-11-29 14:47:50 +08:00
    嗯货
    cs4814751
        8
    cs4814751  
       2019-11-29 14:55:35 +08:00
    V2 清流!赞干货!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2838 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 14:18 PVG 22:18 LAX 07:18 JFK 10:18
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86