编译原理实战课
宫文学
北京原点代码 CEO
26066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
真实编译器解析篇 (19讲)
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

13 | Java JIT编译器(一):动手修改Graal编译器

AOT编译
多语言支持
思维导图
核心要点
跟踪Graal的运行
测试Graal编译器
编译Graal
下载源代码和构建工具
GraalVM
JVMCI接口标准
用Java编写
分层编译
字节码解释器C0
C1和C2编译器
JIT编译 vs AOT编译
指令指针和内存地址
参考资料
一课一思
课程小结
修改并运行Graal
Graal编译器
HotSpot虚拟机
原理
Java JIT编译器

该思维导图由 AI 生成,仅供参考

你好,我是宫文学。
在前面的 4 讲当中,我们已经解析了 OpenJDK 中的 Java 编译器,它是把 Java 源代码编译成字节码,然后交给 JVM 运行。
用过 Java 的人都知道,在 JVM 中除了可以解释执行字节码以外,还可以通过即时编译(JIT)技术生成机器码来执行程序,这使得 Java 的性能很高,甚至跟 C++ 差不多。反之,如果不能达到很高的性能,一定会大大影响一门语言的流行。
但是,对很多同学来说,对于编译器中后端的了解,还是比较模糊的。比如说,你已经了解了中间代码、优化算法、指令选择等理论概念,那这些知识在实际的编译器中是如何落地的呢?
所以从今天开始,我会花 4 讲的时间,来带你了解 Java 的 JIT 编译器的组成部分和工作流程、它的 IR 的设计、一些重要的优化算法,以及生成目标代码的过程等知识点。在这个过程中,你还可以印证关于编译器中后端的一些知识点。
今天这一讲呢,我首先会带你理解 JIT 编译的基本原理;然后,我会带你进入 Graal 编译器的代码内部,一起去修改它、运行它、调试它,让你获得第一手的实践经验,消除你对 JIT 编译器的神秘感。

认识 Java 的 JIT 编译器

我们先来探究一下 JIT 编译器的原理。
第 5 讲中,我讲过程序运行的原理:把一个指令指针指向一个内存地址,CPU 就可以读取其中的内容,并作为指令来执行。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Java的JIT编译器及Graal编译器的工作原理和应用。作者首先详细解释了JIT编译器的工作原理,包括C0、C1和C2编译器的作用,以及分层编译的过程。接着,文章介绍了Graal编译器,强调了它是用Java语言编写的优势,以及其在JVM中的应用和GraalVM的架构。作者还提到了GraalVM支持AOT编译,可以提高程序启动时间,符合云原生技术的要求。文章还介绍了如何修改和运行Graal编译器的实际操作步骤,以及如何跟踪Graal的执行过程。整体来看,本文对于想要深入了解Java的JIT编译器及Graal编译器的读者具有很高的参考价值。文章内容详实,涵盖了JIT编译器和Graal编译器的工作原理、调试方法以及优化算法的实现过程,为读者提供了全面的技术知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • wusiration
    这是目前在win 7环境下的编译报错, Extracting LIBFFI_SOURCES... Applying patches... error: invalid path 'truffle\mxbuild\windows-amd64\src\libffi\libffi-3.2.1/src/x86/ffi.c 可以分析出是编译代码在拼接路径的时候,用的是linux系统的分隔符...没找到能在哪里进行调整; 此外,最开始碰到的报错是windows自带的cmd是gbk编码,导致在python调用decode函数默认用utf8,无法正确解析路径。

    作者回复: 在windows上,你直接试试release版本怎么样?参见: https://www.graalvm.org/docs/getting-started/windows 如果解决不了,你继续留言,我找个Windows环境测试一下。 其他同学遇到类似问题,也可以交流下。

    2020-07-04
    3
  • Jxin
    本来我觉得jdk8的升级应该会很缓慢。但jdk9的aop编译如果不以补丁包加到jdk8,怕是能有效加快这个过程。毕竟原本不是很重要的启动时间,在servless下,变得至关重要。

    作者回复: 是。Servless,云原生,让启动时间变得敏感。

    2020-07-01
    2
  • Boomkeeper
    想问老师一个问题,就是启用graalvm去解析js代码是否执行第一次就进行了即时编译了,因为第二次去看执行时间从几百毫秒变为十几毫秒

    作者回复: 你已经开始用Graal去玩js了?很好呀,有探索精神! 我没太去研究graalvm+js,但我猜想,因为graalvm是个后端工具,并没有像v8那样提供一个解释器再加一个JIT,所以它只能编译执行。 你可以验证一下看看。

    2020-12-11
    1
  • wusiration
    老师,windows是不是很难编译graal,用mx工具build的时候,不停报错...

    作者回复: 理论上,在不同平台上编译graal是一样的,因为是纯Java的嘛。你注意把JDK、Python等环境配置好就行了。 你也可以把错误贴上来,我看一下。

    2020-07-01
    2
    1
  • coconut
    github下载速度慢的话,可以在gitee上搜索相关的仓库 比如 https://gitee.com/liyun_1981/graal?_from=gitee_search

    作者回复: 感谢分享经验! github确实越来越卡了。

    2021-01-13
  • gkkrjj
    想知道老师的结构图一类的是什么工具画的

    作者回复: PowerPoint :-)

    2020-07-07
  • ifelse
    牛逼plus
    2022-01-12
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部