Nova:用 Rust 与数据导向设计重写一个 JS 引擎,Test262 已过约 80%

JavaScript
Rust
WebAssembly
开源
引擎
2026/10/15
·

阅读时间: 大约 9 分钟

Nova:用 Rust 与数据导向设计重写一个 JS 引擎,Test262 已过约 80%

JavaScript 引擎这个领域长期被 V8、JavaScriptCore、SpiderMonkey 等 C++ 巨兽占据。Nova 想做的是一次”换范式”的尝试:用 Rust 从头写一个 ECMAScript(未来还包括 WebAssembly)引擎,并明确遵循数据导向设计(data-oriented design),赌更好的内存局部性与缓存效率能换来更干净的实现。2026 年 3 月 15 日 Nova 发布 1.0,官方站点称它目前通过约 80% 的 Test262 测试集,“可用于小规模部署”。本文依据 trynova.dev 官方页面与官方 Test262 仪表盘数据做分析。

Nova 官方 Test262 仪表盘截图:堆叠面积图随提交演进,绿色(Pass)持续上升,红色(Fail)持续收敛;最新一行 Pass 40515(79.9%)

一、为什么又写一个 JS 引擎

Nova 的立论不是”现有引擎不够快”,而是”现有引擎的对象模型本身是为过去的假设设计的”。官方博客系列(《Garbage collection is contrarian》《OOPs, I’m so dead!》《Interlude: A data-oriented model》)在反复论证一件事:传统面向对象、对象带隐藏类/形状的引擎,在现代缓存层次上未必是最优解;把数据扁平化、按列组织、提升局部性,可能既简化实现又改善性能。Nova 就是这套理念的工程落地。

二、它现在是什么状态

官方站点给出的定位很克制:

  • 语言:JavaScript(ECMAScript);WebAssembly 是”未来”方向;
  • 实现语言:Rust,遵循数据导向设计;
  • 分发:发布在 crates.io,采用 SemVer,不提供 LTS 承诺;
  • 成熟度:当前通过约 80% 的 Test262,被官方描述为”ready for small-scale deployment(可用于小规模部署)”。

Nova 官方站点首页:自述为 Rust 编写、遵循数据导向设计的 ECMAScript(未来含 WebAssembly)引擎,发布于 crates.io,当前通过约 80% Test262;下方列出 Nova 1.0(2026-03-15)等官方博客

“可小规模部署”与”生产级”之间是很大的距离。下面用官方仪表盘的硬数字来校准这个状态。

三、Test262 实测:官方仪表盘数字

Test262 是 ECMAScript 规范的官方一致性测试集。Nova 官方站点持续跟踪每次提交的结果。以官方仪表盘记录的最新提交(commit bece61acd,标注时间 2026-05-10)为例:

结果类别数量占比
Pass(通过)40,51579.9%
Skip(跳过)3,3266.6%
Timeout(超时)180.0%
Unresolved(未决)370.1%
Fail(失败)6,78513.4%
Crash(崩溃)520.1%

怎么读这组数:约 80% 通过是真实的进步,但还有 13.4% 的用例明确失败、外加 52 个崩溃用例。这意味着它距离”完整兼容 ECMAScript”仍有相当差距——一台 80% 兼容的引擎,跑真实的大型 JS 代码库时,撞到未实现特性或边界 bug 的概率并不低。官方用”小规模部署”而非”生产就绪”来描述,是诚实的。

四、数据导向架构:赌的是什么

Nova 的核心卖点不是某个跑分,而是架构取向:

  1. 内存局部性优先:按数据布局而非对象封装来组织引擎内部结构,目标是让热数据落在同一块缓存行里;
  2. Rust 的内存安全:在不借用 Go/C++ 的垃圾权衡下,用所有权系统管理引擎内部对象生命周期;
  3. 可演进的实现:因为不背 V8 三十年的历史包袱,团队可以按现代硬件特性重新做设计取舍。

需要泼一点冷水:数据导向是一种有理论依据但尚未在 JS 引擎这个量级被完整验证的取向。它在游戏引擎、列存数据库里被证明有效,但在”动态、高度对象化、装箱严重”的 JavaScript 负载上能否兑现缓存红利,Nova 自己也还在验证——官方目前公开的主要是 Test262 兼容性曲线,而非与 V8/JSC 同场的性能基准。

五、官方博客在争什么:一次”反共识”的引擎观

理解 Nova 不能只看 Test262 曲线,还要看它官方博客的论证脉络。《Garbage collection is contrarian(垃圾回收是反共识的)》《OOPs, I’m so dead!》《Interlude: A data-oriented model》这几篇文章,其实是在向主流引擎的两个默认假设开炮:一是”对象应该带隐藏类/形状、按面向对象方式组织”,二是”GC 就该是分代、对象图遍历那一套”。Nova 的回答是把数据扁平化、按列布局,用 Rust 的所有权承担一部分生命周期职责,从而把引擎内部做得更小、缓存局部性更好。

这套主张在列存数据库和游戏引擎里已经被验证有效,但搬到 JavaScript 这种”高度动态、到处装箱、对象形状频繁变化”的负载上是否真能跑赢传统引擎,Nova 目前给出的证据主要是兼容性爬升曲线,而非与 V8/JSC 的同场性能数字。这是它最值得继续观察的地方:理念很完整,量化收益还在路上。

六、客观分析:优势与局限

优势:

  1. 现代语言 + 现代设计:Rust + 数据导向,代表了引擎实现的一条新路线,工程上有学习与参考价值;
  2. 兼容性在稳步爬升:Test262 通过约 80%、失败曲线持续收敛,说明项目处于活跃、方向正确的推进中;
  3. crates.io 原生分发:作为 Rust crate 嵌入,对想用 Rust 生态做”内置 JS 脚本能力”的应用是低摩擦选择。

局限:

  1. 距离生产尚远:13.4% 失败 + 52 崩溃用例,跑真实大型 JS 代码风险高,官方自己只敢说”小规模部署”;
  2. WebAssembly 尚未落地:目前主要是 ECMAScript,WASM 仍在路线图上;
  3. 缺乏公开的性能对标:官方强调兼容性曲线,但没有给出与 V8/JSC 在真实负载上的同场基准,“数据导向带来性能红利”仍待量化;
  4. 无 LTS 承诺:SemVer 但不保证长期稳定 API,嵌入式/长期项目集成需自行承担升级成本。

七、谁该关注它

  • 做 Rust 工具链、想内嵌脚本能力的人:Nova 作为 crate 提供了一条不依赖 V8 绑定的轻量路径;
  • 对”下一代语言实现范式”感兴趣的工程师:数据导向 + Rust 写引擎,本身就是值得跟踪的架构实验;
  • 需要生产级浏览器/Node 运行时的人:现在还不是——80% 的 Test262 通过率不足以支撑严肃生产负载,继续观望更稳妥。

参考来源