Cloudflare 和 VoidZero 与 Owner.com 的 Max Schwenk 合作,推出了 tsrs,这是 TypeScript 编译器的 Rust 移植版本。该项目作为 Oxc JavaScript 编译器工具链的一部分正在孵化中。tsrs 的主要目标是在提高内存效率的同时,减少开发人员在类型检查方面的等待时间。这种效率对于在受限环境(如 Web 浏览器或嵌入式设备)中运行完整的开发环境尤为关键。

一个代表将 TypeScript 编译器移植到 Rust 的风格化图形。
Cloudflare 和 VoidZero 正在开发 tsrs,旨在将 Rust 的内存效率引入 TypeScript 编译器。blog.cloudflare.com

该图像是 tsrs(基于 Rust 的 TypeScript 编译器移植版本)发布公告的主要视觉素材。

早期基准测试表明,在运行等数量的类型检查工作线程时,tsrs 比 TypeScript 7.0 快多达 8 倍,且内存占用减少了约 70%。虽然 TypeScript 团队在最近的版本中已经取得了显著的性能提升(TypeScript 7.1 测试版比 7.0 快 2.5 倍),但 tsrs 旨在进一步突破这些界限。选择 Rust 而非 Go 等其他语言的关键技术驱动因素是其内存管理模型。与导出到 WebAssembly (Wasm) 时需要编译垃圾回收器的 Go 不同,Rust 的模型允许 Wasm 客户机与宿主机之间进行更直接的内存交互。这使得 Rust 更适合 Cloudflare Workers,因为在紧凑循环中运行软件构建和部署系统,显著降低内存占用将带来巨大收益。

为了保持与官方 TypeScript 语言的兼容性,该项目强调“忠实移植”而非“分支开发”。团队打算在利用 Rust 能力的同时,保留原始实现的逻辑。为了让移植版本与上游更改保持同步,团队计划使用类似于 Vinext 所使用的自动化代理工作流。此过程涉及代理审查每日更改、获取差异并识别兼容性矩阵中的差距。当发现差异时,代理会识别跨代码库的更改,构建重现案例并提出修复方案。虽然目前仍存在一些细微差异(例如打印诊断信息的顺序),但目标是在项目走向稳定版本时最大限度地减少这些差异。团队还打算将发现的性能优化贡献回官方 TypeScript Go 代码库,以造福更广泛的社区。

在将 TypeScript 从垃圾回收语言移植到 Rust 时,一个显著的技术挑战涉及长生命周期对象的管理。由于 Rust 缺乏原生垃圾回收器,该移植版本采用了独特的内存模型,利用从未释放的 Arena 来处理长生命周期对象,从而在保持 Rust 安全保证的同时模拟必要的行为。这种方法允许编译器在没有全量运行时开销的情况下实现高性能,从而能够在 Cloudflare Workers 或浏览器客户端等沙箱环境中执行完全封装的开发工具链。