Nova:用 Rust 与数据导向设计重写一个 JS 引擎,Test262 已过约 80%
阅读时间: 大约 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 仪表盘数据做分析。

一、为什么又写一个 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(可用于小规模部署)”。

“可小规模部署”与”生产级”之间是很大的距离。下面用官方仪表盘的硬数字来校准这个状态。
三、Test262 实测:官方仪表盘数字
Test262 是 ECMAScript 规范的官方一致性测试集。Nova 官方站点持续跟踪每次提交的结果。以官方仪表盘记录的最新提交(commit bece61acd,标注时间 2026-05-10)为例:
| 结果类别 | 数量 | 占比 |
|---|---|---|
| Pass(通过) | 40,515 | 79.9% |
| Skip(跳过) | 3,326 | 6.6% |
| Timeout(超时) | 18 | 0.0% |
| Unresolved(未决) | 37 | 0.1% |
| Fail(失败) | 6,785 | 13.4% |
| Crash(崩溃) | 52 | 0.1% |
怎么读这组数:约 80% 通过是真实的进步,但还有 13.4% 的用例明确失败、外加 52 个崩溃用例。这意味着它距离”完整兼容 ECMAScript”仍有相当差距——一台 80% 兼容的引擎,跑真实的大型 JS 代码库时,撞到未实现特性或边界 bug 的概率并不低。官方用”小规模部署”而非”生产就绪”来描述,是诚实的。
四、数据导向架构:赌的是什么
Nova 的核心卖点不是某个跑分,而是架构取向:
- 内存局部性优先:按数据布局而非对象封装来组织引擎内部结构,目标是让热数据落在同一块缓存行里;
- Rust 的内存安全:在不借用 Go/C++ 的垃圾权衡下,用所有权系统管理引擎内部对象生命周期;
- 可演进的实现:因为不背 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 的同场性能数字。这是它最值得继续观察的地方:理念很完整,量化收益还在路上。
六、客观分析:优势与局限
优势:
- 现代语言 + 现代设计:Rust + 数据导向,代表了引擎实现的一条新路线,工程上有学习与参考价值;
- 兼容性在稳步爬升:Test262 通过约 80%、失败曲线持续收敛,说明项目处于活跃、方向正确的推进中;
- crates.io 原生分发:作为 Rust crate 嵌入,对想用 Rust 生态做”内置 JS 脚本能力”的应用是低摩擦选择。
局限:
- 距离生产尚远:13.4% 失败 + 52 崩溃用例,跑真实大型 JS 代码风险高,官方自己只敢说”小规模部署”;
- WebAssembly 尚未落地:目前主要是 ECMAScript,WASM 仍在路线图上;
- 缺乏公开的性能对标:官方强调兼容性曲线,但没有给出与 V8/JSC 在真实负载上的同场基准,“数据导向带来性能红利”仍待量化;
- 无 LTS 承诺:SemVer 但不保证长期稳定 API,嵌入式/长期项目集成需自行承担升级成本。
七、谁该关注它
- 做 Rust 工具链、想内嵌脚本能力的人:Nova 作为 crate 提供了一条不依赖 V8 绑定的轻量路径;
- 对”下一代语言实现范式”感兴趣的工程师:数据导向 + Rust 写引擎,本身就是值得跟踪的架构实验;
- 需要生产级浏览器/Node 运行时的人:现在还不是——80% 的 Test262 通过率不足以支撑严肃生产负载,继续观望更稳妥。