文章目錄
TypeScript 7 換上了用 Go 寫的原生編譯器。這次最值得理解的,是每天幫我們檢查型別、提供編輯器提示的工具,為什麼要換一種語言實作。
以前是用什麼寫的?#
舊版 TypeScript 編譯器其實是用 TypeScript 自己寫的,再編譯成 JavaScript,通常透過 Node.js 執行。也就是說,我們寫的 .ts 檔,是交給另一套由 TypeScript 寫成的程式來檢查與轉換。
TypeScript 7 則把編譯器移植到 Go,再產生能在作業系統上直接執行的程式,這就是這裡「原生」的意思。改變的是工具本身的實作;我們的專案仍然寫 TypeScript,輸出也仍然是 JavaScript,不會變成 Go 程式。
為什麼需要改?#
專案變大後,型別檢查要處理的就不只是眼前這個檔案。例如改了共用的 User 型別,工具可能需要重新確認許多使用它的函式、元件和套件。這些關係越多,檢查、載入專案和更新提示就越容易讓人等待。
原本以 JavaScript 執行的版本已經做過多年最佳化,但要再大幅提升速度,團隊需要更有效率的記憶體配置,以及更容易利用多個 CPU 核心的架構。
Go 版本能把部分工作分配到多個核心,也提供更直接的資料配置控制。效能改善來自這些設計一起配合,並不是把副檔名換成 .go 就會自動變快。對開發者來說,最實際的差別是型別檢查和編輯器回應更快,不代表網站在使用者的瀏覽器裡也會跟著加速。
為什麼選 Go?#
團隊要保留多年累積的型別判斷邏輯,讓同一份程式在新舊編譯器裡得到盡量一致的結果。因此選語言時,除了速度,也得考慮現有程式能不能順利搬過去。
Go 適合這次移植,主要有三個原因:
- 容易保留既有結構: Go 的寫法與原編譯器大量使用函式、資料結構的方式相近,移植時較容易對照原本邏輯。
- 自動管理記憶體: Go 有垃圾回收機制,能回收不再使用的資料,同時讓團隊更精確地安排資料如何存放。
- 方便安排平行工作: Go 提供的並行工具,讓團隊更容易把適合拆開的工作交給不同 CPU 核心處理。
Rust、C# 等語言也能寫編譯器;Go 的優勢在於,這次它能兼顧效能和移植成本。團隊既要讓工具更快,也要保住原本的行為,讓既有專案能接著使用。