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

11 | Java编译器(三):属性分析和数据流分析

活跃性分析框架的要素
活跃性分析方法对return语句的检测
常数折叠的触发条件
标识符节点关联到正确的Symbol
类型检查过程
Java的类型体系
本地变量捕获分析
赋值分析
异常分析
活跃性分析
推导类型参数
常数折叠
引用消解
类型检查
本地变量捕获分析
赋值分析
异常分析
活跃性分析
Infer:推导类型参数
ConstFold:常数折叠
Resolve:引用消解
Check:类型检查
数据流分析
属性分析
FLOW:数据流分析
ATTR:属性分析
思维导图
Java编译器数据流分析
Java编译器属性分析
Java编译器属性分析和数据流分析

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

你好,我是宫文学。
在上一讲,我们主要讨论了语义分析中的 ENTER 和 PROCESS 阶段。今天我们继续往下探索,看看 ATTR 和 FLOW 两个阶段。
ATTR 的字面意思是做属性计算。第 4 讲中,我已经讲过了属性计算的概念,你应该还记得什么是 S 属性,什么是 I 属性。那么,Java 编译器会计算哪些属性,又会如何计算呢?
FLOW 的字面意思是做数据流分析。通过第 7 讲,你已经初步了解了数据流分析的算法。但那个时候是把数据流分析用于编译期后端的优化算法,包括删除公共子表达式、变量传播、死代码删除等。而这里说的数据流分析,属于编译器前端的工作。那么,前端的数据流分析会做什么工作呢?
这些问题的答案,我今天都会为你一一揭晓。好了,我们进入正题,首先来看看 ATTR 阶段的工作:属性分析。

ATTR:属性分析

现在,你可以打开 com.sun.tools.javac.comp.Attr 类的代码。在这个类的头注释里,你会发现原来 ATTR 做了四件事,分别在 4 个辅助类里实现:
Check:做类型检查。
Resolve:做名称的消解,也就是对于程序中出现的变量和方法,关联到其定义。
ConstFold:常量折叠,比如对于“2+3”这种在编译期就可以计算出结果的表达式,就直接计算出来。
Infer:用于泛型中的类型参数推导。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Java编译器的属性分析和数据流分析是编译器前端的重要工作。在属性分析阶段,编译器进行类型检查、名称消解、常量折叠和泛型类型参数推导。文章通过示例代码详细解释了类型检查的过程,包括计算子节点类型、深度优先遍历AST、类型比对等步骤。另外,文章还介绍了Java的类型体系设计和实现,以及编译器是如何实现类型检查的。在数据流分析阶段,编译器进行数据流分析,这是编译器前端的工作。文章未详细介绍数据流分析的具体内容,但提到了数据流分析在编译期后端的优化算法中的应用。总的来说,本文通过深入讲解Java编译器的属性分析和数据流分析,帮助读者更好地理解编译器前端的工作原理和实现细节。 在数据流分析阶段,Java编译器在FLOW阶段做了四种数据流分析:活跃性分析、异常分析、赋值分析和本地变量捕获分析。活跃性分析方法通过示例代码详细解释了对return语句的检测过程,以及控制流图的表示方式。此外,文章还介绍了活跃性分析的五个要素:V、I、D、F、Λ,以及活跃性分析在检测不可到达的语句和无限循环后面的代码方面的应用。除了活跃性分析,文章还提到了异常分析、赋值分析和本地变量捕获分析的思路,以及这些分析方法的五大要素。通过对这些数据流分析方法的介绍,读者可以更好地理解数据流分析框架的重要性和应用。 总的来说,本文通过深入讲解Java编译器的属性分析和数据流分析,帮助读者更好地理解编译器前端的工作原理和实现细节。同时,通过具体的数据流分析方法的介绍,读者可以更好地理解数据流分析框架的重要性和应用。

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

全部留言(2)

  • 最新
  • 精选
  • 宫文学Richard
    置顶
    上一讲思考题的参考解答: 针对示例程序,Java会形成5个词法作用域: 1.类作用域 2.方法作用域,这里主要放参数 3.方法体作用域 4.if语句块的作用域 5.else语句块的作用域 实际上,你把2和3合并也没有问题。但在编译过程中,2和3还是有区别的。作用域2在一开始就可以建立,参数对应的符号也可以一开始就加入到作用域2中去。而方法体中的作用域和本地变量,必须是边做引用消解,边建立作用域,边添加符号。把它们区分开,程序更容易处理。
    2020-06-30
    8
  • ifelse
    2022-01-11
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部