TypeScript 用 Go 语言重写:技术圈的重大事件
2025 年 3 月 11 日,微软毫无征兆地宣布将整个 TypeScript 用 Go 语言重写,实现了 10 倍的速度提升,这在技术圈引起了轰动。无论是改动规模还是效果,都堪称编程语言历史上最强的一次升级。
澄清:10 倍提速的是编译时间
首先要明确的是,10 倍提速指的是代码的编译时间,而非运行时间。因为 TypeScript 编译后是 JavaScript,运行速度由 JavaScript 引擎决定。但对于程序员来说,这仍是值得庆贺的好事,毕竟节省的是开发时间,受益的是开发者。
众人关心的八卦问题:为何选 Go 而非 Rust 或 C
有趣的是,大家看到新闻后,最关心的并非 10 倍加速的实现原理或大规模升级克服的困难等技术问题,而是为何选择 Go 语言,而非风头正盛的 Rust,或者微软自家的 C#。这背后的答案其实都在技术选型和项目管理的决策上。
项目管理角度:Native Port 而非 Rewrite
从项目管理角度出发,微软一开始的目标是 Native Port(原生移植),即将 TypeScript 源码中的每个函数以几乎一对一的形式翻译成新语言的函数。这样无需重新构造整体结构和设计逻辑,开发效率高,还能保证功能 1 比 1 还原,实现完美兼容,让用户无缝升级。
而 Rewrite(重写)则是用新语言重新开发一个新的 TypeScript,一切都要从零开始,工作量巨大,开发周期长,还可能面临无法向后兼容的问题,甚至比当年 Python 3 与 Python 2 的过渡还要艰难。
TypeScript 的版本规划
移植到 Go 上的 TypeScript 计划命名为 TypeScript 7,现有的 JavaScript 版 TypeScript 5.8 会按原计划升级到 5.9,并在不久的将来升级到 TypeScript 6。5 到 6 的大版本升级会有一些 break and change,目的是让 TypeScript 6 和 TypeScript 7 除底层语言外保持高度一致,以便用户从 JavaScript 核心的 6 升级到 Go 核心的 7。
不选 Rust 写核心的原因
语言移植需要保持功能完全一对一,垃圾回收机制也需一致。JavaScript 的垃圾回收原理是 mark and sweep(标记清除),Go 也采用类似原理,且由于是多线程,效率更高。而 Rust 的内存管理是通过 ownership 和 lifetime 机制手动标记垃圾回收,不直接支持循环数据结构,无法像 Go 那样与 TypeScript 实现一对一转化,因此被排除。
选择 Go 而非 C# 的原因
TypeScript 从一开始就是纯正的函数式编程写法,整个代码库几乎没有 class,所有功能都以函数实现。函数式编程的代码移植方便,函数写好并测试通过即可使用,相互间无干扰,不存在 side effect(副作用)。
TypeScript、Go、Rust 等新语言更偏向函数式编程设计风格,而 C# 为照顾微软的企业级场景需求,且要与 OOP(面向对象编程)设计的.NET 框架兼容,走了 OOP 道路,因此不适合移植 TypeScript。
最终选择 Go 的过程
通过排除法得出最终选择。首先,语言要足够成熟,生态丰富,硬件兼容完善,排除大部分小众语言。其次,为保证性能,需是编译语言,排除 Python、Ruby 等。然后,要更容易复刻 TypeScript 的函数式编程写法,排除 Java、C++、C# 等 OOP 语言。最后,核心机制要一致,排除没有 GC 的 Rust,只剩下 Go。
10 倍速的来源
加速主要有两个来源。一是 Go 作为编译语言,自然比解释型语言的 TypeScript 更快,测试结果快 3 倍。二是 Go 作为多线程语言,能更充分发挥现代 CPU 的算力。TypeScript 本质上是后端语言,99.99% 的工作在 CPU 上进行,如类型检测,而 Go 的多线程并发能力全球最强,打开了 TypeScript 的性能上限。
TypeScript 或成 AI 辅助开发新突破口
新的 TypeScript 有 100 倍算力加持,能在零延迟前提下向 AI 打包发送所有上下文信息,如类型定义、函数调用链、参数生命周期、项目代码结构等。这将极大提升 AI 辅助开发的信息密度,有望让 AI 的辅助开发功能更上一层楼。不过效果取决于 AI 开发方。
TypeScript 的独特之处
主流编程语言中,很多是用别的语言写的,如 Java、Python、PHP 用 C 语言写;有些先用别的语言写,成熟后逐步替换成自己写自己,如 Go 一开始用 C 写,Rust 一开始用 ocaml 写,Scalar 一开始用 Java 写。而 TypeScript 从一开始自己写自己,发展成熟后却选择用另一种语言重写,可谓特立独行。