写了个纯 Rust 实现的 Luau 语言与 JIT 虚拟机 ulua
内容提要
ulua 是纯 Rust 实现的 Luau 运行时,无 C/C++ 依赖,包含词法解析、字节码编译、寄存器虚拟机、GC 和 JIT 完整管线。其解释执行性能与官方 C++ Luau 相当,比 Lua 5.4 快约 17%,开启 JIT 后耗时降低约 48%。项目已开源,可编译为 WebAssembly 在浏览器运行,目前正重构清理 unsafe 代码。
延伸解读
纯 Rust 实现的优势与适用场景
ulua 完全用 Rust 编写,不依赖 C/C++ 工具链,这简化了交叉编译和静态链接流程。对于需要嵌入脚本引擎的 Rust 项目,尤其是目标平台为嵌入式系统或 WebAssembly 时,ulua 能避免 FFI 绑定的复杂配置,实现更顺畅的集成。
性能表现与基准解读
在 Apple M2 Max 上的测试显示,ulua 解释执行性能与官方 C++ Luau 相当,比 Lua 5.4 快约 17%;开启 JIT 后,计算密集型任务耗时降低约 48%,与 C++ Luau JIT 水平接近。但需注意,当前性能主要得益于 Luau 虚拟机架构,尚未进行底层微架构调优。
项目现状与开发重心
ulua 处于活跃重构阶段,重点是将 C++ 转译遗留的 unsafe 代码改写为惯用 Rust 模式,并移除警告忽略属性。目前代码尚未做细致的性能调优,计划在架构稳定后再进行系统级优化。因此,生产环境使用需关注其稳定性进展。
快速上手与生态集成
ulua 已发布至 crates.io,提供简洁 API 用于求值、编译字节码、注册 Rust 函数及动态控制 JIT。项目还提供了 WebAssembly 在线演练场,方便体验。对于寻求纯 Rust 脚本引擎的开发者,ulua 是一个值得关注的新选择。
Q&A
ulua 是什么?它和官方 Luau 有什么关系?
ulua 是一个用纯 Rust 实现的 Luau 语言运行时,不依赖任何 C/C++ 编译链。Luau 是 Roblox 基于 Lua 5.1 深度改造的脚本语言,具备渐进静态类型系统、寄存器虚拟机和编译优化管线。ulua 完整实现了从词法解析、字节码编译、寄存器虚拟机、垃圾回收到 JIT 的整个管线。
ulua 的性能怎么样?和官方 Luau、Lua 5.4 相比如何?
在 Apple M2 Max 上的 16 组计算密集型基准测试中,ulua 解释执行的几何平均耗时与官方 C++ Luau 基本一致(1.0 vs 1.02),比 Lua 5.4 快约 17%。开启 JIT 后,耗时降低约 48%(相对解释模式由 1.0 降至 0.52),与官方 C++ Luau JIT(0.57)相当。
ulua 目前处于什么开发阶段?主要工作是什么?
ulua 目前处于活跃的重构与持续开发阶段。主要工作是消除从 C/C++ 转译遗留的原始指针操作、精简 unsafe 代码块、移除警告忽略属性,并将 C 风格数据流改写为惯用的 Rust 模式,以构建安全可维护的代码库。性能调优和 GC 优化将在代码清洗和架构稳定后集中进行。
ulua 支持在浏览器中运行吗?如何体验?
支持。由于不依赖 C++ 编译链,ulua 可以直接编译到 wasm32 目标。项目部署了一个纯静态的在线演练场:https://webc-site.github.io/ulua,在浏览器端运行 WebAssembly 虚拟机,支持 Luau 代码的即时语法高亮、双向静态类型推导诊断以及虚拟机执行。
如何在 Rust 项目中使用 ulua?
在 Cargo.toml 中添加依赖 ulua = "0.1"。基础用法:使用 eval 直接求值,compile 编译为字节码,eval_bytecode 执行预编译字节码。宿主交互:通过 Lua::new() 创建实例,load().exec() 执行代码,create_function 注册 Rust 函数,globals().set 设置全局变量。JIT 可通过 enable_jit(true) 动态开启(需启用 jit feature)。
ulua 相比使用 C++ 绑定的方案有什么优势?
使用 C++ 绑定(如 mlua 的 luau feature)需要依赖 C/C++ 交叉编译工具链,在静态编译、移植到嵌入式平台或编译为 WebAssembly 时配置繁琐。ulua 是纯 Rust 实现,无需任何 C/C++ 编译依赖,简化了这些场景的构建流程。