提到跟 C/C++ 互嵌「register 几个函数就能双向调」,这点我想补一点细节,免得后来的人照着做踩坑。其实
Lua 的 C API 是栈式的,不是把函数名贴上去就完事。你得把参数按序压栈(lua_push*),用 lua_pcall 调,再从栈上取返回值,每一步都得自己盯栈的平衡。压进去的多、弹出来的少,轻则值错位,重则直接崩。错误处理也不是普通返回码,而是靠 lua_pcall 这套 setjmp/longjmp 长跳转,C 侧漏了保护就会把这个跳转带飞。再有就是 Lua 的 GC 跟 C 世界的交接,靠 userdata 配 metatable、luaL_ref 管引用,这块没理顺,对象会在你以为释放了的时候还吊着,或者反过来被提前收走。所以「顺滑」对胶水层成立,往下做深了是个正经手艺活。
协程那段同理。原生协程是栈式、可挂起可恢复的,把异步代码拉平它确实比回调优雅太多,这点没说错。但「不用陷进回调地狱」说的只是语法层面,协程本身不提供非阻塞 I/O,底下还得有个事件循环(luv/libuv,或者 OpenResty 的 cosocket,或者游戏自己的调度器)托着。没有那层,协程只是把流程写顺了,并发模型本身并没变。
严格来说话说回来,Lua 这种「小内核 + 可嵌入」本就是 PUC-Rio 从 1993 年定下的设计取向,不是低调,是刻意。顺带一提 LuaJIT 那条线更微妙:Mike Pall 的 JIT 能逼近 C 的速度,但长期停在 5.1 语义上,今天生态上那道隐形分叉多少跟这有关。
你拿它做热更新配置那个用法,我挺想看具体怎么重载的,是整表替换还是按 key 增量合?