最近刚刚完成了服务器端 rpc 协议的 python 封装,理论上说,后续的开发可以以 python 继续进行了。只是代码热更新还没好,项目进度又吃紧,暂时先放下了。利用 rpc 协议连接不同进程,各个进程就可以自由选择语言去开发,不局限于 C、LPC 了。让项目能够充分利用各个语言的优势,在不同的场景下选择特长语言进行开发,这图景不错。

而客户端所用的 Lua 脚本,则是以另一种方式实现了多语言协作开发。通过精巧的 Lua API,C 层可以将一些灵活多变的逻辑操作转交给上层的 Lua 逻辑去完成,而 Lua 里的计算密集型的东西也可以放到 C 层去完成。

我一直很好奇的是,C 到底要怎么告诉 Lua,我调用的是 XXX,我给你传递一下参数 A,类型是 YYY,值是 ZZZ。这跟我刚实现的 RPC 协议是十分类似的,但是 Lua 面向的是嵌入式设备,计算能力受限,估计不会采用 socket 进行中转。尤其是,当需要传递的不单是基础类型如 int、string,还有映射表,列表等较为复杂的数据对象时,怎么实现这种转换呢?

Lua 采取的是利用栈进行交互,利用各种 Lua_pushXXX 将不同的值压入栈中,然后调用 Lua 脚本时自然会退栈取出参数运行,对于 Lua 的虚拟机来说,就像是发生了一次正常的函数调用。(这里采用的栈是 Lua 栈,因为若是 C 栈的话调用 Lua 的 C API 就会出错了。)需要注意的是,Lua 栈状态需要自己进行维护,若发生多线程同时对 Lua 栈操作,没有加锁保护的话会导致栈状态混乱然后出很诡异的 bug。

关于 Lua 调用 C 的函数,还没做完实验,稍后再补充。