傑米·傑寧斯

lua-users home
wiki

說明

離開 Lua 社群約 5 年後,我回來,而且我為此感到高興!

以下是我在 2009 年完成的部分工作,在我看來,這些概念仍然重要,但此程式碼無法搭配最新版本的 Lua 使用。

興趣

我對 Lua 的興趣源自於對程式語言設計和實作的一般興趣,對我來說,這是一種消遣、嗜好,也是與程式設計保持連結的機會,因為我在工作中不進行編碼。

Darwin 模組系統

2009 年 6 月/7 月的暑假期間,我寫了 針對 Lua 的 Darwin 模組系統 的初稿,它是對原生 Lua 模組系統的延伸。早在 1990 年代初期,我與 [強納森·李斯] 共事數年。當時我使用 Lisp 進行程式設計,並有幸向強納森學習了 Scheme,[Scheme 48] 的模組系統非常有用,因為它提供了多種安全性保障。Darwin 模組系統是我自己嘗試在 Lua 中取得部份相同保障的方法,尤其是

由於我對 Lua 有興趣作為一種嵌入式語言,因此我希望對授與給使用者程式碼的能力有強大的保障,因為使用者不會是我的專案開發人員;使用者將藉由注入他們自己的 Lua 程式碼來客製化我的專案。

與 Lua 模組系統的關係

Lua 模組系統極其靈活,就如 Lua 本身,此模組實作相當「開放」,因此可以擴充以執行所有奇特且令人驚奇的事。為了獲得安全性保障,我將 Darwin 寫為一個位於 Lua 模組系統上方 (旁邊?) 的圖層。當你使用 Darwin 時,Lua 模組系統就能完全運作。Darwin 只增加了額外的能力:建立一個執行時間環境,它只能讀取一個明確模組集,而且無法讀取更多。

使用 Darwin,你可以執行一些沒有 Darwin 會很麻煩 (或不可能執行) 的事情,例如

感謝

Darwin 的主要概念來自 Scheme48,進一步受到 ML 的影響。在完成 Darwin 撰寫後才讀到 Jonathan Rees 的[博士論文],看來我在 Lua 中實現了他相當一部分的安全核心設計。還有一些事情我尚未完成,以完善我認為 Darwin 所需要的功能,包括

程式碼和範例

附檔是一個 tar/gzip 檔案,包含原始碼和一些測試。我寫了一些文件,是一份非正式論文,描述該設計,此外還有一小節參考文件

Darwin 是 (C) 2009,Jamie Jennings 所寫,並將在 MIT 開放原始碼授權條款下發行。

Darwin 是純 Lua,適用於 Lua 5.1.4。我不知道它是否適用於舊版本。

這裡是一個我每次啟動 Lua 時都會載入的檔案(在載入 Darwin 之後)。它定義了一組我經常使用的模組結構。根據我設定 Darwin 的方式(這是預設設定),Darwin 會在 package.preload 中放置每個宣告結構的項目。這樣,我的程式碼可以簡單的呼叫 require,例如 require "list"require "lanes"。Darwin 與現有的 Lua 套件系統很順利的工作。

structure.declare { name="list"; 
		    location="."; 
		    open={"_G"};
		    objects={"null"};
		    files="list.lua";
		 }

-- Just for demonstration purposes
structure.declare { name="pair"; 
		    signature={"cons", "car", "cdr", "isnull", "null"};
		    open={"_G"};
		    objects={"null"};
		    files="list.lua";
		 }

structure.declare { name="recordtype";
		    -- debug package is only needed because recordtype uses "strict"
		    open={"_G", "package"; "table", "string", "debug"};
		    environment=[[ require("recordtype"); return recordtype ]];
		 }

structure.declare { name="lprocess";
		    open={"package"};
		    environment=[[ require "lprocess"; return lprocess ]];
		 }

structure.declare { name="queuestack";
		    location=".";
		    files="queuestack.lua";
		 }

structure.declare { name="points";
		    location=".";
		    open={"_G", "math"};
		    objects={"point", "points"};
		    files="points.lua"
		 }

給 MacOS 和 Windows 使用者的注意事項:你可能需要對 _darwinpackage.lua_ 做一些小修改,才能讓 Darwin 正確載入原生(C/C++)函式庫。這個修改,及其原因,在文件中的「限制事項」中說明。我會在某個時間點建立一個暫時解決方案。


RecentChanges · 偏好設定
編輯 · 歷程記錄
上次編輯 2016 年 2 月 13 日下午 1:48 GMT (diff)