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脚本中就能够经过该全局变量直接调用注册过的库函数。扩展