Lua除了是一門擴充的言語外,還是一門“膠水語言”。最著名的就是作為遊戲的指令碼開發。
這裡主要說lua怎樣與c互動。
Lua和c語言通訊的主要方法是一個無所不在的虛擬棧。幾乎所有的API調用都會操作這個棧上的值。所有的資料交換,無論是Lua到C語言或C語言到Lua都通過這個棧來完成。棧可以解決Lua和C語言之間存在的兩大差異,第一種差異是Lua使用垃圾收集,而C語言要求顯式地釋放記憶體;第二種是Lua使用動態類型,而C語言使用靜態類型。
下載好Lua源碼,可以選擇在不同的平台編譯,編譯也很簡單,下面是在windows下的編譯方法。(我用的是lua5.1,感覺新版本變化很大,相應的教程也沒有5.1的多。)
1.開啟vs的命令列工具,工具-->visual studio 2005 command prompt
2.跳轉到 etc的上一級目錄,如:cd /d d:\lua
2.執行:etc\luavs.bat( 注意,是 \ 不是 /,寫錯了不能執行編譯 )
3.然後lua51.dll, lua51.lib, lua.exe, and luac.exe就產生在 src路徑下了。
當然,也可以自訂組建檔案的名字,具體請看luavs.bat。
然後就可以編寫第一個c與lua互動的程式。
#include <stdio.h>#include <string.h>extern "C" {#include "lua.h"#include "lauxlib.h"#include "lualib.h"}#pragma comment(lib, "lua.lib")int main(void){char buff[256];int error;lua_State *L = luaL_newstate();//建立一個新的環境luaL_openlibs(L);//開啟標準庫while(fgets(buff,sizeof(buff),stdin)!=NULL){error = luaL_loadbuffer(L,buff,strlen(buff),"line") || lua_pcall(L,0,0,0);if (error){fprintf(stderr,"%s",lua_tostring(L,-1));lua_pop(L,1);//從棧中彈出錯誤訊息}}lua_close(L);return 0;}
標頭檔lua.h定義了lua提供的基礎函數,包括建立lua環境、調用lua函數(如lua_pcall)、讀寫lua環境中全域變數,以及註冊供lua調用的新函數等。Lua.h中定義所有內容都有一個lua_首碼。
標頭檔lauxlib.h定義了輔助庫(auxiliary library,auxlib)提供的函數。它的所有定義都以luaL_開頭(如luaL_loadbuffer)。輔助庫是一個使用lua.h中API編寫出的一個較高的抽象層。Lua的所有標準庫編寫都用到了輔助庫。
注意:Lua指令碼的編譯執行是相互獨立的,在不同的線程上執行。通過luaL_newstate()函數可以申請一個虛擬機器,返回指標類型lua_State。今後其他所有Lua Api函數的調用都需要此指標作為第一參數,用來指定某個虛擬機器。所以lua_State代表一個lua虛擬機器對像,luaL_newstate()分配一個虛擬機器。lua類庫管理著所有的虛擬機器。銷毀指定虛擬機器的所有對像(如果有記憶體回收相關的無方法則會調用該方法)並收回所有由該虛擬機器動態分配產生的記憶體,在有些平台下我們不需要調用此函數,因為當主程式退出時,資源會被自然的釋放掉,但是但一個長時間啟動並執行程式,比如後台啟動並執行web伺服器,需要立即回收虛擬機器資源以避免記憶體過高佔用。
因為lua5.0到lua5.2介面略有變化,環境搭建也略有不同,詳情看源碼下的README。
擴充閱讀:
Lua 5.1 參考手冊:http://www.codingnow.com/2000/download/lua_manual.html
lua users wiki:http://lua-users.org/wiki/