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; }
ps:
luaL_newstate用c運行庫的內存分配函數。
lua_newstate可自定義內存分配函數。
頭文件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。
擴展閱讀:
