0

我正在研究 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,听上去很像但又不一样。使用单子是更好的方法吗?如果是这样,我该如何修改它以使用单子?

4

1 回答 1

0

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

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

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

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

于 2012-07-08T15:55:15.583 回答