我正在編寫類似於編譯器的東西。問題如下:我有一個代碼,由一系列賦值組成:減少臨時變量的數量
t1=a+b+c
t2=t1*d
t3=sqrt(t1+t2)
t4=t2+5
...
大部分「t」變量是暫時的。我想減少臨時變量的數量,儘可能多地重複使用它們。所以,我需要重新排列代碼,對錶達式進行分組,使變量儘可能接近變量賦值,因此在計算這些表達式之後,變量可以被重用。當然,我想在這個過程中保留代碼邏輯。 這是最好的算法來做到這一點?
我正在編寫類似於編譯器的東西。問題如下:我有一個代碼,由一系列賦值組成:減少臨時變量的數量
t1=a+b+c
t2=t1*d
t3=sqrt(t1+t2)
t4=t2+5
...
大部分「t」變量是暫時的。我想減少臨時變量的數量,儘可能多地重複使用它們。所以,我需要重新排列代碼,對錶達式進行分組,使變量儘可能接近變量賦值,因此在計算這些表達式之後,變量可以被重用。當然,我想在這個過程中保留代碼邏輯。 這是最好的算法來做到這一點?
你會看看變量的壽命。當變量不再使用時,可以丟棄它並重新使用它的內存空間。例如:
t1=a+b+c
t2=t1*d
t3=sqrt(t1+t2)
// t1 is no longer used, free space to use for t4
t4=t2+5
// t2 is no longer used
...assuming only t3 and t4 is used later on
你也可以看看變量這樣的壽命很短,他們甚至不需要進行分配,例如:
t1 = a+b+c
t2 = t1 * 2
這裏t1
僅使用一次,在下一個陳述,所以你可以採取以前的計算結果並使用它:
t2 = (a+b+c) * 2
是的,但會盡快,儘可能好,以自由變量,所以我要重新初始化代碼,使變量的壽命短,如可能並尋找算法來做到這一點。 – Pavel
問題是「註冊合併」之一:http://en.wikipedia.org/wiki/Register_allocation – ArjunShankar
一個側面說明:雖然您發佈的例子中,你已經擁有了分配之間的真正的依賴,在很多情況下,「重用」變量是壞的,並創建虛假的依賴是不是真的存在。實際上,大多數優化器首先將代碼重寫爲一個表單,其中變量在分配過程中永遠不會被重用。它被稱爲SSA:http://en.wikipedia.org/wiki/Static_single_assignment_form – ArjunShankar