本文使用 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 的做法是:

  1. 规范来自官方测试集:15,197 个一致性用例,不是让模型自由发挥
  2. 实现由 Agent 完成:人负责拆分任务、审查 diff、处理失败用例
  3. 语言方向由 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 ms147 ms1.18×
300 文件198 ms148 ms1.34×
800 文件272 ms177 ms1.54×
2000 文件421 ms247 ms1.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 重写版」,我建议按这五条来:

  1. 先固定输入:同一份 tsconfig、同一批文件、同一版本依赖
  2. 只比较结构化字段:错误码 + 文件 + 行列,先别比消息措辞
  3. 分别统计三类差异:仅 A 有、仅 B 有、两边都有但位置不同
  4. 样本要覆盖边界:泛型、重载、类型收窄、索引签名、装饰器
  5. 性能测试要扣除启动开销:至少跑中大项目,或做进程内基准

7. 边界与风险

  • 我的样本是手写 + 合成项目,不代表真实仓库的分布;2000 文件里没有复杂类型运算。
  • 只对比了诊断输出,没有覆盖增量编译、watch 模式、语言服务和 emit 结果。
  • 没有测内存,官方 70% 的降幅我未复现。
  • tsrs 仍是 beta 版本,行为可能随版本变化;上线前要锁版本并跑自己的回归集。
  • 「Agent 写了零代码」是作者自述,具体人工介入比例无法独立核实。

8. 总结

tsrs 最值得学的不是「AI 能写编译器」,而是这套组合:

  • 用官方一致性测试当规范
  • 让 Agent 做实现
  • 用人做验收和方向判断
  • 用差分测试保证行为不变

AI 把「写」的成本降下来之后,「验证」反而成了更稀缺的能力。谁能定义什么算对、能搭出可靠的验收管线,谁才真正掌控这次重写。

参考

  1. Cloudflare Blog《Introducing tsrs: a Port of TypeScript to Rust》:https://blog.cloudflare.com/typescript-rust-port/
  2. InfoQ《Cloudflare and VoidZero Introduce tsrs: an AI-Generated Rust Port of TypeScript》:https://www.infoq.com/news/2026/10/cloudflare-tsrs-ai-typescript/
  3. InfoQ 中文《Cloudflare 与 VoidZero 联合推出 tsrs》:https://www.infoq.cn/article/lGoA1ZSw6ojeh68GVlBl
  4. Hacker News 讨论:https://news.ycombinator.com/item?id=50165953
  5. The New Stack《“We are not forking TypeScript”》:https://thenewstack.io/cloudflare-rust-typescript-tsrs/
  6. npm:tsrs:https://www.npmjs.com/package/tsrs
Logo

更多推荐