2025年3月11日,TypeScript 首席架构师 Anders Hejlsberg 宣布,微软将 TypeScript 编译器和工具链移植到 Go 语言,代号为“Corsa”。
TypeScript 作为 JavaScript 的超集,凭借其强大的类型系统在开发社区中广受欢迎。然而,随着项目规模的不断扩大,TypeScript 编译器在处理大型代码库时逐渐暴露出性能瓶颈,如加载时间过长、类型检查缓慢以及内存占用过高。这些问题严重影响了开发效率,促使微软决定进行技术革新。
目前,基于 Go 的 TypeScript 实现已经在 GitHub 上开源,并能够加载多个主流 TypeScript 项目,包括 TypeScript 编译器自身。微软预计在2025年年中推出具备命令行类型检查功能的原生tsc
预览版。
后续规划
- 2025年中期:微软计划发布具备命令行类型检查功能的原生
tsc
预览版。 - 2025年底:完成项目构建和语言服务的完整实现。
- TypeScript 7.0:代号为“Corsa”,将作为原生Go版本正式发布。
微软将继续维护现有的TypeScript 6.x版本(基于JavaScript代码库),以确保与现有项目的兼容性。开发者可以根据需求选择合适的时机进行迁移。
性能提升与原因分析
性能提升
微软通过将 TypeScript 编译器移植到 Go 语言,实现了显著的性能提升:
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 | 18,000 | 5.5s | 0.6s | 9.1x |
rxjs | 2,100 | 1.1s | 0.1s | 11.0x |
性能提升原因
- 内存管理:Go 的垃圾回收机制在批量编译场景下表现优异,且内存分配模式与 TypeScript 的长期生命周期数据结构(如 AST 语法树)适配良好。
- 并发处理:Go 的轻量级协程(goroutine)和并发模型适合处理 TypeScript 编译中的树遍历和图操作任务。
- 代码结构:Go 的代码结构与 TypeScript 现有代码库高度相似,便于逐步迁移而非彻底重写。
为什么选择 Go,而不是 Rust
- 代码迁移的可行性:Go 的代码结构与 TypeScript 现有代码库高度相似,便于逐步迁移。
- 内存管理优势:Go 的垃圾回收机制在批量编译场景下影响较小。
- 并发处理能力:Go 的轻量级协程和并发模型适合处理 TypeScript 编译中的树遍历和图操作任务。
- 开发效率:Go 语言的简洁性和工具链成熟度降低了迁移和维护成本。
尽管 Rust 在性能和安全性方面表现出色,但其所有权机制和生命周期注解增加了代码复杂度,可能导致迁移复杂度大幅增加。此外,Rust 在内存管理上需要大量不安全代码,且缺乏足够的原语组合来实现 TypeScript 的移植目标。
Anders Hejlsberg 认为,Go 语言的“平庸”是刻意设计的,它追求简单,但结果并不平庸。他认为,Go 语言非常适合 TypeScript 编译器的移植需求,能够显著提升性能。
Ryan Cavanaugh(TypeScript 联合创始人)解释说,虽然 Rust 是一个不错的选择,但在与当前 TypeScript 代码库的兼容性方面,Go 的表现更加优越。他还提到,Rust 在代码的移植与内存管理上存在复杂性,而 Go 在这些方面显得相对简单易用。
社区方面,许多开发者对微软的决定表示欢迎,认为这将显著提升开发体验。然而,也有不少 Rust 粉丝感到困惑与失落,认为 Rust 的高性能和安全性无可匹敌。一些网友甚至幽默地表示,TypeScript 团队对 Rust 的尝试几乎仅限于“撑过午饭时间”。