如果你正准备从零写一个 JavaScript 引擎(不管是练手还是正经项目),tc39/test262 这个仓库是你唯一需要对标的“真理”。
1. 别看文档,看 Test262
ECMA-262 规范(那本厚厚的“圣经”)虽然权威,但文字极度抽象。作为引擎开发者,Test262 才是你的“活代码说明书”。
- 官方考卷:它是 TC39 维护的标准符合性测试套件。
- 一致性保证:V8、SpiderMonkey、QuickJS 能表现一致,全靠这套题。
- 特性风向标:一个新提案(比如
Optional Chaining)能不能进 Stage 4,前提之一就是得在 Test262 里把测试用例写全。
2. 仓库里装了什么?
克隆下来后,重点看这两个地方:
test/:核心用例。按语法(language)、内置对象(built-ins)分好了类。harness/:测试脚手架。里面有assert.js之类的辅助脚本。跑测试前,你的引擎得先加载这些环境,否则assert()之类的函数会报错。
3. 引擎开发者的正确姿势
别指望一下子全跑通,建议按这个节奏来:
-
Parser 阶段:先死磕
test/language/。验证你的词法分析和语法树能不能扛住各种奇葩语法。 -
运行时阶段:重点跑
test/built-ins/。Array 的各种方法、Object 的原型链逻辑,都在这里对答案。 -
处理“预期的失败”:
- Negative Tests:Test262 里有很多故意写错的代码,要求引擎报错。你的引擎不仅要报错,还要报出正确的错误类型(比如得报
SyntaxError而不能报TypeError)。 - Skip List:建立一个跳过列表。没实现的特性(比如 Proxy 或 BigInt)先跳过,重点监控已实现部分的 Regression(回归测试)。
- Negative Tests:Test262 里有很多故意写错的代码,要求引擎报错。你的引擎不仅要报错,还要报出正确的错误类型(比如得报
4. 实战建议:抄作业
别硬造轮子,看看别人是怎么集成 Test262 的:
- 轻量级选手:看 QuickJS。它的 Makefile 逻辑非常清晰,适合学习如何快速接入。
- 现代选手:看 Boa (Rust 实现)。它的 GitHub Actions 展示了如何自动化跑完这几万个测试用例并生成可视化报告。
总结
写引擎最怕的是“我觉得我写对了”。Test262 的存在就是为了打破这种幻觉。通过率每提高 1%,你的引擎离工业级就近了一大步。