云服务器

C++与lua

2017-06-21 15:14:10 0

前段时间的讲座讲到openrest,它是一个基于 Nginx 与Lua 的高性能 Web 平台,为什么有lua出现在里面?在使用C++做服务器开发中,经常会使用到脚本技术,Lua是最优秀的嵌入式脚本之一。Lua的轻量、小巧、概念之简单,都使他变得越来越受欢迎。

Lua堆栈

要理解Lua和C++交互,首先要理解Lua堆栈。

简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出。

在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶。如图:

Lua API没有定义任何类似lua_Value的类型。替代的方案,它用一个抽象的栈在Lua与C之间交换值。栈中的每一条记录都可以保存任何Lua值。无论你何时想要从Lua请求一个值,调用Lua,被请求的值将会被压入栈。无论你何时想要传递一个值给Lua,首先将这个值压入栈,然后调用Lua。我们仍然需要一个不同的函数将每种C类型压入栈和一个不同函数从栈上取值,但是我们避免了组合式的爆炸。另外,因为栈是由Lua来管理的,垃圾回收器知道那个值正在被C使用。几乎所有的API函数都用到了栈。

C++调用Lua

简单的加法例子 main.cpp ```

include <stdio.h>

extern "C"{ #include "lua.h" #include "lualib.h" #include "lauxlib.h" };

lua_State *L; int luaAdd(int x, int y) { int sum; luagetglobal(L, "add"); luapushnumber(L, x); luapushnumber(L, y); luacall(L, 2, 1); sum = (int)luatonumber(L, -1); luapop(L, 1); return sum; }

int main(int argc, char *argv[]) { int sum = 0; L = luaopen(); luaopenbase(L); luaLopenlibs(L); luaLloadfile(L, "add.lua"); luapcall(L, 0, LUAMULTRET, 0); sum = luaAdd(10, 15); printf("The sum is %d\n", sum); lua_close(L);

return 0; } ``` add.lua

function add(x, y) return x + y end

有人说这样写岂不是很多余? 还不如直接在C++那里写一个add函数调用不就完了吗?错了错了,这样的话万一有一天产品经理说这个加法要乘以系数等等的需求,如果写在C++里那就要重新编译启动,非常影响用户体验,写在lua就不同了,直接动态加载so easy 不用重启服务。万一你的lua脚本报错了也不影响原来的程序,容错方面也得到了很大很大的提升!

 

上一篇: 无

微信关注

获取更多技术咨询