编译器静态分析与属性文法详解
1. 编译器的静态分析
编译器会进行广泛的静态分析,旨在消除对数组下标、变体记录标签或潜在悬空指针进行动态检查的需求。将省略不必要的动态检查视为一种性能优化方式,自然会促使我们探寻其他借助静态分析改进代码的途径。
1.1 常见的静态分析优化类型
- 别名分析 :确定何时可以安全地将值缓存到寄存器中、进行“乱序”计算,或者允许并发线程访问这些值。
- 逃逸分析 :判断对某个值的所有引用是否会局限于特定上下文,从而使该值可以在栈上分配而非堆上,或者在访问时无需加锁。
- 子类型分析 :确定面向对象语言中的变量是否一定属于某个特定子类型,这样就可以在调用其方法时无需进行动态分派。
1.2 优化的分类
- 不安全优化 :可能会导致某些程序产生错误代码的优化。
- 推测性优化 :通常能提升性能,但在某些情况下可能会降低性能的优化。例如非绑定预取(尝试在数据需要之前将其加载到缓存中)和跟踪调度(重新排列代码以改善处理器流水线和指令缓存的性能)。
- 保守编译器 :仅在能保证优化既安全又有效的情况下才应用优化的编译器。
- 乐观编译器 :会大量使用推测性优化,甚至可能通过生成代码的两个版本,并使用动态检查根据编译时无法获取的