標籤:style blog http color get 使用
1. Lua解譯器
Lua解譯器是什嗎?
Lua解譯器是一個使用Lua標準庫實現的獨立的解譯器,是一個很小的Lua應用(總共不超過500行的代碼)。解譯器負責程式和使用者的介面:從使用者那裡擷取檔案或者字串,並傳給Lua標準庫,Lua標準庫負責最終的代碼運行。
當Lua作為獨立程式啟動並執行時候,Lua和Lua解譯器打交道。
2. Lua擴充程式
(1) Lua擴充C程式 : C作為應用程式語言,Lua作為一個庫使用
(2) C程式擴充Lua : Lua作為程式語言,C作為庫使用
在實際應用中,比如遊戲開發中日常活動、關卡、戰場等主要邏輯基本都是由Lua指令碼擴充完成。遊戲主程式調用動態指令碼處理,則是Lua擴充了C程式(C程式裝載Lua指令碼);而在指令碼中必須獲得一些玩家資訊,比如玩家所在地圖編號、玩家位置等等,則是C程式開放了API給Lua調用,是C程式擴充了Lua(Lua程式調用C)。
所以擴充的概念是相互的,你提供資訊給我,然後我幫你完成工作。當然可以純粹一方提供另一方服務,還要看實際需要環境。這裡只是以遊戲中Lua使用為例子說明:C開放API給Lua虛擬機器,Lua指令碼圍繞這些API完成委託的任務,然後C調用Lua指令碼完成邏輯。
3. Lua C API
Lua C API是Lua和C通訊的一組API,它的功能有這些:
(1)讀寫Lua全域變數的函數
(2)調用Lua函數的函數
(3)運行Lua代碼片斷的函數
(4)註冊C函數然後可以在Lua中被調用的函數
犧牲健壯性:API中的大部分函數並不檢查他們參數的正確性;如果你傳遞了錯誤的參數,可能得到"segmentation fault"這樣或者類似的錯誤資訊,而沒有很明確的錯誤資訊可以獲得。
獲得靈活性和簡潔性
4. 重要標頭檔和函數說明
(1) lua.h:定義了Lua提供的基礎函數,所有在lua.h中被定義的都有一個lua_首碼
建立一個新的Lua環境的函數:lua_open
調用Lua函數的函數:lua_pcall
讀取/寫入Lua環境的全域變數的函數:
void lua_pushnil (lua_State *L);
void lua_pushboolean (lua_State *L, int bool);
void lua_pushnumber (lua_State *L, double n);
void lua_pushlstring (lua_State *L, const char *s, size_t length);
void lua_pushstring (lua_State *L, const char *s);
int lua_is... (lua_State *L, int index);
int lua_gettop (lua_State *L);
void lua_settop (lua_State *L, int index);
void lua_pushvalue (lua_State *L, int index);
void lua_remove (lua_State *L, int index);
void lua_insert (lua_State *L, int index);
void lua_replace (lua_State *L, int index);
lua_settop(L, -1); /* set top to its current value */
lua_insert(L, -1); /* move top element to the top */
……
註冊可以被Lua代碼調用的新函數的函數
(2) lauxlib.h:lauxlib.h定義了輔助庫(auxlib)提供的函數,所有在其中定義的函數等都以luaL_打頭,輔助庫利用lua.h中提供的基礎函數提供了更高層次上的抽象;所有Lua標準庫都使用了auxlib。
5. lua_State結構
Lua庫沒有定義任何全域變數。它所有的狀態儲存在動態結構lua_State中,而且指向這個結構的指標作為所有Lua函數的一個參數。這樣的實現方式使得Lua能夠重入(reentrant)且為在多線程中的使用作好準備。
lua_State可以視為Lua運行環境,是一個封閉的環境。每次lua_open()都獲得一個新的Lua運行環境,與之前的環境沒有任何交叉因素
6. Lua和C通訊的秘密
Lua和c通訊的秘密在於:虛擬棧。棧的使用解決了C和Lua之間兩個不協調的問題:第一、Lua會自動進行垃圾收集,而C要求顯示的分配儲存單元,兩者引起的矛盾;第二、Lua中的動態類型和C中的靜態類型不一致引起的混亂。
棧是由Lua來管理的,記憶體回收行程知道那個值正在被C使用,Lua以一個嚴格的LIFO規則來操作棧。當你調用Lua時,它只會改變棧頂部分。C代碼卻有更多的自由;更明確的來講,你可以查詢棧上的任何元素,甚至是在任何一個位置插入和刪除元素。
C API遵循C語言的文法形式,這Lua有所不同。當使用C進行程式設計的時候,我們必須注意,類型檢查,錯誤處理,記憶體配置都很多問題。API中的大部分函數並不檢查他們參數的正確性;你需要在調用函數之前負責確保參數是有效。如果你傳遞了錯誤的參數,可能得到 \"segmentation fault\" 這樣或者類似的錯誤資訊,而沒有很明確的錯誤資訊可以獲得。另外,API重點放在了靈活性和簡潔性方面,有時候以犧牲方便實用為代價的。一般的任務可能需要涉及很多個API調用,這可能令人煩惱,但是他給你提供了對細節的全部控制的能力,比如錯誤處理,緩衝大小,和類似的問題。如本章的標題所示,這一章的目標是對當你從C調用Lua時將涉及到哪些內容的預覽。如果不能理解某些細節不要著急,後面我們會一一詳細介紹。不過,在Lua參考手冊中有對指定函數的詳細描述。另外,在Lua發布版中你可以看到API的應用的例子,Lua獨立的解譯器(lua.c)提供了應用代碼的例子,而標準庫(lmathlib.c、lstrlib.c等等)提供了程式庫代碼的例子。
從現在開始,你戴上了C程式員的帽子,當我們談到“你/你們”,我們意思是指當你使用C編程的時候。在C和Lua之間通訊關鍵內容在於一個虛擬棧。幾乎所有的API調用都是對棧上的值進行操作,所有C與Lua之間的資料交換也都通過這個棧來完成。另外,你也可以使用棧來儲存臨時變數。棧的使用解決了C和Lua之間兩個不協調的問題:第一,Lua會自動進行垃圾收集,而C要求顯示的分配儲存單元,兩者引起的矛盾。第二,Lua中的動態類型和C中的靜態類型不一致引起的混亂。我們將在24.2節詳細地介紹棧的相關內容。
接著看:http://www.cnblogs.com/youxin/p/3797094.html