Cloudflare 与 VoidZero 推出 tsrs 实验版,将 TypeScript 编译器移植至 Rust
Tsrs: A Port of TypeScript to Rust
Cloudflare、VoidZero 与 Owner.com 的 Max Schwenk 正合作开发 tsrs,这是一款将 TypeScript 编译器移植至 Rust 的实验工具,现可通过 npm 安装试用。
文章提供同配置基准、Rust 与 Wasm 的取舍及兼容上游的维护流程,帮助评估 tsrs 的工程可行性与集成空间。
Cloudflare 和 VoidZero 目前正与 Owner.com 的 Max Schwenk 合作推进 tsrs,这是 TypeScript 编译器的 Rust 移植版。我们正与 TypeScript 团队密切合作推进这项工作,并将 tsrs 作为 Oxc JavaScript 编译器工具链 的一部分进行孵化。
我们的目标是让开发者少花时间等待代码检查,把更多时间用于创造。让 TypeScript 更快、内存效率更高,也有助于将完整的开发环境带到更多地方,包括直接置于浏览器中。
明确说明,我们不会 对 TypeScript 进行分叉。我们认为,TypeScript 团队应继续完全掌控这门语言的设计和方向。他们始终秉持长期愿景,同时推动 TypeScript 在 JavaScript 社区中的采用。我们不想改变这一点。
在许多事情上,TypeScript 团队推进得相当快;但对于某些功能,他们可能有意花数年探索各种方案并制作原型,然后才选择合适的实现。Rust 移植版必须紧跟这些决定,否则最终会分崩离统并变得不兼容。我们必须严格依据原始实现来保留 TypeScript 语言,而 TypeScript 团队仍应独自负责决定它的具体形态。
性能和内存方面的改进
我们对 TypeScript 的 Rust 移植版所做的初步基准测试结果令人鼓舞:在使用相同数量的类型检查工作线程时,tsrs 最高快 8x ,内存用量比 TypeScript 7.0 少 ~70% :

可以看到,TypeScript 的下一版本已经带来了许多性能改进,使 TypeScript 7.1 beta 最高比 TypeScript 7.0 快 2.5x。其中一些优化已从 tsrs 上游合并,我们希望有更多这样的优化。
你可能已经看到近期针对不同 TypeScript 移植版本的基准测试,它们宣称 Various 性能提升;与 TypeScript 的默认设置相比,这些测试往往使用了更大的机器类型和不同的选项。我们与 TypeScript 团队合作,确保上述基准测试 比较的是相同的配置。
默认情况下,tsrs 随附一种会根据机器类型调整的自适应配置,它使用更多内存,但速度也更快:

试试 tsrs
Rust 版 TypeScript 旨在成为 TypeScript 的忠实移植版本。你可以通过从 npm 安装 tsrs 软件包来试用实验性版本:
npm install tsrs
npx tsrs为什么是现在?
这些年来,我们见过许多将 TypeScript 移植到其他语言的尝试。由于涉及的复杂性,这些移植项目中只有一个成功了:TypeScript 团队将 TypeScript 从 JavaScript 移植到 Go 的版本。
如今,前沿 AI 模型几乎可以在短短几天内独立完成大规模移植。我们已经见过用 Rust 或 C++ 实现的粗制滥造型分叉、忠实移植版,以及彻底重新架构的 TypeScript 版本。显然存在对更快的 TypeScript 的需求。
为什么选择 Rust?
你可能会想:“TypeScript 的 Go 移植版已经让 TypeScript 比此前用 TypeScript 编写的版本快 10x,内存效率也高得多。为什么这还不够?”
不过,这不只是速度问题。Rust 还具备一些独特优势:通过 WebAssembly 运行。Rust + Wasm 的结合一直是强项,而原因之一要追溯到 Rust 语言设计的基本原理。将 Go 程序编译为 Wasm 时,你还必须一并编译 Go 的垃圾回收器 。但 Rust 的内存管理模型支持 WebAssembly 客体与宿主之间直接进行内存交互。这是 Rust 更适合 WebAssembly 使用场景的关键原因之一:内存效率。
Cloudflare Workers 长期以来一直支持 Wasm。几周前,我们宣布在 Workers 中原生支持 Rust,并为 wasm-bindgen 增加了新的 Emscripten 目标。当你在 Workers 上快速反复运行完整的软件构建和部署系统时,小内存占用的优势很快就会显现。这意味着你可以高效运行这些工作负载,如今甚至可以在以前无法运行的地方运行完全封装的开发系统。
与智能体结合后,这催生了新的可能:现在,你可以在 Cloudflare 上完全沙箱化的环境中端到端运行一套开发工具链。但借助 Wasm,你还可以在浏览器客户端安全地运行这些环境,或者在嵌入式设备或物联网应用上运行。
tsrs 移植版将如何维护?
首先,我们正与 Theo Browne 合作,将 tsc-rs 和 tsrs 合并为一个软件包,支持 TypeScript 的所有功能,包括语言服务器协议 (LSP) 和内容映射器。其次,我们采用的方法已成功让 Vinext 与其上游项目 Next.js 保持同步。我们在最近的一篇博客文章中介绍了具体做法:
每天早晨,一个智能体会审查变更、获取差异,并为所有可能影响 Vinext 的事项创建跟踪问题。每天晚上,我们运行 Next.js 测试套件对 Vinext 进行测试,同时重新生成兼容性矩阵。当某项测试或问题暴露出差距时,智能体现在能够找出两个代码库中的相关变更、构建复现用例、移植相关测试并提出修复方案。
我们会将同样的流程应用于 TypeScript,并极力避免引入与 TypeScript 上游版本不一致的行为。当发现性能改进时,我们会尝试将其回馈给 TypeScript 的 Go 代码库,让所有人都能受益。
最后,我们认识到,目前它与 TypeScript 上游版本之间仍有一些差异,例如诊断信息的输出顺序。我们的目标是在发布稳定版本之前,将这些差异降至最低。
接下来呢?
Cloudflare 已经是众多免费开源 Rust 工具的所在地,这些工具为 JavaScript 生态系统提供支持,例如 Vite、Rolldown、Oxlint 和 Oxfmt。超过 10 million 名开发者在 Cloudflare 上进行构建,因此我们非常重视让底层开发工具链更快、更具可移植性,并更容易在更多地方运行。我们很高兴探索与现有技术栈更深入的 tsrs 集成,例如为 Oxlint 提供类型感知的 lint 规则。
与 Vinext 一样,我们的目标是将 tsrs 打造为一个维护良好、健康发展的开源项目,同时不妨碍 TypeScript 自身的发展。Oxc 团队已经开始重构代码库,以提升速度、减少内存占用并增强可维护性。我们知道 TypeScript 团队正在认真对待这件事——他们正在试验 tsc 的内存和性能改进。我们很高兴与 TypeScript 团队和 JavaScript 社区合作,共同打造最佳、最快的 TypeScript 实现。
来源:Hacker News · blog.cloudflare.com