微软用 Go 重写 TypeScript 编译器:快 10 倍的 TypeScript

今天,我很高兴地宣布我们将采取下一步措施,从根本上提高 TypeScript 的性能。

TypeScript 的核心价值主张是卓越的开发人员体验。随着代码库的增长,TypeScript 本身的价值也在增长,但在许多情况下,TypeScript 无法扩展到最大的代码库。在大型项目中工作的开发人员可能会经历较长的加载和检查时间,他们不得不在合理的编辑器启动时间和获得完整的源代码视图之间做出选择。我们知道,开发人员最喜欢的就是能放心地重命名变量、找到对某个特定函数的所有引用、轻松浏览代码库,而且所有这些操作都不会出现延迟。由人工智能驱动的新体验可以从大量语义信息窗口中获益,而这些信息需要在更严格的延迟限制条件下提供。我们还希望通过快速的命令行构建来验证整个代码库是否处于良好状态。

为了实现这些目标,我们已经开始开发 TypeScript 编译器和工具的原生移植。本机实现将大大改善编辑器的启动,将大部分构建时间缩短 10 倍,并大幅减少内存使用量。通过移植当前的代码库,我们预计到 2025 年年中就能预览能进行命令行类型检查的 tsc 本机实现,到年底就能为项目构建提供功能完备的解决方案和语言服务。

您可以从我们的新工作仓库构建并运行 Go 代码,该仓库与现有的 TypeScript 代码库使用相同的许可证。请查看 README,了解如何构建和运行 tsc 和语言服务器,并查看目前已实现功能的摘要。我们将在新功能可供测试时定期发布更新。

速度有多快?

我们的本地实现已经能够加载许多流行的 TypeScript 项目,包括 TypeScript 编译器本身。以下是在 GitHub 上不同大小的一些流行代码库上运行 tsc 的时间:

Codebase Size (LOC) Current Native Speedup
VS Code 1,505,000 77.8s 7.5s 10.4x
Playwright 356,000 11.1s 1.1s 10.1x
TypeORM 270,000 17.5s 1.3s 13.5x
date-fns 104,000 6.5s 0.7s 9.5x
tRPC (server + client) 18,000 5.5s 0.6s 9.1x
rxjs (observable) 2,100 1.1s 0.1s 11.0x

虽然我们的功能还不完善,但这些数字已经代表了您在检查大多数代码库时所看到的性能提升的数量级。

我们对速度的大幅提升所带来的机遇感到无比兴奋。那些曾经看似遥不可及的功能,现在已经唾手可得。本机移植将能够在整个项目中提供即时、全面的错误列表,支持更高级的重构,并实现更深入的洞察,而这在以前是无法实现的。这一新的基础超越了当今的开发人员体验,将使下一代人工智能工具能够增强开发能力,为新工具提供动力,使其能够学习、适应和改善编码体验。

编辑器速度

开发人员的大部分时间都花在编辑器上,这也是性能最重要的地方。我们希望编辑器能快速加载大型项目,并在任何情况下都能快速响应。只要底层语言服务也能快速运行,Visual Studio 和 Visual Studio Code 等现代编辑器就能发挥出色的性能。有了我们的本地实现,我们就能提供令人难以置信的快速编辑体验。

同样以 Visual Studio Code 代码库为基准,目前在快速计算机上编辑器加载整个项目的时间约为 9.6 秒。而使用本机语言服务后,加载时间缩短到 1.2 秒左右,在编辑器场景下,项目加载时间缩短了 8 倍。这意味着在任何 TypeScript 代码库中,从打开编辑器到第一次按键,您都能获得更快的工作体验。我们希望所有项目的加载时间都能得到这种程度的改善。

总体内存使用量似乎也只有当前实现的一半左右,不过我们还没有积极研究如何优化内存使用量,并希望能实现进一步的改进。编辑器对所有语言服务操作(包括完成列表、快速信息、转到定义和查找所有引用)的响应速度也将有显著提高。我们还将采用语言服务器协议 (LSP),这是一项长期的基础架构工作,目的是使我们的实施与其他语言更好地保持一致。

版本路线图

我们最近发布的 TypeScript 版本是 TypeScript 5.8,TypeScript 5.9 也即将发布。基于 JS 的代码库将在 6.x 系列中继续开发,TypeScript 6.0 将引入一些弃用和破坏性更改,以便与即将发布的本地代码库保持一致。

当原生代码库与当前的 TypeScript 达到足够一致时,我们将发布 TypeScript 7.0。目前,TypeScript 7.0 仍处于开发阶段,我们将及时公布稳定性和功能里程碑。

为了清晰起见,我们将把它们简称为 TypeScript 6 (JS) 和 TypeScript 7 (native),因为这将是可预见的未来的术语。在内部讨论或代码注释中,您可能还会看到我们使用 “Strada”(最初的 TypeScript 代号)和 “Corsa”(本次开发的代号)。

虽然某些项目可能可以在发布时切换到 TypeScript 7,但其他项目可能依赖于某些 API 功能、遗留配置或其他限制,因此必须使用 TypeScript 6。考虑到 TypeScript 在 JS 开发生态系统中的关键作用,我们仍将维护 6.x 版本的 JS 代码库,直到 TypeScript 7+ 足够成熟和被广泛采用。

我们的长期目标是尽可能保持这些版本的一致性,以便您可以在 TypeScript 7 满足要求时立即升级到 TypeScript 7,或在必要时返回到 TypeScript 6。

接下来的步骤

在接下来的几个月中,我们将分享更多有关这项令人兴奋的工作的信息,包括更深入地了解性能、新的编译器 API、LSP 等。我们已经在 GitHub 代码库中编写了一些常见问题解答,以解决您可能会遇到的一些问题。我们还邀请您参加 3 月 13 日上午 10 点(太平洋标准时间)和下午 5 点(世界协调时)在 TypeScript 社区讨论区举行的 AMA。

10 倍的性能提升代表着 TypeScript 和 JavaScript 开发体验的巨大飞跃,因此我们希望您和我们一样对这项工作充满热情!

本文文字及图片出自 A 10x Faster TypeScript

你也许感兴趣的:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注