开发 JS 引擎绕不开的坑:Test262 深度指南

6 阅读2分钟

如果你正准备从零写一个 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(回归测试)。

4. 实战建议:抄作业

别硬造轮子,看看别人是怎么集成 Test262 的:

  • 轻量级选手:看 QuickJS。它的 Makefile 逻辑非常清晰,适合学习如何快速接入。
  • 现代选手:看 Boa (Rust 实现)。它的 GitHub Actions 展示了如何自动化跑完这几万个测试用例并生成可视化报告。

总结

写引擎最怕的是“我觉得我写对了”。Test262 的存在就是为了打破这种幻觉。通过率每提高 1%,你的引擎离工业级就近了一大步。