1. 程式人生 > >Lua庫和工具

Lua庫和工具

相比Java、Python、Perl,Lua的開源工具和庫可能並不算多,但其中不乏優秀之作。以下介紹的資源均可在http://lua-users.org/wiki/LuaAddons上找到,而且絕大多數都遵循著與Lua相同的許可協議。

一、Kepler

    Kepler是一個簡單且輕量的Web開發平臺(但這並不意味著只能用它來開發簡單的應用),支援用Lua撰寫Web程式,因此相當易學易用,並且能較方便地應用在一些資源受限的系統中。由於使用ANSI C和Lua進行開發,所以它能移植到任何支援ANSI C的平臺上。

    Kepler由多個Lua擴充套件庫組成,包括CGILua、LuaSocket、LuaFileSystem、Copas、LuaSQL、LuaLDAP、LuaExpat、LuaXMLRPC、LuaSOAP、LuaZip、Xavante等,它們可大致分為核心庫和功能支撐庫兩部分。其中核心是CGILua和LuaSocket,後者負責TCP/UDP sockets的操作,前者則可以建立動態頁面並處理web表單上的輸入資料。Kepler通過CGILua起動器(launcher)使得Web伺服器能執行CGILua和Web程式並與之通訊。目前的版本已經包括適合CGI、FastCGI、Apache、IIS、Tomcat、Zope的CGILua起動器,因此用Lua開發的Web程式可以在這些種類的伺服器中自由遷移,只要同時安裝上對應的CGILua起動器。

    LuaFileSystem是對標準Lua庫中檔案讀寫功能的補充,它提供了一種可移植的方法來訪問系統的目錄結構和檔案屬性。Copas則是一個基於協程的服務排程器。Xavante是一個用Lua開發的支援HTTP 1.1的Web伺服器,它直接支援CGILua而無需起動器。

    其它的元件提供了SQL資料庫訪問、XML解析、LDAP、SOAP、XMLRPC、ZIP檔案操作等功能,使用者如果只需要其中的某些功能,可以抽出相關元件(及其所依賴的元件)來使用。

二、wxLua

    GUI是開發人員花費氣力比較大的一個領域,因此簡化GUI程式的編寫一直是廣大程式設計師的努力方向。隨著指令碼語言的興起,將動態、靈活、易用的指令碼語言引入到GUI開發中是一種非常有價值的嘗試。由於複雜的GUI佈局需要大量的描述資訊,所以比起其它指令碼來,既適合程式設計又適合描述資料的Lua語言在構建GUI上就具有獨特的優勢。

    wxWidgets是一個著名的跨平臺C++ GUI庫,wxLua在Lua與wxWidgets之間架起了一座橋樑,通過它Lua程式碼幾乎可以呼叫wxWidgets的所有功能。wxLua基本將wxWidgets的類體系對映到了Lua(基於原型)的物件模型中,這使得程式設計師能以基於物件或面向物件的風格來開發wxLua程式。一個Lua指令碼的撰寫、執行、測試和修改可以非常快速,這無疑大大提高了GUI程式的開發效率,因此wxLua非常適合快速原型的構造。另外,Lua本身以及wxWidgets良好的可移植性使得相應的Lua GUI程式在許多平臺上都能順暢地執行。

三、Pluto

    雖然Lua中的表能通過表構造器以Lua程式碼的形式儲存到檔案中從而實現持久化,但當資料之間有著複雜的引用關係,並且存在迴圈引用、共享引用等特殊情況時,這個任務就變得相當困難與繁瑣了。Pluto持久化庫能夠為使用者解決這個難題。在它的幫助下程式設計師可以將任意複雜的表資料儲存到特殊格式的二進位制檔案中以待將來恢復,庫會自動處理迴圈引用之類的情況。

    除表之外,Pluto還支援函式(確切地說是閉包)、thread的持久化,這種能力非常有意義。大家都知道程式除錯中的一個基本動作就是復現bug,但很多時候bug產生的條件是非常複雜的,依賴很多因素,開發者很難精確地構建出完全一致的執行環境。而利用Pluto對函式和thread的持久化能力,我們可以把bug發生時程式的完整執行環境儲存下來,今後就可憑此方便地復現bug。另外一個重要應用是遊戲進度的儲存。實現遊戲邏輯的Lua指令碼的執行狀態能隨時寫入到檔案中留待將來恢復,這使得在任何時間點儲存遊戲成了一件非常容易的事情。

