2012-07-08 55 views
0

我正在研究用於Java字節碼的優化器,並決定使用SSA。但是,大多數優化要求所有操作都是純功能的,所以爲了處理副作用,我決定爲每個可能有副作用的操作添加一個額外的不透明狀態參數和返回值。這將防止優化離開或重新排序副作用的操作。例如,忽略異常處理,你會得到像這樣的僞代碼。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 

有沒有我在做什麼的名字?這是一個好方法嗎?我聽說功能語言有一個叫Monad的概念,聽起來很相似但不一樣。使用單子更好的方法?如果是這樣,我怎麼修改這個使用單子?

回答

0

這是太長,不適合在一個評論,但它不是真正的意思是一個答案..

事務所稱之爲「記憶的邊緣」,可能會有更多的名字。我聽說它被稱爲「明確的狀態傳遞」,但谷歌似乎不同意。

但我不同意你的前提 - 大多數SSA優化在副作用的情況下工作得很好(有時候可能有點不合適)。什麼工作是使用一個圖形表示沒有明確的副作用(顯然順序會消失)。但是你只需要一些東西來明確這個順序 - SSA也可以作爲「操作列表」,其中順序是簡單的固定的(除了可能在明確的重新排序階段),但在這種情況下,它可以更容易影響明確(導致優化等特殊情況更少)。

這是一個很好的方法。我不知道它與Monad的關係如何,我不明白他們,我可能永遠不會。

+0

常見的子表達式消除,全局值編號,未使用的表達式消除,指令重新排序等都不承擔副作用。 – Antimony 2012-07-08 16:40:22

+1

@Antimony不,他們不會,如果他們可以承擔「無副作用」,他們就更容易表達。 – harold 2012-07-08 16:43:39