以下内容翻译自wiki
在编译器设计中,静态单一赋值形式(通常缩写为SSA形式或简称SSA)是中间表示(IR)的属性,它要求每个变量只分配一次,并且每个变量在使用之前定义。原始IR中的现有变量被拆分为版本,在教科书中,新变量通常由原始名称用下标表示,以便每次定义都有自己的版本。在SSA形式中,use-def链是显式的,每个包含一个元素。
SSA由Barry K. Rosen、Mark N. Wegman和F. Kenneth Zadeck于1988年提出【1】。IBM的前三位研究人员Ron Cytron、Jeanne Ferrante和开发了一种算法,可以有效地计算SSA形式【2】。
可以期望在Fortran或C的编译器中找到SSA,而在函数式语言编译器中,例如Scheme、ML和Haskell的编译器,通常使用连续传递样式(CPS)。SSA在形式上等同于排除非局部控制流之外的良好行为的CPS子集,当CPS用作中间表示时非局部控制流不会发生。因此,根据一个方法制定的优化和转换立即适用于另一个。
SSA的主要用途来自于它如何通过简化变量的属性来,同时简化和改进各种编译器优化的结果。 例如,考虑这段代码:
y := 1
y := 2
x := y
可以看到第一个赋值不是必需的,并且第三行中使用的y的值来自y的第二个赋值。 程序必须执行到达定义分析(reading definition analysis)以确定这一点。 但如果该程序采用SSA形式,则两者都是显而易见的: