Lua介紹極其在C#項目中的應用

來源:互聯網
上載者:User

Lua在C#項目中的應用:

Lua 是一個小巧的指令碼語言。作者是巴西人。該語言的設計目的是為了嵌入應用程式中,從而為應用程式提供靈活的擴充和定製功能。它的首頁是 www.lua.org。
Lua指令碼可以很容易的被C/C++代碼調用,也可以反過來調用C/C++的函數,這使得Lua在應用程式中可以被廣泛應用。不僅僅作為擴充指令碼,也可以 作為普通的設定檔,代替XML,Ini等檔案格式,並且更容易理解和維護。

在C#中使用Lua也十分簡單。

LuaInterface is a library for integration between the Lua language and Microsoft .NET platform’s Common Language Runtime (CLR). Lua scripts can use it to instantiate CLR objects, access properties, call methods, and even handle events with Lua functions.

從LuaInterface 網站上可以下載到這個庫。在你的項目中引用LuaInterface.dll後就可以開始了。

BigTank項目還沒有確定是否要開源,所以我拿自己寫的電子寵物程式示範一下(它也用了Lua,你可以在實驗室頁面找到它的全部原始碼)。

C#:

//...<br />/// <summary><br />/// Lua虛擬機器<br />/// </summary><br />private static Lua luaVM = null;<br />/// <summary><br />/// 寵物的建構函式<br />/// </summary><br />public Pet(PetForm _petForm, string _petName, string _petPath)<br />{<br /> petState = new PetState();<br /> petForm = _petForm;<br /> petName = _petName;<br /> //構造Lua虛擬機器以解析寵物AI<br /> luaVM = new Lua();<br /> //註冊提供給寵物AI的API函數<br /> Type tThis = this.GetType();<br /> luaVM.RegisterFunction("PetDo", this, tThis.GetMethod("LuaPetDo"));<br /> luaVM.RegisterFunction("PetDoFrame", this, tThis.GetMethod("LuaPetDoFrame"));<br /> luaVM.RegisterFunction("Sleep", this, tThis.GetMethod("LuaSleep"));<br /> //載入AI檔案<br /> luaVM.DoFile(System.AppDomain.CurrentDomain.BaseDirectory + _petPath + "//ai.lua");<br />}

其中RegisterFunction作用是註冊C#代碼中的一個public(最新版本的LuaInterface支援private)函數來供 Lua指令碼使用,其中無需關心參數的個數以及類型。

Lua:

PetDo("Sleep");

執行DoFile後會調用Lua指令碼,後者則調用C#中的PetDo函數完成指定動作。

 

附:Lua 詳細介紹

Lua從一開始就是作為一門方便嵌入(其它應用程式)並可擴充的輕量級指令碼語言來設計的,因此她一直遵從著簡單、小巧、可移植、快速的原則,官方實現完全 採用ANSI C編寫,能以C程式庫的形式嵌入到宿主程式中。Lua的每個版本都保持著開放源碼的傳統,不過各版採用的許可協議並不相同,自5.0版(最新版是5.1) 開始她採用的是著名的MIT許可協議。正由於上述特點,所以Lua在遊戲開發、機器人控制、分布式應用、影像處理、生物資訊學等各種各樣的領域中得到了越 來越廣泛的應用。其中尤以遊戲開發為最,許多著名的遊戲,比如Escape from Monkey Island、World of Warcraft、大話西遊,都採用了Lua來配合引擎完成資料描述、組態管理和邏輯控制等任務。

作為一門過程型動態語言,Lua有 著如下的特性:

1、變數名沒有類型,值才有類型,變數名在運行時可與任何類型的值綁定;

2、語言只提供唯一一種 資料結構,稱為表(table),它類似key-value關聯陣列,可以用任何類型的值作為key和value。提供了一致且富有表達力的表構造文法, 使得Lua很適合描述複雜的資料;

3、函數是一等類型,支援匿名函數和正則尾遞迴(proper tail recursion);

4、支援詞法定界(lexical scoping)和閉包(closure);

5、提供thread類型和結構化的協程 (coroutine)機制,在此基礎上可方便實現協作式多任務;

6、運行期能編譯字串形式的程式文本並載入虛擬機器執行;

7、通過元表(metatable)和元方法(metamethod)提供動態元機制(dynamic meta-mechanism),從而允許程式運行時根據需要改變或擴充文法設施的內定語義;

8、能方便地利用表和動態元機制實現基 於原型(prototype-based)的物件導向模型;

9、從5.1版開始提供了完善的模組機制,從而更好地支援開發大型的應用 程式;

Lua的文法類似PASCAL和Modula但更加簡潔,所有的文法產生式規則(EBNF)不過才60幾個。熟悉C和 PASCAL的程式員一般只需半個小時便可將其完全掌握。而在語義上Lua則與Scheme極為相似,她們完全共用上述的1、3、4、6點特性, Scheme的continuation與協程也基本相同只是自由度更高。最令人信服的是,兩種語言都只提供唯一一種資料結構:Lua的表和Scheme 的列表(list)。正因為如此,有人甚至稱Lua為“只用表的Scheme”。

庫和工具

相比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網站上找 到它們以及其它有用資源。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.