V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mazhimazh
V2EX  ›  Java

如何研究 Javac 与 HotSpot

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

    现在使用 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 大写的那篇文章中已经列出,大家可以去看。

    传不了图处,看书的封面图片可查阅这篇文章 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   ·   我们的愿景   ·   实用小工具   ·   3453 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 11:10 · PVG 19:10 · LAX 04:10 · JFK 07:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.