主要观点:为 Ruby 等动态语言构建有效编译器需精确类型信息,本文展示一个小 Ruby 子集的过程间类型分析,可用于程序优化,此分析非通常的类型推断引擎或检查器,能追踪函数间数据流,识别shout
的调用者等,还介绍了静态分析(如静态单赋值形式 SSA)、稀疏条件常量传播(SCCP)、过程间 SCCP 及对象和方法查找等,通过生成折磨测试来评估其扩展性,最后总结并推荐相关阅读。
关键信息:
- Ruby 代码中变量类型难确定,添加类型注解作用有限,需编译器自行追踪类型。
- 介绍 SSA 形式,能保证变量单一定型,分析时需处理“时间”状态。
- SCCP 利用类型信息探索控制流图,只分析相关分支,可用于过程间分析。
- 过程间 SCCP 需增量构建调用图,1 调用点敏感能提高精度但减慢分析,还有上下文敏感等其他类型敏感。
- 静态分析要跟踪类和实例变量类型,可选择字段敏感方法,处理
GetIvar
和SetIvar
的关系。 - 生成折磨测试来评估分析扩展性,有含类和不含类的程序测试,结果表明分析较可行。
重要细节: - 示例代码如
shout
函数展示类型不确定性,Ruby 继承导致类型签名含义复杂。 - 解释类型晶格概念,各元素从
Empty
开始递增,不同类型在晶格中有特定位置和关系。 - 过程间 SCCP 从应用入口点开始分析,创建调用边,处理参数合并和类型推导。
- 折磨测试生成有特定结构的调用图和函数,包括含类和不含类的情况,评估分析性能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。