TypeScript 编译器一直采用 自举(bootstrapping) 方式,意味着它是用 TypeScript 自己实现的。虽然这提供了一定的优势,但同时也带来了 性能瓶颈,尤其是在处理大型代码库时。
主要性能瓶颈:
- JIT(即时编译)开销:每次运行 TypeScript 时,都要额外消耗时间启动 JavaScript 运行时。
- 动态对象模型:JavaScript 允许灵活的数据结构,但这种特性在编译器这种高计算密集型任务中会拖慢速度。
- 内存管理:无法像底层语言一样直接分配内存,导致数据结构的性能受限。
- 单线程执行:无法利用多线程处理任务,导致编译速度受限。
结果就是:
- 大型项目的加载和检查时间变长
- 经常发生内存溢出
- 开发者不得不在“编辑器启动速度”和“完整代码分析”**之间做妥协
为什么选 Go,而不是 Rust 或 C++?
微软团队在寻找新的编译器实现语言时,评估了 Rust、C++ 和 Go。最终,他们选择了 Go 作为 TypeScript 的新语言,这个决定可能让不少人感到惊讶。
为什么不是 Rust 或 C++?
- Rust:虽然性能强大,但数据结构管理需要更多调整,迁移成本较高。
- C++:更贴近底层,但开发效率较低,维护成本较高。
为什么选 Go?
支持跨平台原生代码 —— 可在不同系统上编译优化后的 TypeScript。
更好的数据布局控制 —— 提高内存管理效率。
支持循环数据结构 —— TypeScript 代码中经常用到。
自动垃圾回收(GC) —— 让开发者无需手动管理内存。
内置并发支持 —— 充分利用多核 CPU,极大提升编译速度。
10 倍性能提升,具体有多快?
VS Code 项目加载时间
9.6 秒 → 1.2 秒(8 倍提升)
内存占用
原生版 TypeScript 使用的内存减少 50%
整体编译性能
相比当前的 TypeScript 5.8,速度提升 10 倍!