Lua To Cee |
|
此實用程式將指定的 Lua 原始碼檔案轉換為等值的 C 原始碼檔案,並以 Lua C API 呼叫的方式撰寫。至少它可以用於 Lua 語言的絕大部分子集(詳見以下限制事項)。
編譯器完全以 Lua 編寫,而且不需要建置/安裝。此專案重新使用 Metalua 的 gg/mlp 解析器將 Lua 原始碼轉換為以 Metalua 樣式 [1] 編寫的 AST,然後再由編譯器操作。lua2c 雖然不需要 Metalua 本身,但由於 gg/mlp 已包含在發行套件中(已修補的 metalua-0.4.1-rc1),並且是以純粹的 Lua 編寫。
範例用法
lua lua2c.lua test/bisect.lua
它會產生一個與此處所示類似的 C 檔案:[bisect.c]。
您也可以搭配外殼指令碼「clua」編譯 Lua->C->機器碼並一次執行所有步驟。但是您可能會需要編輯檔案中的變數以配合您的系統,因為此實用程式會呼叫 C 編譯器。
./clua test/bisect.lua
lua2c 甚至可以編譯它自己!(注意:-c 選項只會編譯而不執行。)
./clua -c lua2c.lua # compile lua2c binary ./lua2c examples-lua/bisect.lua # test
我相信這個專案不僅從理論上來說很好用,而且還有許多潛在用途
警告:此程式碼通過大量 Lua 5.1 測試組 [7],而且可以自行編譯,但程式碼是新的,而且仍然可能會有錯誤。特別是,某些語言特徵(例如,共程)尚未實作。請參閱 lua2c.lua 中的留言,以取得詳細資料。請將錯誤/程式碼修正報告張貼在 wiki 上。
lua2c 目前不支援共程、通常拒絕 C 函數的函數(例如,setfenv),以及可能是尾端呼叫最佳化的函數。並非所有函數都在 C 中具有完全類似的函數。共程可能永不支援。不過,可能可以探索一些解決方案 [8][9],包括製作維護 Lua 表中共程內容的程式碼。
已經實作封閉函數和 upvalue,但由於實作(請參閱下方實作說明),建立並存取 upvalue 有點慢,而且有望能獲得改善。
現在程式碼相當完整/強健,可以更注意最佳化程式碼產生。在執行一些測試 [11] 時,效能為一般 Lua 的 25% 到 75%,但有望透過未來的最佳化獲得改善。
git clone git://github.com/davidm/lua2c.git
」以 git 簽出。
專案頁面目前是 https://lua-users.dev.org.tw/wiki/LuaToCee。
(c)2008 DavidManura。授權與 Lua(MIT 授權)採用相同的條款。完整的授權詳細資料請參閱隨附的 LICENSE 檔案。請張貼任何程式碼修正/改善事項。
部分實作說明可能會放在這裡。
重要的主題包括
如果加入一個全域性的 (逐檔案的) 程式碼最佳化器,這個專案可以獲得顯著的幫助。最重要的是,某種類型的程序間 資料流分析 [2] 可以推斷出程式碼中許多表達式的基本資料類型 (例如這個值是個數字、沒有元表、是個具有特定值的不變數、或是正值),尤其當程式大量使用局部 (詞法) 變數時。或者,可以支援特殊註解 (例如在 LuaInspect 中的「--!」) 來讓程式設計師注入這項資訊。如果將 AST 添加這些資訊做裝飾,程式碼產生器可以將一般性的程式碼替換成更具體的程式碼。例如,Lua 程式碼「a+b」通常轉譯成 Lua 堆疊上的 a 跟 b 值,並有 __add 元方法的查詢。然而,如果已知 a 跟 b 是數字,這可以直接轉譯成 C 程式碼「a+b」,其中 a 跟 b 是 C 堆疊上的 C double 型別。我們沒有理由無法完成這種類型的轉換
-- Lua code local function f(n) local sum = 0 for i=1,n do sum = sum + i end -- note: sum and n are obviously always numbers. return sum end print(f(5))
// C code double sum = 0; // C datatype for(int i=1; i<=5; i++) { sum = sum + i; } // no overhead! lua_getfield(L,LUA_ENVIRONINDEX,"print"); lua_pushnumber(L,sum); lua_call(L,1,0);
這裡可能跟 LuaJIT 及其他專案有些重疊 [3]。有關這方面的初步工作,請參閱 SourceOptimizer 和 LuaInspect。
讓 C 表達式與 Lua 程式碼內嵌的某種語法也應該是待辦事項清單上的優先項目 (就像 Pyrex 一樣)。
特別是考量到 5.2 中的加強功能 (例如 lua_callk),應該要支援非同步程式。
建議更新至 Lua 5.2 (請參閱上面有關 5.2 的說明)。
很遺憾的,由於時間及優先順位考量,我目前的狀況無法積極地維護,或許還能進行一些小型的程式問題修正,或是有人願意付費,但如果您想要接手維護這部分並且修正上述的限制,也非常歡迎。
這個套件名稱改為「lua2capi」會更好,強調這隻程式將產生 C 語法,並採取 Lua C API 呼叫的形式。另一種選擇是產生以 Lua 內部形式編寫的 C 語法。