資源最佳化程式 |
|
內聯是一種局部評估的形式 [1]。
程式必須要使用 [Metalua 0.5](開發分支)。
程式包含下列檔案
Download tar file from http://github.com/fab13n/metalua/tree/0.5-branch . tar xzvf fab13n-metalua-28e8e1037ab33d96c123667f4c3fc94b5aca83bc.tar.gz mv fab13n-metalua-28e8e1037ab33d96c123667f4c3fc94b5aca83bc metalua cd metalua && make Download sourceoptimizer.mlua and place in metalua/build/lib/dmlib . Download sourceoptimize.lua and place in metalua/ . Download fib.lua example and place in metalua/ . ./build/bin/metalua sourceoptimize.lua fib.lua # or ./build/bin/metalua sourceoptimize.lua fib.lua | lua -
以下是基礎範例
-- input: local y=-1 local function square(x) return x*x end local function g(x) return x >= 0 and square(square(x))+1 or 1 end while (function() y = g(y)^(1/4) return y < 2 end)() do print(y) end -- output: local y = - 1 while 1 do local __v13x = y local __v10 = 0 <= __v13x if __v10 then local __v12x = __v13x local __v14x = __v12x * __v12x __v10 = __v14x * __v14x + 1 end local __v11 = __v10 if not __v11 then __v11 = 1 end y = __v11 ^ (1 / 4) if not (y < 2) then break end print (y) end
以下是內聯幾個 Lua 範例的狀況(函式名稱前需要加上「local」,這是內聯所需要的)
程式可以內聯立即評估的匿名函式
x=(function(x) return x*x end)(y()) --> local __v1x=y() x=__v1x*__v1x
以及「常數」的局部函式(函式變數從未修改)
local function square(x) return x*x end; x=square(y()) --> local __v1x=y() x=__v1x*__v1x
程式可以刪除非必要函式,例如已完全內聯的函式(如上述範例)。程式可以正確地將表示式轉換為敘述
x = y or (function(x)z=1 return x*x end)(w) --> local __v2=y if not __v2 then local __v1x=w z=1 __v2=__v1x*__v1x end x=__v2
if (function()x=x+1 return x end)() then f() elseif (function()y=y+1 return y end)() then g() else h() end --> x=x+1 if x then f()else y=y+1 if y then g()else h()end end
使用 setfenv
和具有除錯函式庫的堆疊層級的函式可能無法正確地內聯。此問題可能會發生在存取任何全域變數時
local function f() local _ = x end f()
理論上我們不應該內聯上述函式,因為存取全域變數 x
「可能會」在全域環境中觸發元表,這可能會反過來變更 f
的環境,因此內聯 f
將會變更呼叫 f
的呼叫者環境。(LuaFiveTwo 中的環境將不再是個問題,但某些除錯函式仍會使用堆疊層級。)理想情況下,翻譯器應該擴充支援存在 Lua 註解中的指令,這些指令會定義我們想內聯的積極度
--!inline local function f() local _ = x end f()
它可以以每個函式為基礎,也可以在檔案中使用更全域的預設設定。(請參閱 LuaFish 中的 luaanalyze,以了解建議的語法設計。)
請參閱 sourceoptimizer.mlua 的原始碼以了解詳細資訊。
警告:在特定情況下可能無法正常運作,例如內聯函式使用 setfenv 或使用堆疊層級的除錯函式(請見上述說明)。LuaFiveTwo 會提升 getfenv/setfenv 問題的影響。
local __t=t; for i=1,#__t do local v=__t[i]
" 取代 "for i,v in ipairs(t) do
" (通常效率較高)。僅在檔案中未重新定義 `ipairs` 時執行。但允許 "local ipairs = ipairs
"。if false then ... end
"