我正在研究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?
答案 0 :(得分:0)
这太长了,不适合评论,但它并不是真正意义上的答案..
公司将其称为“内存边缘”,可能会有更多名称。我听说它被称为“明确的状态传递”,但谷歌似乎不同意。
但我不同意你的前提 - 大多数SSA优化工作得很好(有时可能有点kludgy),有副作用。 不工作的是使用图形表示而不明确显示副作用(显然顺序会消失)。但是你只需要一些东西来明确这个顺序 - SSA也可以作为一个“操作列表”,其中的顺序只是固定的(除非在明确的重新排序阶段),但在这种情况下,它仍然可以更容易效果显式(导致优化中的特殊情况减少等)。
这是一个很好的方法。我不知道它与Monads有什么关系,我不理解它们,我可能永远也不会。