全局数据流分析

  • 为了有效地优化代码, 编译器会收集有关程序的所有信息, 并将此信息分发到流程图的每个块。此过程称为数据流图分析。
  • 某些优化只能通过检查整个程序来实现。仅检查程序的一部分是无法实现的。
  • 对于这种优化, 用户定义的链接是一个特定的问题。
  • 在这里, 使用变量的值, 我们尝试找出变量的哪个定义适用于语句。
根据本地信息, 编译器可以执行一些优化。例如, 考虑以下代码:
x = a + b; x = 6 * 3

  • 在此代码中, x的第一个分配是无用的。 x的值计算机永远不会在程序中使用。
  • 在编译时, 将计算表达式6 * 3, 将第二个赋值语句简化为x = 18;
一些优化需要更多的全局信息。例如, 考虑以下代码:
a = 1; b = 2; c = 3; if (....) x = a + 5; else x = b + 4; c = x + 1;

【全局数据流分析】在此代码中, 第3行的初始赋值是无用的, x +1表达式可以简化为7。
但是, 编译器如何仅通过查看一个或两个连续的语句来发现这些事实就不太明显了。需要进行更全面的分析, 以便编译器在程序的每个点都了解以下内容:
  • 保证哪些变量具有恒定值
  • 重新定义之前将使用哪些变量
数据流分析用于发现这种属性。可以在程序的控制流程图(CFG)上执行数据流分析。
程序的控制流程图用于确定程序中分配了变量的特定值可能传播到的那些部分。

    推荐阅读