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

12 | Java编译器(四):去除语法糖和生成字节码

代码优化
数据类型对指令的影响
例子
处理过程
增强for循环
对泛型的处理过程
泛型的实现
LOWER
UNLAMBDA
TRANSPATTERNS
TRANSTYPES
提高编程便利性的语法设计
思维导图
GEN阶段
LOWER阶段
FLOW阶段
ATTR阶段
生成字节码的过程
生成字节码的错觉
对foreach循环的处理
对泛型的处理
去除语法糖的处理步骤
语法糖
探讨编译过程最后的两个步骤:去除语法糖和生成字节码
Java编译器的最后一讲
参考资料
一课一思
课程小结
代码优化
生成字节码
去除语法糖
介绍
Java编译器

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

你好,我是宫文学。今天是 Java 编译器的最后一讲,我们来探讨编译过程最后的两个步骤:去除语法糖和生成字节码
其实今天要讲的这两个编译步骤,总体上都是为生成字节码服务的。在这一阶段,编译器首先会把语法糖对应的 AST,转换成更基础的语法对应的 AST,然后基于 AST 和符号表,来生成字节码。
从 AST 和符号表,到变成字节码,这可是一个很大的转变,就像把源代码转化成 AST 一样。那么,这个过程的实现思路是什么?有什么难点呢?
今天这一讲,我们就一起来解决以上这些问题,在这个过程中,你对 Java 编译器的认识会变得更加完整。
好了,我们首先来看看去除语法糖这一处理步骤。

去除语法糖(Syntactic Sugar)

Java 里面提供了很多的语法糖,比如泛型、Lambda、自动装箱、自动拆箱、foreach 循环、变长参数、内部类、枚举类、断言(assert),等等。
你可以这么理解语法糖:它就是提高我们编程便利性的一些语法设计。既然是提高便利性,那就意味着语法糖能做到的事情,用基础语法也能做到,只不过基础语法可能更啰嗦一点儿而已。
不过,我们最终还是要把语法糖还原成基础语法结构。比如,foreach 循环会被还原成更加基础的 for 循环。那么,问题来了,在编译过程中,究竟是如何去除语法糖的?基础语法和语法糖又有什么区别呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Java编译器的关键步骤:去除语法糖和生成字节码。首先介绍了去除语法糖的处理逻辑,包括泛型和foreach循环的处理方式,以及相应的AST变化。接着详细介绍了生成字节码的过程,包括对AST进行深度优先遍历和影响字节码生成的因素。此外,还介绍了Java编译器在编译过程中的代码优化工作,包括常数折叠、不可达代码和代数简化等优化算法。总体来看,本文通过深入浅出的方式,使读者能够快速了解并掌握Java编译器生成字节码的过程,以及相关技术特点。

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

全部留言(4)

  • 最新
  • 精选
  • 龚攀峰
    请问下继承关系信息在字节码里有体现吗?好像只是在头部信息有描述,运用期用的就是这个?

    作者回复: 对于Java程序来说,只有方法体才会生成字节码(其中类成员变量的初始化过程也被封装成了一个内部的方法)。 而class文件中,除了字节码,还有各种定义信息,或者说是符号表。类的继承关系是类的定义的一部分,所以也体现在class文件中,但不是字节码。

    2020-09-24
    3
  • 怎么感觉去除语法糖应该在数据流分析的前面,能保证去糖以后的代码,都不需要数据流分析里做的优化吗?

    作者回复: 数据流分析可以用于很多地方。即可以用于比较高抽象度代码的分析,也可用于比较低的IR。 在字节码到机器码的过程中,仍然需要用到数据流分析的。

    2020-12-21
  • 思考题个人的一些想法 java编译器的大部分功能应该是可以复用的,要做的事包括以下: 1. 是否需要在词法解析阶段定义新的关键词token 2.在语法解析过程中定义新的数据结构,即符合语法规则的新的AST 3.对AST进行修改转换,尽量复用java已有的AST规则 4.无法复用的部分需要添加新的AST对应的字节码生成指令
    2022-04-26
  • ifelse
    挺难
    2022-01-12
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部