Tsrs:TypeScript 到 Rust 的移植
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 比 TypeScript 7.0 快最多 8 倍,并且使用的内存减少约 70%:正如您所见,下一版本的 TypeScript 已带来许多性能改进,使 TypeScript 7.1 beta 比 TypeScript 7.0 快最多 2.5 倍。这些优化的一些部分是从 tsrs 上游移植过来的,我们希望能找到更多。您可能已经看到不同 TypeScript 移植版本的基准测试,带有各种性能声明,通常是由于使用与 TypeScript 默认配置不同的更大机器类型和选项。我们与 TypeScript 团队合作,确保上述基准测试比较的是相同的配置。默认情况下,tsrs 附带一个基于机器类型的自适应配置,虽然使用更多内存,但速度更快:尝试 tsrs TypeScript 在 Rust 中旨在成为 TypeScript 的忠实移植。您可以通过从 npm 安装 tsrs 包来尝试实验性版本:npm install tsrs npx tsrs 为什么现在? 多年来,我们看到许多试图将 TypeScript 移植到其他语言的尝试。由于涉及的复杂性,仅有一个移植成功:TypeScript 团队将 TypeScript 从 JavaScript 移植到 Go。然而,前沿的 AI 模型现在可以在几天内几乎独立地进行大规模移植。我们现在已经看到不完美的移植、忠实的移植以及完全重新架构的 Rust 或 C++ 版本的 TypeScript。显然,对于更快的 TypeScript 有着迫切需求。 为什么选择 Rust? 您可能会想:“TypeScript 的 Go 移植已经让 TypeScript 比之前的 TypeScript 版本快了 10 倍,内存效率也更高。难道这还不够吗?”然而,这不仅仅是速度的问题。Rust 提供一些独特的优势:在 WebAssembly 中运行。 Rust + Wasm 的故事始终强大,其中一个原因归结于 Rust 语言设计的基础。当将 Go 程序编译为 Wasm 时,您需要将 Go 的垃圾回收器一起编译。但 Rust 的内存管理模型使得 WebAssembly 客户端和主机之间的内存交互变得简洁。这是使 Rust 更适合 WebAssembly 用例的关键因素之一:内存效率。Cloudflare Workers 已经支持 Wasm 很长时间了。就在几周前,我们宣布通过新的 Emscripten 目标为 wasm-bindgen 在 Workers 中支持原生 Rust。当您在 Workers 中紧密循环运行整个软件构建和部署系统时,小内存占用的好处会迅速体现。这意味着您可以如此高效地运行这些工作负载,以至于现在可以在以前无法运行它们的地方运行完全封装的开发系统。这使得结合代理时出现了新的可能性:您现在能够在 Cloudflare 上的完全沙盒环境中端到端地运行开发工具链。但有了 Wasm,您也可以在浏览器中的客户端安全地运行这些环境,或者在嵌入式设备或物联网应用程序上运行。 tsrs 移植将如何维护? 首先,我们正在与 Theo Browne 合作将 tsc-rs 和 tsrs 合并为一个支持所有 TypeScript 功能的包,包括语言服务器协议(LSP)和内容映射器。其次,我们看到我们如何保持 Vinext 与其上游 Next.js 同步取得了很大的成功。我们在最近的一篇博客文章中解释了我们是如何做到这一点的:每个早晨,一个代理会审核更改,获取差异,并为可能影响 Vinext 的任何内容打开跟踪问题。每晚,兼容性矩阵会在我们对 Vinext 运行 Next.js 测试套件时重新生成。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