编程语言的中间表示

SSA

  • SSA(Static Single Assignment,静态单一赋值)
    • 静态 –> 只依赖于代码(Code)或文本(Text)
    • 单一 –> 单一名称
    • 赋值 –> 比如y = x + 1
  • SSA的应用
    • GCC、LLVM、Java虚拟机HotSpot、JavaScript V8引擎
    • 即时(Just-In-Time,JIT)编译器,用于Java的字节码、.NET的MSIL、LLVM的bitcode
    • 计算机图形学,用于OpenGL、Vulkan的SPIR-V
  • SSA的例子
    • 同一变量的不同赋值,使用不同名称
    • 控制流使用Phi函数表示
// Non-SSA
x = input()
if (x == 42)
    y = 1
else
    y = x + 2
print(y)

// SSA
x = input()
if (x == 42)
    y1 = 1
else
    y2 = x + 2
y3 = Phi(y1, y2)
print(y3)

代码生成

  • 计算和信息可知,指令选择(Instruction Selection)对应于计算,寄存器分配(Register Allocation)对应于信息
    • 计算需要时间 –> 指令数量
    • 信息需要空间 –> 寄存器溢出
  • 在编译器中,中间表示通常用于有限时空下的优化