Lua To Cee

lua-users home
wiki

lua2c 是一個 Lua 模組和實用程式,用於將 Lua 5.1 原始碼轉換為 C API 程式碼。

說明

此實用程式將指定的 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%,但有望透過未來的最佳化獲得改善。

Lua 5.2 說明

下載

專案頁面

專案頁面目前是 https://lua-users.dev.org.tw/wiki/LuaToCee

作者

DavidManura

授權

(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]。有關這方面的初步工作,請參閱 SourceOptimizerLuaInspect

讓 C 表達式與 Lua 程式碼內嵌的某種語法也應該是待辦事項清單上的優先項目 (就像 Pyrex 一樣)。

特別是考量到 5.2 中的加強功能 (例如 lua_callk),應該要支援非同步程式。

建議更新至 Lua 5.2 (請參閱上面有關 5.2 的說明)。

狀態

很遺憾的,由於時間及優先順位考量,我目前的狀況無法積極地維護,或許還能進行一些小型的程式問題修正,或是有人願意付費,但如果您想要接手維護這部分並且修正上述的限制,也非常歡迎。

命名

這個套件名稱改為「lua2capi」會更好,強調這隻程式將產生 C 語法,並採取 Lua C API 呼叫的形式。另一種選擇是產生以 Lua 內部形式編寫的 C 語法。

參考資料


RecentChanges · preferences
edit · history
最後編輯日期 2010 年 9 月 1 日 上午 8:05 GMT (diff)