吵翻了!TypeScript 官方編譯器移植到 Go 語言,為什么不是 Rust / C# ?!
TypeScript(簡稱 TS)社區(qū)最近炸開了鍋!官方宣布將 TS 編譯器從 JavaScript(JS)移植到 Go 語言,號(hào)稱性能提升10倍。這一消息一出,開發(fā)者們的情緒像是過山車:有人拍手叫好,覺得這波操作務(wù)實(shí)又高效;有人卻滿臉問號(hào),甚至有點(diǎn)受傷——“為啥不是 Rust?為啥不選 C#?”畢竟,TS 的靈魂人物 Anders Hejlsberg 可是 C# 的締造者,而 Rust 在 JS/TS 生態(tài)中早已是“性能先鋒”的代名詞。這到底是怎么回事?讓我們一探究竟!
10倍性能提升,Go 成“救世主”
先來看看這次移植的亮點(diǎn)。TS 官方在博客《A 10x Faster TypeScript》中明確表示,新的 Go 版編譯器(代號(hào)“Corsa”)將大幅提升開發(fā)者體驗(yàn)。無論是命令行構(gòu)建還是編輯器加載速度,都能實(shí)現(xiàn)10倍左右的加速。以 Visual Studio Code(VS Code)這個(gè)擁有150萬行代碼的龐然大物為例,原先用 JS 版編譯器(tsc)檢查全項(xiàng)目要77.8秒,現(xiàn)在 Go 版只用7.5秒,足足快了10.4倍!編輯器加載時(shí)間也從9.6秒驟降到1.2秒,內(nèi)存占用還減半。這波優(yōu)化,直接讓大型項(xiàng)目的開發(fā)者從“等得花兒都謝了”變成了“快到飛起”。
TS 團(tuán)隊(duì)的核心訴求很明確:他們希望編譯器能快速啟動(dòng)、快速完成任務(wù),同時(shí)保持與現(xiàn)有 JS 代碼庫的高度兼容。項(xiàng)目負(fù)責(zé)人 Ryan Cavanaugh 在 GitHub 討論中寫道:“我們需要新代碼在語義和結(jié)構(gòu)上盡量貼近現(xiàn)有代碼,這樣才能同時(shí)維護(hù)兩套代碼庫?!边@意味著,這次不是從零開始的重寫,而是一次“搬家式移植”。Go 之所以脫穎而出,是因?yàn)樗拇a風(fēng)格與 TS 現(xiàn)有的函數(shù)式+數(shù)據(jù)結(jié)構(gòu)模式高度吻合,用 Go 寫出來的代碼幾乎像是 JS 版的“鏡像”,開發(fā)者改動(dòng)時(shí)可以輕松在兩邊同步。
除此之外,Go 的內(nèi)存管理也幫了大忙。TS 編譯器需要大量處理抽象語法樹(AST)等數(shù)據(jù)結(jié)構(gòu),這些對(duì)象生命周期較長,而 Go 的垃圾回收(GC)機(jī)制正好能簡化代碼復(fù)雜度。Anders Hejlsberg 在采訪中提到:“Go 是最接近原生代碼的語言,同時(shí)還自帶自動(dòng)垃圾回收?!毕啾戎拢謩?dòng)管理內(nèi)存會(huì)讓移植工作量翻倍,而 TS 團(tuán)隊(duì)顯然不想給自己找這個(gè)麻煩。
Rust:生態(tài)寵兒為何落選?
然而,看到 Go 被選中,Rust 的粉絲坐不住了。畢竟,在 JS/TS 生態(tài)中,Rust 早已是“性能擔(dān)當(dāng)”的代表。像 SWC、OXC、esbuild(雖然是用 Go 寫的)這樣的工具,都在用 Rust 或 Go 大幅提升構(gòu)建速度。Rust 以其內(nèi)存安全和強(qiáng)大的類型系統(tǒng)著稱,尤其擅長處理編譯器這種需要大量遍歷樹結(jié)構(gòu)的場景。社區(qū)里有人直言:“Rust 的 match
語法簡直是為解析器和 AST 遍歷量身定做的,Go 能比得上嗎?”
對(duì)此,TS 團(tuán)隊(duì)的回應(yīng)很直接。Ryan Cavanaugh 在 FAQ 中解釋:“如果是從頭重寫,Rust 確實(shí)是個(gè)好選擇。但我們這次是移植,需要保留現(xiàn)有行為的精確性?!盧ust 的零成本抽象和嚴(yán)格的借用檢查雖然強(qiáng)大,卻要求開發(fā)者重新設(shè)計(jì)內(nèi)存管理邏輯,這與 TS 當(dāng)前基于 GC 的代碼風(fēng)格格不入。Anders Hejlsberg 在視頻采訪中補(bǔ)充道:“Rust 沒有垃圾回收,我們得重構(gòu)所有數(shù)據(jù)類型,這太費(fèi)勁了?!睋Q句話說,Rust 的理想主義雖美,但在這次務(wù)實(shí)的“搬家”任務(wù)面前,顯得有點(diǎn)“水土不服”。
還有個(gè)現(xiàn)實(shí)問題:Rust 的學(xué)習(xí)曲線陡峭。Go 的簡單語法讓新手也能快速上手,這對(duì)開源項(xiàng)目的貢獻(xiàn)者友好度是個(gè)加分項(xiàng)。一名網(wǎng)友在 Hacker News 上調(diào)侃:“Rust 粉絲別急,TS 團(tuán)隊(duì)只是想快點(diǎn)干完活,而不是花半年研究生命周期?!彪m然有點(diǎn)夸張,但也道出了部分真相——TS 團(tuán)隊(duì)更看重效率和兼容性,而非追求極致的性能潛力。
C#:Anders 的“親兒子”為何被冷落?
如果說 Rust 落選還能理解,那 C# 被排除在外就讓很多人摸不著頭腦了。Anders Hejlsberg 是 C# 的創(chuàng)始人,TS 又是微軟的項(xiàng)目,按理說用 C# 既能“肥水不流外人田”,還能統(tǒng)一微軟的開發(fā)敘事。部分 C# 支持者甚至感到被背叛:“Anders 你這是不愛自己的孩子了嗎?”還有人感嘆:“C# 的 Roslyn 編譯器都用 C# 寫得那么成功,為什么 TS 不跟上?”
TS 團(tuán)隊(duì)的理由依然圍繞“移植便利性”。Ryan Cavanaugh 表示:“C# 的面向?qū)ο箫L(fēng)格和 TS 現(xiàn)在的函數(shù)式代碼不太搭。”TS 編譯器的 JS 版幾乎全是函數(shù)和數(shù)據(jù)結(jié)構(gòu),幾乎沒有類,而 C# 的習(xí)慣用法更偏向 OOP(面向?qū)ο缶幊蹋?。Anders 在采訪中進(jìn)一步解釋:“Go 比 C# 更低級(jí),它的結(jié)構(gòu)體和內(nèi)聯(lián)數(shù)據(jù)表達(dá)能力更接近 JS 的風(fēng)格。”他還提到,C# 雖然有 AOT(提前編譯)選項(xiàng),但這些功能跨平臺(tái)支持不夠成熟,遠(yuǎn)不如 Go 的靜態(tài)單二進(jìn)制文件來得直接。
社區(qū)里也有聲音質(zhì)疑這種說法。一名 Hacker News 用戶指出:“C# 有 record、靜態(tài)方法和 Span,完全可以映射 TS 的數(shù)據(jù)結(jié)構(gòu),Anders 這理由有點(diǎn)牽強(qiáng)。”還有人猜測,背后可能是團(tuán)隊(duì)偏好或政治因素:“Go 在微軟內(nèi)部越來越流行,連 Dapr 框架都用它,C# 是不是被邊緣化了?”不過,Anders 本人澄清道:“這不是對(duì) C# 的否定,微軟內(nèi)部 C# 仍是主流。這只是針對(duì) TS 的特定需求做出的選擇。”
吵歸吵,開發(fā)者體驗(yàn)才是王道
這場語言之爭吵得熱火朝天,但 TS 團(tuán)隊(duì)的態(tài)度很明確:他們不在乎“語言信仰”,只想用最合適的工具解決問題。Go 的勝利不是因?yàn)樗昝罒o缺——比如它與 JS 的互操作性就比不上 Rust 或 C#——而是因?yàn)樗谶@次移植中平衡了性能、兼容性和開發(fā)效率。TS 團(tuán)隊(duì)甚至承諾會(huì)優(yōu)化 Go 的 JS API,確保生態(tài)工具不會(huì)因?yàn)檫@次遷移而翻車。
對(duì)于普通開發(fā)者來說,這場爭論的意義可能沒那么大。無論編譯器是用 Go、Rust 還是 C# 寫的,最終輸出的還是 JS 代碼,運(yùn)行時(shí)性能不會(huì)有變化。真正的好處是構(gòu)建更快、編輯器更流暢。正如一名網(wǎng)友總結(jié):“10倍加速都擺在面前了,還在乎用什么語言寫?趕緊用起來吧!”
未來展望:TS 7.0 會(huì)帶來什么?
按照官方計(jì)劃,Go 版編譯器將在 TypeScript 7.0 中正式亮相,而 JS 版會(huì)繼續(xù)維護(hù)到 6.x 系列穩(wěn)定。這意味著短期內(nèi)開發(fā)者可以自由選擇版本,長期來看則會(huì)逐步過渡到 Go 版。TS 團(tuán)隊(duì)還透露,新編譯器將支持更高級(jí)的重構(gòu)功能和 AI 工具集成,這些都得益于性能的飛躍。
至于 Rust 和 C# 的粉絲們,或許可以期待下一次機(jī)會(huì)。畢竟,Anders Hejlsberg 也說了:“如果是個(gè)全新項(xiàng)目,語言選擇會(huì)完全不同?!钡巯?,Go 已經(jīng)接過了接力棒,帶著 TS 邁向更快的未來。你怎么看這次選擇?歡迎留言吵一架——畢竟,程序員不吵架,還叫程序員嗎?
Ref: