【问题标题】:Side Effect Tracking in SSASSA 中的副作用跟踪
【发布时间】:2026-02-22 11:15:01
【问题描述】:

我正在开发 Java 字节码的优化器,并决定使用 SSA。但是,大多数优化要求所有操作都是纯函数式的,因此为了处理副作用,我决定为每个可能产生副作用的操作添加一个额外的不透明状态参数和返回值。这将防止优化或重新排序具有副作用的操作。例如,忽略异常处理,你会得到类似这样的伪代码。

function arguments: x1, e1
if x1 != 0
    x2 = add(x1, 3)
    x3, e2 = invoke(foo, x2, e1)
x4 = phi(x1, x3)
e3 = phi(e1, e2)
return x4, e3

我的工作有名字吗?这是一个好方法吗?听说函数式语言有一个概念叫 Monads,听上去很像,但又不一样。使用单子是更好的方法吗?如果是这样,我该如何修改它以使用单子?

【问题讨论】:

    标签: compiler-optimization side-effects state-monad ssa


    【解决方案1】:

    这太长了,无法放在评论中,但这并不是真正的答案..

    公司称其为“内存边缘”,可能还有更多名称。我听说它被称为“显式状态传递”,但谷歌似乎不同意。

    但我不同意您的前提 - 大多数 SSA 优化在存在副作用的情况下工作得很好(有时可能有点笨拙)。 不起作用的是使用图形表示而不明确副作用(显然顺序会消失)。但是您只需要一些东西来明确该顺序 - SSA 也可以用作“操作列表”,其中顺序只是固定的(可能在显式重新排序阶段除外),但在这种情况下,它仍然可以更容易制作效果显式(导致优化等方面的特殊情况减少)。

    这是一个很好的方法。不过我不知道它与 Monads 有什么关系,我不理解它们,而且我可能永远也不会。

    【讨论】:

    • 公共子表达式消除、全局值编号、未使用的表达式消除、指令重新排序等都假定没有副作用。
    • @Antimony 不,他们没有,如果他们可以假设“没有副作用”,他们会更容易表达。