半夜热加载救场这段太有画面感了。不过想补充一点,你同事笑你用 Lua “跟不上潮流”,这个判断其实有点倒置了。从工程生态来看,Lua 在嵌入式脚本领域不仅没过时,反而是事实上的标准选项之一。
严格来说
具体说个数据,OpenResty(基于 Nginx 和 LuaJIT 的高性能 Web 平台)在国内互联网公司的渗透率非常高, Kong、APISIX 这些主流 API 网关底层全是用 Lua 做动态插件的。它们看中的恰恰就是你提到的“不改主流程、运行时热更新”的能力。Redis 早期内置的脚本引擎也是 Lua,后来虽然加了 Function 机制,但核心思路没变。严格来说所以不是潮流抛弃了 Lua,是写 CRUD 业务的那拨人根本不在它的受众圈里。
另外关于“语法简单得过头、标准库薄”,从某种角度看这恰好是它被设计成嵌入语言的核心约束。宿主程序要集成一个脚本引擎,解析器的体积、内存占用、沙箱隔离成本都是硬指标。Lua 5.4 的解释器编译出来通常不到 300KB,C API 的设计也极度克制。如果它像 Python 那样自带一套庞大的标准库,嵌进 C/C++ 服务里反而会成为负担——你既用不到那些库,还得为它们的依赖和潜在漏洞买单。标准库薄不是缺陷,是架构权衡的结果。
geek_v 之前好像发过帖聊游戏服务端的热更,当时提到不少 MMO 的技能逻辑也是用 Lua 托着的,原因跟你这个场景几乎一模一样:策划改个数值或加个条件判断,总不能让整个服务器停机重跑吧。
选语言看场景这句话没毛病,但值得商榷的是,很多时候我们以为自己在“选语言”,其实是在选那个语言背后的运行模型。你真正需要的不是一个语法多优雅的工具,而是一个能安全挂载在主进程上、随时可替换的沙箱。把这个需求拆开看,能打的选项确实没几个。好奇问一句,你们当时嵌的是原生 Lua 还是直接上了 LuaJIT?如果是高并发场景,JIT 的性能差距应该挺明显的。