C與Lua交互之交互原理

lua做爲腳本語言,就是用來擴展宿主程序或者嵌入到宿主程序中的,這裏宿主程序使用C來說解下Lua與C交互的原理。在這以前先講下C語言是如何調用函數以及函數參數的。函數

C函數和參數的調用

咱們都知道C語言的函數調用時經過函數調用棧實現的,當一個函數調用另外一個函數時,會按照約定的格式將要調用的函數的參數壓人棧中,在被調用的函數中,能夠按照約定的規格將參數從棧中取出, 同理對於返回值的傳遞也是經過堆棧實現的, C語言的函數的原型決定了壓入棧中的參數的數量以及類型lua

Lua的虛擬堆棧

Lua與C之間的交互也是相似於C語言的堆棧,Lua和C語言之間的相互調用和訪問都經過堆棧進行,這樣的方式解決了不一樣類型變量相互訪問的問題。具體能夠參考下圖:
spa


因爲C和Lua是不一樣層次的語言,所以C語言的變量和Lua中的變量以及函數不能直接的交互,咱們假定C語言和Lua都有本身的「空間(C Space和Lua Space)」。而這兩個空間之間的交互就經過上圖中的這個虛擬堆棧來解決。爲什麼採用虛擬堆棧的方式來進行交互呢?其目的是在提供強大的靈活性的同時避免交互時兩種語言變量類型的組合爆炸。
3d

C調用Lua全局變量

經過上圖能夠看到,C調用Lua全局變量的步驟是:blog

1 將Lua中的變量從Lua Space 取出放入 Virtual Stack中; 原型

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

C語言中有操做堆棧的權利,所以前面說到的兩步全都是在C語言中完成的。
原理

Lua調用C的函數

因爲Lua沒有操做堆棧的權利,所以Lua想使用C的函數時,須要在程序調用以前,將C提供給Lua使用的函數經過註冊機制註冊到當前lua_State全局變量中,以後Lua腳本中就能夠經過該全局變量直接調用註冊過的庫函數。擴展