四、LuaCOM

    LuaCOM是一個支援Lua與符合COM規範的元件物件(確切一點說是自動化物件)進行互動的擴充套件庫。所謂互動包括了兩個方面,首先是允許Lua程式使用COM物件。LuaCOM支援註冊在系統登錄檔中的COM物件的動態例項化,也支援動態訪問執行中的物件。在LuaCOM的幫助下,呼叫COM物件方法就象呼叫普通Lua函式一樣,存取屬性也與存取表的欄位類似,同時它還負責Automation資料型別與Lua資料型別的自動轉換。有了這些特性,Lua程式操作COM物件就變得容易多了,再加上Lua天生的動態性,這無疑使其成了一門非常靈活的元件裝配語言。

    互動的另外一個方面就是支援用Lua來實現(自動化)元件物件並提供給外部客戶使用。LuaCOM同時支援程序內和程序外元件,它提供了一些輔助函式來處理註冊、物件例項化這類事情,從而簡化了相關工作。由於LuaCOM實際上是根據Lua的表來構造一個COM物件,所以我們可以做一些非常有趣的事情:在userdata資料型別(代表不屬於Lua世界的資料結構)和動態元機制的支援下,Lua能通過表訪問各種各樣的外部資料,包括C++物件、C結構或者CORBA物件等等;LuaCOM可以很方便地將代表這些資料的表包裝成一個COM物件給外部使用,從而使得那些老邁的應用程式和庫無需太多的努力便能躋身於COM世界。

五、tolua

    直接用C實現某些功能,然後將相應的函式匯入到Lua中是很常見的做法。不過儘管Lua提供了與C語言互動的API,但使用者必需手工進行繁瑣的Lua棧(用於與C交換資料)操作,而且還需注意兩種語言資料型別的正確轉換。難怪有人說使用Lua的C API就象在使用匯編語言一樣。為了減輕程式設計師的負擔,一些C/C++ Wrapper應運而生。

    tolua本身不是一個Wrapper,但它是一個Wrapper程式碼自動生成器。它使用一種稱為包(package)的檔案來描述要匯入到Lua環境中的常量、變數、函式、類和方法,這種檔案按照簡化了的C++標頭檔案格式編寫。使用時首先讓tolua解析包檔案以生成含有相應膠水程式碼的C/C++原始檔。然後將生成的原始檔編譯並與那些具體實現功能的目標模組連結起來。

    tolua雖然自動產生膠水程式碼,但需另外撰寫描述檔案,所以仍然不夠方便。其它一些Wrapper庫則利用C++模板超程式設計技術來自動生成合適的連線程式碼,從而避免了額外的描述檔案,比如使用boost庫的luabind。

六、LuaJIT

    Lua非常高效,它執行得比許多其它指令碼(如Perl、Python、Ruby)都快,這點在第三方的獨立測評中得到了證實。儘管如此,仍然會有人不滿足,他們總覺得“嗯,還不夠快!”。LuaJIT就是一個為了再榨出一點速度的嘗試,它利用JIT編譯技術把Lua程式碼編譯成本地機器碼後交由CPU直接執行。LuaJIT測評報告表明,在浮點運算、迴圈和協程的切換等方面它的加速效果比較顯著,但如果程式大量依賴C編寫的函式,那麼執行速度便不會有什麼改進。目前LuaJIT只支援X86 CPU。

    LuaJIT中包括一個名為Coco的庫,使用者可以單獨使用它。Coco為C函式提供了真正的協程能力,使用者能在C函式內部的任何一點將協程掛起,然後在將來用協程恢復操作返回到那一點。在標準Lua中,協程的掛起與恢復是不允許跨越C函式呼叫邊界的。Coco使用了一些依賴於特定系統的特性,因此在移植程式時要特別注意。

七、ChunkSpy

    Lua的虛擬機器位元組碼指令集並非語言定義的一部分,因此官方沒有提供相應的文件。使用者當然可以通過檢視相關原始碼來獲取資訊,但這畢竟不方便。

    ChunkSpy是一個Lua虛擬機器位元組碼反彙編器,可以將一個二進位制Lua程式碼塊輸出為非常易讀的各種格式(詳細或簡略,帶或不帶源程式)的位元組碼彙編檔案。而且它還支援互動式的反彙編,使用者在敲入一行程式碼後立刻就能看到對應的位元組碼指令。ChunkSpy的作者寫過一篇詳細的介紹Lua5虛擬機器指令的文章,名為《A No-Frills Introduction to Lua 5 VM Instructions》,你在專案主頁上能找到它。這篇文章現在已經針對最新的Lua5.1做了更正。另外,他還是Yueliang專案的開發者,這個專案採用Lua語言本身來實現Lua。從專案名來看,作者應該是個華人。

八、其它

    另外一些庫與工具還包括LuaEDIT、LuaEclipse、VS’05LuaLangPack(它們都是IDE或IDE外掛),LuaWrapper、CaLua、CPB、CppLua(Wrapper庫),LuaProfiler(效能測量工具)等,讀者可以在lua-user.org與luaforge.net網站上找到它們以及其它有用資源。