我正在研究用於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的概念,聽起來很相似但不一樣。使用單子更好的方法?如果是這樣,我怎麼修改這個使用單子?
常見的子表達式消除,全局值編號,未使用的表達式消除,指令重新排序等都不承擔副作用。 – Antimony 2012-07-08 16:40:22
@Antimony不,他們不會,如果他們可以承擔「無副作用」,他們就更容易表達。 – harold 2012-07-08 16:43:39