0

我正在編寫類似於編譯器的東西。問題如下:我有一個代碼,由一系列賦值組成:減少臨時變量的數量

t1=a+b+c 
    t2=t1*d 
    t3=sqrt(t1+t2) 
    t4=t2+5 
    ... 

大部分「t」變量是暫時的。我想減少臨時變量的數量,儘可能多地重複使用它們。所以,我需要重新排列代碼,對錶達式進行分組,使變量儘可能接近變量賦值,因此在計算這些表達式之後,變量可以被重用。當然,我想在這個過程中保留代碼邏輯。 這是最好的算法來做到這一點?

+1

問題是「註冊合併」之一:http://en.wikipedia.org/wiki/Register_allocation – ArjunShankar

+0

一個側面說明:雖然您發佈的例子中,你已經擁有了分配之間的真正的依賴,在很多情況下,「重用」變量是壞的,並創建虛假的依賴是不是真的存在。實際上,大多數優化器首先將代碼重寫爲一個表單,其中變量在分配過程中永遠不會被重用。它被稱爲SSA:http://en.wikipedia.org/wiki/Static_single_assignment_form – ArjunShankar

回答

0

你會看看變量的壽命。當變量不再使用時,可以丟棄它並重新使用它的內存空間。例如:

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 
+0

是的,但會盡快,儘可能好,以自由變量,所以我要重新初始化代碼,使變量的壽命短,如可能並尋找算法來做到這一點。 – Pavel