SSA中的副作用跟踪

时间:2012-07-08 15:36:28

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

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

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的概念,听起来很相似但不一样。使用monads是一种更好的方法吗?如果是这样,我如何修改它以使用monads?

1 个答案:

答案 0 :(得分:0)

这太长了,不适合评论,但它并不是真正意义上的答案..

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

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

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