编译原理实战课
宫文学
北京物演科技CEO
立即订阅
2999 人已学习
课程目录
已更新 31 讲 / 共 53 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | 在真实世界的编译器中游历
免费
学习指南 | 如何学习这门编译原理实战课?
预备知识篇 (9讲)
01 | 编译的全过程都悄悄做了哪些事情?
02 | 词法分析:用两种方式构造有限自动机
03 | 语法分析:两个基本功和两种算法思路
04 | 语义分析:让程序符合语义规则
05 | 运行时机制:程序如何运行,你有发言权
06 | 中间代码:不是只有一副面孔
07 | 代码优化:跟编译器做朋友,让你的代码飞起来
08 | 代码生成:如何实现机器相关的优化?
知识地图 | 一起来复习编译技术核心概念与算法
不定期加餐 (1讲)
不定期加餐1 | 远程办公,需要你我具备什么样的素质?
真实编译器解析篇 (19讲)
09 | Java编译器(一):手写的编译器有什么优势?
10 | Java编译器(二):语法分析之后,还要做些什么?
11 | Java编译器(三):属性分析和数据流分析
12 | Java编译器(四):去除语法糖和生成字节码
13 | Java JIT编译器(一):动手修改Graal编译器
14 | Java JIT编译器(二):Sea of Nodes为何如此强大?
15 | Java JIT编译器(三):探究内联和逃逸分析的算法原理
16 | Java JIT编译器(四):Graal的后端是如何工作的?
17 | Python编译器(一):如何用工具生成编译器?
18 | Python编译器(二):从AST到字节码
19 | Python编译器(三):运行时机制
20 | JavaScript编译器(一):V8的解析和编译过程
21 | JavaScript编译器(二):V8的解释器和优化编译器
22 | Julia编译器(一):如何让动态语言性能很高?
23 | Julia编译器(二):如何利用LLVM的优化和后端功能?
24 | Go语言编译器:把它当作教科书吧
25 | MySQL编译器(一):解析一条SQL语句的执行过程
26 | MySQL编译器(二):编译技术如何帮你提升数据库性能?
热点问题答疑:如何吃透7种语言的编译器?
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

15 | Java JIT编译器(三):探究内联和逃逸分析的算法原理

宫文学 2020-07-06
你好,我是宫文学。
基于 Graal IR 进行的优化处理有很多。但有些优化,针对 Java 语言的特点,会显得更为重要。
今天这一讲,我就带你来认识两个对 Java 来说很重要的优化算法。如果没有这两个优化算法,你的程序执行效率会大大下降。而如果你了解了这两个算法的机理,则有可能写出更方便编译器做优化的程序,从而让你在实际工作中受益。这两个算法,分别是内联和逃逸分析
另外,我还会给你介绍一种 JIT 编译所特有的优化模式:基于推理的优化。这种优化模式会让某些程序比 AOT 编译的性能更高。这个知识点,可能会改变你对 JIT 和 AOT 的认知,因为通常来说,你可能会认为 AOT 生成的机器码速度更快,所以通过这一讲的学习,你也会对“全生命周期优化”的概念有所体会。
好,首先,我们来看看内联优化。

内联(Inlining)

内联优化是 Java JIT 编译器非常重要的一种优化策略。简单地说,内联就是把被调用的方法的方法体,在调用的地方展开。这样做最大的好处,就是省去了函数调用的开销。对于频繁调用的函数,内联优化能大大提高程序的性能。
执行内联优化是有一定条件的。第一,被内联的方法要是热点方法;第二,被内联的方法不能太大,否则编译后的目标代码量就会膨胀得比较厉害。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《编译原理实战课》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥29.9
立即订阅
登录 后留言

精选留言(3)

  • leaf
    请教老师图1图2中的黑线和绿线是什么意思

    作者回复: 黑线和绿线都跟内存读写有关。
    与内存状态有关的操作所构成的流,有时还会叫做Effect流,效果流。这时候会产生前后序的依赖关系。

    2020-07-08
  • 易昊
    “它的具体做法是,在运行时,编译器会统计在调用多态方法的时候,到底用了哪几个实现。”这个是否有一定程度限制条件,比如我的程序运行在别人的虚拟机上,应该就统计不到了吧?

    作者回复: 这句话我再解释一下。
    比如,A有10个子类,B1、B2、B3...B10
    但在实际运行时,很多子类可能从来没有用到过,只有B2和B3会被用到。那么,编译器只需要为这两个子类做优化就行了。这就是JIT的优势。它是根据实际运行的情况来优化的。

    2020-07-07
  • 😐饲养员小张😐
    老师,能讲讲不同语言混编的时候,编译器到底会怎么做么?
最近在做swift和objc的混编的事情,有点没搞明白,如果主工程是objc引入swift文件,和主工程是swift引入objc文件有什么区别么?
还有两种语言是怎么做到识别对方的呢?像编辑器的代码补全和报错都是怎么识别的呢?毕竟这时候还没有真正的编译啊!
感谢老师

    作者回复: 现代的IDE,是内置了编译功能的,这是IDE能那么智能的原因。一般只需要实现前端功能就行了,能够检查语法和语义的错误。
    比如,如果你需要让Visual Studio Code支持某种语言,你需要提供一个支持语言服务器协议(LSP)的后台服务,让编辑器调用它的功能来支持解析、即时提示等功能。

    2020-07-07
    1
收起评论
3
返回
顶部