2009年4月17日 星期五

Lua與C語言的結合- Part1 設定檔的應用

Lua是一個C語言寫成的script language.


Lua是什麼 google 一下就有了 我擷取wiki的一部分資料來使用


Lua 的wiki (http://zh.wikipedia.org/w/index.php?title=Lua&variant=zh-hant)


特性


Lua是一種輕量語言,它的官方版本只包括一個精簡的核心和最基本的庫。這使得Lua體積小、啟動速度快。它用標準C語言編寫並以源代碼形式開放,編譯後僅僅一百餘K,可以很方便的嵌入別的程式裡。和許多"大而全"的語言不一樣,網路通訊、圖形界面等都沒有預設提供。但是Lua可以很容易地被擴展:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內置的功能一樣。事實上,現在已經有很多成熟的擴展模塊可供選用。


Lua是一種多重編程範式的程式設計語言:它只提供了很小的一個特性集合來滿足不同編輯範式的需要,而不是為某種特定的編輯範式提供繁雜的特性支援。例如,Lua並不提供繼承這個特性,但是你可以用元表來模擬它。諸如名字空間這些概念都沒有在語言基本特性中實現,但是我們可以輕易的用表結構(Lua唯一提供的複雜數據結構)輕易模擬。Lua可以在運行時隨時構造出一個函數,並把它看作一個對象(正是所謂的first class function),這個特性可以很好的滿足函數式編程的需要。這是提供了這些基本的元特性,我們可以任意的對語言進行自需的改造。

Lua原生支援的數據類型非常之少,它只提供了 數字(缺省是雙精度浮點數,可配置)、布爾量、字符串、表、子程序、協程(coroutine)以及用戶自定義數據這幾種。但是其處理表和字符串的效率非常之高,加上元表的支援,我們可以高效的模擬出需要的複雜數據類型(比如集合、數組等)。

Lua是一個動態弱類型語言,支援增量式垃圾收集策略。有內建的,與操作系統無關的協作式多線程(coroutine)支援。

================================================================


比起python perl來說lua非常的小 資源需求量也很低


Perl的原始碼 很亂 有些架構上 非常不適合C/C++ embed


python 就好很多 python 比起來 比perl好學 也好debug多


至於embed這方便 也處理得非常好 python架構有想到embed這一塊


但是python有一個缺點 就是他需要C++的compiler


那我們可以拿Lua作什麼用 除了拿來作script engine外



因為1. Lua 需求資源少 2.Lua API 好使用 3. 當檔案文法錯誤 會有訊息指出


還有一個很有用的功能 就是 當作"設定檔"或是"文字資源檔"


接下來 提供下面的作法 跟大家分享


1.Init lua


2. Load Lua file


3. How to trace lua object


前置作業 到Lua的網站download一份原始碼 跟你的程式結合在一起
Lua 5.1.4 Link: http://www.lua.org/ftp/lua-5.1.4.tar.gz


1.如何init Lua


lua_State 可以產生很多個 每一個代表一個Lua virtual machine


這也是lua 有考慮到embed之後的設計 ,perl就沒有這樣的好處




2. Load Lua file





3. Trace Lua object.


這邊提供一個trace/dump object的function
可以參考codes的作法 可以隨意implement 自己讀取變數或是儲存變數的函式
這邊 有一個非常重要的一點 就是 如何trace table
一般都會用 lua_objlen() 去讀取table的obj len
但是 你會發現 會有點怪怪的
如果你的table裡面 有另外一個table你會發現 lua_objlen()回來的數字並不包含sub-table
這個部分 我有機會 再另外開一篇來解釋這個東西
如果 你的table不會有含有string-index的table 請用lua-objlen() 然後用index去取得obj
要完整的trace一個table 要利用 lua_next() api (這樣出來的順序是不固定的)
如何使用請參考我提供的codes

setting.lua
----------------------------

----------------------------


trace後的結果
----------------------------

----------------------------

Source code:

_traceLuaGlobalObject(g_pLuaState,"ConfigDB",stdout);








參考資料:
在可插入脚本的应用程序中嵌入 Lua (http://www.ibm.com/developerworks/cn/linux/l-embed-lua/)
使用 Lua 编写可嵌入式脚本 (http://www.ibm.com/developerworks/cn/linux/l-lua.html)

沒有留言:

張貼留言