写在最前
由于工作需要,有幸正真地开始接触lua。
lua一直是动态执行脚本中的宠儿,而究其原因不外乎简介方便,效率高。我甚至看到过有帖子说lua就是为了动态化c而生的,c是静态的,是编译型的,这使得他的灵活性大大下降,但是lua则弥补了他的短板。
并且lua本身也是由c实现的,整个虚拟机十分轻量独立,天不生你lua哥,万古c界如长夜。
相关背景
其实任何的程序与程序或代码段与代码段的交互只有两点,第一是调用,第二是数据的传递。因为程序的本质就是各种微小的子过程进行递归地聚合。最终成为一个能解决某种需求的应用程序体。
而由于lua引擎本身就是由c代码实现的,且本身轻量化的特性,在一个c程序内可以自由地创建多个虚拟机实例,而整个调度运行过程也可以轻易控制,而在lua影响c的方面,lua引擎自身就提供了动态注册lua函数例程的功能。
正文开始
Lua与c逻辑代码之间的值传递全部通过一个虚拟栈实现,该栈已经由引擎代码封装细节。我们只需要像正常操作c++的栈数据结构一样,进行一些push,get类似的操作即可设置和获取lua相关的值。
而栈上的每个位置的含义,是我们需要关注的重点:栈和汇编类似,按照数据声明或出现的顺序压栈,函数调用时也是从左到右压栈,符合认知常识。
但对于栈位置的标记,lua使用-1代表栈顶,依次顺延。而采用1代表栈底。示例:
在图中所示的时候,栈1和-8代表同一个位置,因此使用相关的函数取值或设值时参数传入1和-8是同一个值。
实操代码:
--data.lua
length = 5
width = 10
heigth = 20
有这样一段lua代码,由上文阐述可知。length 全局变量最先被放入栈,接着是width,最后是heigth 。因此lua虚拟栈情况为:
此时下面两行代码都表示取height变量。
luaL_checknumber(luaEnv, -1);
luaL_checknumber(luaEnv, 3);