1. 程式人生 > >C與Lua互動之互動原理

C與Lua互動之互動原理

lua作為指令碼語言,就是用來擴充套件宿主程式或者嵌入到宿主程式中的,這裡宿主程式使用C來講解下Lua與C互動的原理。在這之前先講下C語言是如何呼叫函式以及函式引數的。

C函式和引數的呼叫

我們都知道C語言的函式呼叫時通過函式呼叫棧實現的,當一個函式呼叫另一個函式時,會按照約定的格式將要呼叫的函式的引數壓人棧中,在被呼叫的函式中,可以按照約定的規格將引數從棧中取出, 同理對於返回值的傳遞也是通過堆疊實現的, C語言的函式的原型決定了壓入棧中的引數的數量以及型別

Lua的虛擬堆疊

Lua與C之間的互動也是類似於C語言的堆疊,Lua和C語言之間的相互呼叫和訪問都通過堆疊進行,這樣的方式解決了不同型別變數相互訪問的問題。具體可以參考下圖:


由於C和Lua是不同層次的語言,因此C語言的變數和Lua中的變數以及函式不能直接的互動,我們假定C語言和Lua都有自己的“空間(C Space和Lua Space)”。而這兩個空間之間的互動就通過上圖中的這個虛擬堆疊來解決。為何採用虛擬堆疊的方式來進行互動呢?其目的是在提供強大的靈活性的同時避免互動時兩種語言變數型別的組合爆炸。

C呼叫Lua全域性變數

通過上圖可以看到,C呼叫Lua全域性變數的步驟是:

1 將Lua中的變數從Lua Space 取出放入 Virtual Stack中; 

2 將Virtual Stack中的變數取到C Space中

C語言中有操作堆疊的權利,因此前面說到的兩步全都是在C語言中完成的。

Lua呼叫C的函式

由於Lua沒有操作堆疊的權利,因此Lua想使用C的函式時,需要在程式呼叫之前,將C提供給Lua使用的函式通過註冊機制註冊到當前lua_State全域性變數中,之後Lua指令碼中就可以通過該全域性變數直接呼叫註冊過的庫函式。