繁體中文
jason's blog關於網頁標準、瀏覽器與前端開發的觀察筆記

文章分類: TypeScript

TypeScript 7 換上原生編譯器

TypeScript 編譯器原本用什麼寫、為什麼需要移植,以及 Go 如何兼顧效能與既有程式的相容性。

發布 2026/07/08
文章目錄

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 的優勢在於,這次它能兼顧效能和移植成本。團隊既要讓工具更快,也要保住原本的行為,讓既有專案能接著使用。

資料來源與延伸閱讀