AI 写的 TypeScript 编译器:tsrs 差分测试与性能实测
本文使用 AI 辅助整理公开资料,代码、运行结果与结论由作者完成并复核。
首发于 CSDN,转载请注明出处。
TL;DR
- Cloudflare 联合 VoidZero 发布了 tsrs:TypeScript 编译器的 Rust 移植版,官方称类型检查最高快 8 倍、内存少约 70%。
- 更有意思的是实现方式:作者说自己写了「零代码」,由 Claude Opus 5.5 驱动的 Agent 按 TypeScript 官方 15,197 个一致性用例完成移植。
- 我在本机装了
tsrs@0.23.0-ts7.1.0-beta和typescript@7.0.2,做了一致性 + 性能两组对比。 - 12 个用例、5 个类型错误:错误码、文件、行列、消息全部一致,0 条差异。
- 合成项目从 300 文件扩到 2000 文件,tsrs 的耗时优势从 1.34 倍涨到 1.70 倍;8 倍是 3.7 万文件级仓库的数字,小项目里启动开销占主导。
1. 事实:一个由 Agent 完成的编译器移植
按 Cloudflare 官方博客、InfoQ 和 Hacker News 的讨论,关键信息如下:
- tsrs 是 TypeScript 编译器的 Rust 移植,在 Oxc 工具链里孵化
- 不是 fork:语言设计仍由 TypeScript 团队掌控
- 官方数据:同等工作线程下,类型检查最高快 8 倍,内存占用减少约 70%
- 支持编译到 WebAssembly(
@tsrs/wasm),可在浏览器或 Workers 里跑 - 实现方式:Max Schwenk 称自己写了「zero code」,由 Claude Opus 5.5 领导的 Agent 完成移植,以 TypeScript 官方 15,197 个一致性测试作为规范
- 在 Owner 的 37,000 文件单体仓库上,一次检查从 19 GiB 内存、80 秒降到 7 秒
Hacker News 上 TypeScript 团队成员也参与了讨论,提到一个细节:tsrs 快的原因不完全是「Rust 比 JS 快」,其中一部分优化被反向吸收进了 TypeScript 7.1。
这其实是这篇文章最值得拆的地方:AI 写代码不稀奇,稀奇的是怎么证明它写对了。
2. 「零代码」不等于「没人负责」
很多人看到「Agent 写了整个编译器」会得出两个极端结论:要么「程序员要失业了」,要么「AI 写的肯定不可信」。
这两种都忽略了中间那层:规范由谁提供,结果由谁验收。
tsrs 的做法是:
- 规范来自官方测试集:15,197 个一致性用例,不是让模型自由发挥
- 实现由 Agent 完成:人负责拆分任务、审查 diff、处理失败用例
- 语言方向由 TS 团队把控:避免移植版跑偏成另一个方言
换句话说,Agent 承担的是「把规范翻译成 Rust」的体力活,人类保留的是「规范是什么、什么算通过」的定义权。
这也是我做下面这组实验的动机:如果 AI 能写编译器,那我们至少要有一套独立验证它的方法。
3. 实验设计
我装了两个包:
npm install -D tsrs typescript@7.0.2
npx tsc --version # Version 7.0.2
npx tsrs --version # Version 7.1.0-beta (tsrs 0.23.0-ts7.1.0-beta)
测试分两部分:
| 部分 | 目的 | 样本 |
|---|---|---|
| 一致性 | 两个编译器报的错是否一样 | 12 个手写 TS 文件,含 5 个类型错误 |
| 性能 | 项目变大时差距如何变化 | 300 / 800 / 2000 个合成文件 |
一致性对比的核心逻辑不复杂:把两边输出归一化成「文件(行,列) 错误码」,再做集合比较。
const parse = (out) =>
out.split(/\r?\n/)
.map((l) => l.match(/^(.+?)\((\d+),(\d+)\): error (TS\d+)/))
.filter(Boolean)
.map((m) => `${m[1]}(${m[2]},${m[3]}) ${m[4]}`);
const A = new Set(parse(tscOutput));
const B = new Set(parse(tsrsOutput));
const onlyA = [...A].filter((x) => !B.has(x));
const onlyB = [...B].filter((x) => !A.has(x));
计时部分也做了归一化,避免把 shell 启动算进编译器耗时:
function run(name, args) {
const t0 = process.hrtime.bigint();
const r = spawnSync(bin(name), args, { cwd, encoding: 'utf8', shell: true });
return {
out: `${r.stdout || ''}\n${r.stderr || ''}`,
ms: Number(process.hrtime.bigint() - t0) / 1e6,
};
}
每个规模跑 3 遍取中位数,同一台 Windows 机器、同一 Node 版本。性能数字只代表这个环境,不代表官方基准。
运行方式:
node ../../scripts/tsrs-diff.mjs tsconfig.json
12 个用例的结果:
配置:tsconfig.json
tsc :174 ms,诊断 5 条
tsrs :147 ms,诊断 5 条
一致 :5 条|仅 tsc:0|仅 tsrs:0
5 个错误分别是:字符串传给 number 参数、缺少必填属性、可能为 null、元组长度不匹配、索引签名类型不符。错误码分别是 TS2345、TS2741、TS18047、TS2322、TS2322,文件、行列、消息全部一致。
4. 性能:小项目看不出 8 倍
我在同一台 Windows 机器上,每个规模跑 3 次取中位数:
| 项目规模 | tsc 中位耗时 | tsrs 中位耗时 | 倍数 |
|---|---|---|---|
| 12 文件 | 174 ms | 147 ms | 1.18× |
| 300 文件 | 198 ms | 148 ms | 1.34× |
| 800 文件 | 272 ms | 177 ms | 1.54× |
| 2000 文件 | 421 ms | 247 ms | 1.70× |
趋势很清楚:项目越大,tsrs 的优势越明显;但小项目里,Node 启动和进程初始化占了大部分时间,看不出官方说的 8 倍。
这也解释了为什么 Cloudflare 的基准是 37,000 文件、19 GiB 内存的仓库——那是编译器真正吃力的场景。拿一个 12 文件的 demo 去验证「快 8 倍」,方法本身就不对。
5. 三个发现
5.1 一致性比性能更值得先测
性能数字很吸引眼球,但编译器替换的第一道门槛是行为一致。哪怕快 8 倍,只要错误码或边界行为和 tsc 不一致,CI 里的类型检查就会变成另一套规则。
建议的验收顺序:一致性 → 诊断格式 → 增量/监听 → 性能。
5.2 测试集是 AI 移植的真正护城河
tsrs 能用 Agent 完成,前提是 TypeScript 有 15,197 个一致性用例。
如果你的项目没有这样的测试集,让 AI 做大规模重写基本等于赌博——它写完你也不知道对不对。
5.3 启动开销会掩盖小项目的收益
这是 benchmark 方法论的常见坑:用一个小 demo 测编译器、打包器、LSP,测出来的往往是进程启动时间,不是核心算法。
要测出真实差距,样本必须大到让「检查时间」超过「启动时间」。
6. 差分测试怎么做才靠谱
如果你也想验证一个「AI 重写版」,我建议按这五条来:
- 先固定输入:同一份 tsconfig、同一批文件、同一版本依赖
- 只比较结构化字段:错误码 + 文件 + 行列,先别比消息措辞
- 分别统计三类差异:仅 A 有、仅 B 有、两边都有但位置不同
- 样本要覆盖边界:泛型、重载、类型收窄、索引签名、装饰器
- 性能测试要扣除启动开销:至少跑中大项目,或做进程内基准
7. 边界与风险
- 我的样本是手写 + 合成项目,不代表真实仓库的分布;2000 文件里没有复杂类型运算。
- 只对比了诊断输出,没有覆盖增量编译、watch 模式、语言服务和 emit 结果。
- 没有测内存,官方 70% 的降幅我未复现。
- tsrs 仍是 beta 版本,行为可能随版本变化;上线前要锁版本并跑自己的回归集。
- 「Agent 写了零代码」是作者自述,具体人工介入比例无法独立核实。
8. 总结
tsrs 最值得学的不是「AI 能写编译器」,而是这套组合:
- 用官方一致性测试当规范
- 让 Agent 做实现
- 用人做验收和方向判断
- 用差分测试保证行为不变
AI 把「写」的成本降下来之后,「验证」反而成了更稀缺的能力。谁能定义什么算对、能搭出可靠的验收管线,谁才真正掌控这次重写。
参考
- Cloudflare Blog《Introducing tsrs: a Port of TypeScript to Rust》:https://blog.cloudflare.com/typescript-rust-port/
- InfoQ《Cloudflare and VoidZero Introduce tsrs: an AI-Generated Rust Port of TypeScript》:https://www.infoq.com/news/2026/10/cloudflare-tsrs-ai-typescript/
- InfoQ 中文《Cloudflare 与 VoidZero 联合推出 tsrs》:https://www.infoq.cn/article/lGoA1ZSw6ojeh68GVlBl
- Hacker News 讨论:https://news.ycombinator.com/item?id=50165953
- The New Stack《“We are not forking TypeScript”》:https://thenewstack.io/cloudflare-rust-typescript-tsrs/
- npm:tsrs:https://www.npmjs.com/package/tsrs
更多推荐
所有评论(0)