12 | 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
《编译原理实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(4)
- 最新
- 精选
- 龚攀峰请问下继承关系信息在字节码里有体现吗?好像只是在头部信息有描述,运用期用的就是这个?
作者回复: 对于Java程序来说,只有方法体才会生成字节码(其中类成员变量的初始化过程也被封装成了一个内部的方法)。 而class文件中,除了字节码,还有各种定义信息,或者说是符号表。类的继承关系是类的定义的一部分,所以也体现在class文件中,但不是字节码。
2020-09-243 - 风怎么感觉去除语法糖应该在数据流分析的前面,能保证去糖以后的代码,都不需要数据流分析里做的优化吗?
作者回复: 数据流分析可以用于很多地方。即可以用于比较高抽象度代码的分析,也可用于比较低的IR。 在字节码到机器码的过程中,仍然需要用到数据流分析的。
2020-12-21 - 南思考题个人的一些想法 java编译器的大部分功能应该是可以复用的,要做的事包括以下: 1. 是否需要在词法解析阶段定义新的关键词token 2.在语法解析过程中定义新的数据结构,即符合语法规则的新的AST 3.对AST进行修改转换,尽量复用java已有的AST规则 4.无法复用的部分需要添加新的AST对应的字节码生成指令2022-04-26
- ifelse挺难2022-01-12
收起评论