C++ – Lua C API

C++ – Lua C API

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代碼卻有更多的自由;更明確的來講,你可以查詢棧上的任何元素,甚至是在任何一個位置插入和刪除元素。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章