推出 tsrs:TypeScript 的 Rust 版編譯器
Introducing tsrs: A port of TypeScript to Rust
tsrs 是一個將 TypeScript 編譯器移植到 Rust 的新工具,提供顯著的速度與記憶體最佳化。
\n- 核心效能:比 TypeScript 7.0 快 8 倍、記憶體使用量減少 70%。
tsrs 8 倍快、70% 節省記憶體,讓 TypeScript 在瀏覽器與雲端開發環境更輕量化、即時回饋。
Cloudflare 與 VoidZero 現正與 Owner.com 的 Max Schwenk 合作,開發 tsrs,一個 TypeScript 編譯器的 Rust 版本。我們正與 TypeScript 團隊密切合作,並將 tsrs 作為 Oxc JavaScript compiler toolchain 的一部分進行孵化。
我們的目標是協助開發者減少等待程式碼檢查的時間,將更多時間投入建置。提升 TypeScript 的速度與記憶體效率,也能將完整的開發環境帶到更多地方,包括直接在瀏覽器內。
說明一下,我們並未 fork TypeScript。我們相信 TypeScript 團隊應繼續完全掌控語言的設計與方向。他們在引領 TypeScript 在 JavaScript 社群的採用時,維持長期願景。我們不想改變這一點。
TypeScript 團隊在許多事項上能快速前進,但對於某些功能,他們可能會花數年時間有意探索選項並製作原型,才選擇最適實作。Rust 版本必須緊密跟隨這些決策,否則最終會失效並失去相容性。我們必須嚴格根據原始實作保留 TypeScript 語言,而 TypeScript 團隊應該單獨負責決定其具體樣貌。
效能與記憶體改進
我們的 Rust 版 TypeScript 初步基準測試相當有前景:tsrs 的速度可達 8 倍,且相較於 TypeScript 7.0 在使用相同數量的型別檢查工作者時,記憶體使用量減少約 70%:
如您所見,下一版 TypeScript 已帶來許多效能提升,使 TypeScript 7.1 beta 的速度可達 TypeScript 7.0 的 2.5 倍。部分最佳化已由 tsrs 上游化,我們也希望能發現更多。
您可能已看到近期不同 TypeScript 版本的基準測試,並聲稱有不同的效能,往往是因為使用較大的機器型別與與 TypeScript 預設不同的選項。我們與 TypeScript 團隊合作,確保 上述基準測試 比較相同的設定。
預設情況下,tsrs 以依賴機器型別的自適應設定發行,使用更多記憶體但速度更快:
嘗試 tsrs
TypeScript in Rust 旨在成為忠實的 TypeScript 版本。您可透過安裝 npm 上的 tsrs 套件來嘗試實驗性版本:
npm install tsrs
npx tsrs為何現在?
多年來,我們見證了許多將 TypeScript 轉移到其他語言的嘗試。由於涉及的複雜度,只有一個版本成功:TypeScript 團隊將 TypeScript 從 JavaScript 轉移至 Go 的版本。
然而,前沿 AI 模型現在能在數天內幾乎獨立完成大規模移植。我們已見到 slopforks、忠實移植以及在 Rust 或 C++ 中完全重構的 TypeScript 版本。顯然,對更快 TypeScript 的需求日益增加。
為何選擇 Rust?
您可能會想:『TypeScript 的 Go 版已將 TypeScript 速度提升 10 倍,記憶體效率遠超先前用 TypeScript 編寫的版本。為什麼還不夠?』
然而,這不僅僅是速度。Rust 提供了一些獨特的優勢:在 WebAssembly 上執行。Rust + Wasm 的故事一直很強大,其中一個原因歸結於 Rust 語言設計的基礎。當你將 Go 程式編譯為 Wasm 時,你必須同時編譯 Go 的垃圾回收器。但 Rust 的記憶體管理模型使 WebAssembly 檔案與宿主之間的記憶體互動變得直接。這是使 Rust 在 WebAssembly 用例中更適合的關鍵因素之一:記憶體效率。
Cloudflare Workers 已長期支援 Wasm。就在幾週前,我們宣佈 在 Workers 中支援原生 Rust,搭配新的 Emscripten 目標 for wasm-bindgen。當你在 Workers 上以緊密迴圈執行整體軟體建置與部署系統時,低記憶體佔用的好處會迅速顯現。這意味著你可以以極高效率執行這些工作負載,現在甚至可以在以前無法執行的環境中執行完全封裝的開發系統。
這為結合代理程式開啟了新可能:你現在可以在 Cloudflare 上以完全沙盒化環境端到端執行開發工具鏈。但利用 Wasm,你也可以安全地在瀏覽器客戶端、嵌入式裝置或 IoT 應用中執行這些環境。
tsrs 埠將如何維護?
首先,我們正與 Theo Browne 合作,將 tsc-rs 與 tsrs 合併為單一套件,支援 TypeScript 的所有功能,包括語言伺服器協定(LSP)和內容對映器。其次,我們已看到在維護 Vinext 與其上游 Next.js 同步方面取得許多成功。我們在 最近的部落格文章中說明瞭我們的做法:
每天早上,代理程式會審查變更、抓取差異,並為任何可能影響 Vinext 的專案開啟追蹤問題。每晚,我們在執行 Next.js 測試套件對照 Vinext 時,會重新產生相容性矩陣。當其中一項測試或問題揭示差距時,代理程式現在能夠在兩個程式碼庫中識別變更,建立重現、移植相關測試,並提出修正方案。
我們將把相同流程套用於 TypeScript,極度小心不引入與上游 TypeScript 不同的行為。當我們發現效能改進時,會嘗試將其回饋至 TypeScript Go 程式碼庫,讓大家都受益。
最後,我們意識到目前與上游 TypeScript 版本存在一些差異,例如診斷訊息的印出順序。我們的目標是在發布穩定版本前將這些差異降至最低。
接下來會怎麼做?
Cloudflare 已是許多免費且開源的 Rust 工具的家園,這些工具支援 JavaScript 生態系,例如 Vite、Rolldown、Oxlint 與 Oxfmt。隨著超過 1000 萬開發者在 Cloudflare 上構建,我們非常關注提升底層開發工具鏈的速度、可攜性,以及在更多環境中更易執行。對於更深入的 tsrs 與我們堆疊整合,我們感到興奮,例如在 Oxlint 中加入型別感知 lint 規則。
像 Vinext 一樣,我們的目標是讓 tsrs 以良好維護、健康的開源專案運作——不會妨礙 TypeScript 本身。Oxc 團隊已經開始重構程式碼庫,以提升速度、減少記憶體使用並提高可維護性。我們知道 TypeScript 團隊正認真對待此事——他們正在為 tsc 進行記憶體與效能最佳化實驗。我們很期待與 TypeScript 團隊及 JavaScript 社群合作,共同打造最優、最快速的 TypeScript 實作。