聽說 TypeScript7.0 要用 Go 寫?
大家好,我是煎魚。
前段時間社區(qū)里掀起了一波大熱潮,甚至在電梯間都偶有同事拍一拍我,說到聽說 TypeScript7.0 要用 Go 重寫了,真牛逼。你知道嗎?
實(shí)則上是:TypeScript7.0 編譯器和工具的原生移植至用 Go 編寫,以此實(shí)現(xiàn)大幅改善編輯器啟動,將大多數(shù)構(gòu)建時間縮短 10 倍,并大幅減少內(nèi)存使用量的目的。
圖片
消息本身是由 @Anders Hejlsberg 在A 10x Faster TypeScript[1]中放出來的消息,其頭銜是:微軟技術(shù)研究員,TypeScript 首席架構(gòu)師。C#、Delphi 和 Turbo Pascal 的原創(chuàng)設(shè)計(jì)者。
TS 選型核心依據(jù)
在 microsoft/typescript-go[2] 項(xiàng)目中,官方發(fā)起了 《Why Go?[3]》??梢栽敿?xì)的看到選擇的緣由:
圖片
以下為原文的部分總結(jié)。選取了一些我認(rèn)為比較有用的。
部分選擇依據(jù)
1、代碼兼容性
- Go 的代碼模式與現(xiàn)有 TypeScript 代碼庫的編碼范式(內(nèi)存管理、數(shù)據(jù)突變、多態(tài)實(shí)現(xiàn)等)高度契合。
- 規(guī)避完全重構(gòu)風(fēng)險,采用漸進(jìn)式移植策略保留已有行為特征與關(guān)鍵優(yōu)化。
2、內(nèi)存管理架構(gòu)
- 精細(xì)化內(nèi)存控制:
- 支持對象級/字段級內(nèi)存布局定制,無需全局關(guān)注內(nèi)存管理細(xì)節(jié)。
- ST 等長生命周期對象管理更方便。
- GC 性能平衡策略:
- 批量編譯場景可完全規(guī)避 GC(進(jìn)程結(jié)束后自動釋放)。
- 非批量場景通過預(yù)分配+邏輯 GC 觸發(fā)點(diǎn)設(shè)計(jì),將 GC 影響降至毫秒級。
- 對比其他語言方案,代碼復(fù)雜度降低 30%+ 的同時保持同等運(yùn)行時效率。
3、工程實(shí)踐
- 代碼可移植性:基于 Go 與 TS 的結(jié)構(gòu)相似性,實(shí)現(xiàn)核心算法跨語言變更同步率 85%+
- 編譯工具鏈支持:Go 原生支持交叉編譯,單二進(jìn)制部署簡化工具鏈復(fù)雜度
- 并發(fā)模型適配:Goroutine 機(jī)制為未來分布式編譯預(yù)留架構(gòu)擴(kuò)展空間
性能提升情況
TS 官方的本機(jī)實(shí)現(xiàn)已經(jīng)能夠加載許多流行的 TypeScript 項(xiàng)目,包括 TypeScript 編譯器本身。
下面是在 GitHub 上不同大小的一些流行代碼庫上運(yùn)行 tsc 的時間:
圖片
簡單來講:大幅提速,官方很興奮。摩拳擦掌中。
Go 社區(qū)的快速響應(yīng)
這次 TS 的大動作和在微軟博客上宣發(fā),在國內(nèi)外都引發(fā)了一波熱潮。
在 Go 社區(qū)中也有同學(xué)迅速展開了行動,@Jorropo 光速提交了一版逃逸分析的優(yōu)化反饋和 issues[4]:
圖片
@Jorropo 在嘗試新的 TypeScript 編譯器時,發(fā)現(xiàn)性能有問題?;ㄙM(fèi)了 70s:
________________________________________________________
Executed in 70.51 secs fish external
usr time 159.17 secs 543.00 micros 159.17 secs
sys time 5.49 secs 249.00 micros 5.49 secs
基于其對自身機(jī)器的配置了解,160 ÷ 70 ≈ 2.3 計(jì)算得知多核利用率較低。
為此通過研究,得知最大的異常耗時在于:github.com/microsoft/typescript-go/internal/checker:
github.com/microsoft/typescript-go/internal/checker
________________________________________________________
Executed in 44.97 secs fish external
usr time 50.51 secs 413.00 micros 50.51 secs
sys time 0.32 secs 142.00 micros 0.32 secs
隨后,@thepudds(主要負(fù)責(zé) Go 內(nèi)的性能、模糊測試和 Go Module 等)光速提交了多個 CL 進(jìn)行優(yōu)化,提高了至少 5 倍的性能:
escape analysis total package compile time
go1.24.1 47.109 sec 50.60 sec
cl-657179-ps3 8.095 sec 11.57 sec
parallel-wip 2.844 sec 6.28 sec
第一行是 Go 1.24,第二行時合了優(yōu)化 CL 后的。第三個是 WIP 并行版本(也就是正在發(fā)布上線后的實(shí)際性能提高可能會更好)。
總結(jié)
這次對于 TypeScript 編譯器和工具原生移植用 Go 來寫,對于 Go 這一門編程語言來講,是非常不錯的。生態(tài)圈多了一名大將。也意味著用戶群體受益的更多。
結(jié)合 Go 社區(qū)的反響來看,優(yōu)化還是非常及時的,態(tài)度上也是比較積極支持。
較為尷尬的是,在微軟宣發(fā)的博客內(nèi),一滑動評論區(qū),一眼看到一個太刺激的評論:
圖片
參考資料
[1]A 10x Faster TypeScript: https://devblogs.microsoft.com/typescript/typescript-native-port/
[2]microsoft/typescript-go: https://github.com/microsoft/typescript-go
[3]Why Go?: https://github.com/microsoft/typescript-go/discussions/411
[4]issues: https://github.com/golang/go/issues/72815