2009-06-09 68 views
0

我很想知道如何實現inline expansion實施內聯擴展

我正在編寫我自己的編譯器只是爲了好玩和教育。

我通過示例學到了很多東西,所以如果有人能夠給我一個內聯算法,這對我會有很大的幫助。

我更喜歡C++,但語言無關緊要。

我試圖編寫內聯的目標語言是JavaScript。

編輯: 只是爲了澄清,我正在尋找方法來改善ShrinkSafe
GWT內嵌JavaScript函數,所以它是可能的。 GWT在代碼運行之前進行內聯。

回答

1

一個常見的實現是在優化階段將其作爲重寫規則。用被調用的指令替換實際的函數調用指令(自然地減去返回語句)。

接下來,您要確保窺視優化器可以消除調用指令和被調用者的序言之前的棧設置。同樣,你應該確保窺孔優化器可以優化被調用者的結尾和調用者對返回值的處理。

這樣做的最大好處是它可以使指令序列在內存中保持連續,並且窺視孔優化器通常會爲您節省一堆棧壓入/彈出。

+0

我應該使用什麼啓發式? 代碼的外觀如何? 如何檢查表達式是否爲常量表達式? – 2009-06-09 19:25:17

1

在將代碼解析爲樹之後完成內聯。

for(int loop=1;loop <= 10;++loop) 
{ 
    f(loop); 
} 

for-| 
    --- (Init Code)---Assign--| 
    |       --- loop 
    |       | 
    |       --- 1 
    --- (Condition)--- <= | 
    |      --- loop 
    |      | 
    |      --- 10 
    --- (Post) --- ++ | 
    |     --- loop 
    | 
    --- (Body) Call | 
        --- (Function Name) f 
        | 
        --- (Parameter List)---Node1 -- loop 
              | 
              NULL 

您還將有函數f解析樹。
要內嵌函數,您需要爲函數f創建樹的副本。然後通過樹解析,將所有對函數調用中使用的參數的引用替換爲變量(在本例中爲循環)。一旦完成了。用剛剛創建的新樹替換上面樹中的'Call'節點。