CloudflareとVoidZeroは、Owner.comのMax Schwenkと協力し、TypeScriptコンパイラのRust移植版であるtsrsをリリースしました。このプロジェクトは、Oxc JavaScriptコンパイラツールチェーンの一部としてインキュベートされています。tsrsの主な目的は、メモリ効率を向上させつつ、型チェックにおける開発者の待ち時間を短縮することです。この効率性は、Webブラウザや組み込みデバイスといった制約のある環境で、完全な開発環境を実行する際に特に重要となります。

TypeScriptコンパイラのRustへの移植を表現したスタイリッシュなグラフィック。
CloudflareとVoidZeroは、TypeScriptコンパイラにRustのメモリ効率をもたらすためにtsrsを開発しています。blog.cloudflare.com

この画像は、RustベースのTypeScriptコンパイラ移植版であるtsrsの発表における主要なビジュアルとして機能します。

初期のベンチマークでは、同等の数の型チェックワーカーを使用した際、tsrsはTypeScript 7.0と比較して最大8倍高速であり、メモリ使用量は約70%削減されることが示されています。TypeScriptチームは最近のバージョンですでに大幅なパフォーマンス向上を実現していますが(TypeScript 7.1ベータ版では7.0と比較して2.5倍の高速化を記録)、tsrsはさらにその限界を押し広すことを目指しています。Goなどの他の言語ではなくRustを選択した主な技術的要因は、そのメモリ管理モデルにあります。WebAssembly(Wasm)にエクスポートする際にガベージコレクタのコンパイルを必要とするGoとは異なり、RustのモデルはWasmゲストとホストの間のより直接的なメモリ相互作用を可能にします。これにより、RustはCloudflare Workersにとって優れた選択肢となります。Cloudflare Workersでは、ソフトウェアのビルドおよびデプロイシステムをタイトなループ内で実行する際、小さなメモリフットプリントが大きなメリットをもたらすためです。

公式のTypeScript言語との互換性を維持するため、このプロジェクトはフォークではなく、忠実な移植を重視しています。チームは、Rustの能力を活用しながら、元の実装のロジックを維持することを目指しています。移植版をアップストリームの変更と同期させるために、チームはVinextで使用されているものと同様の、自動化されたエージェントベースのワークフローを使用する計画です。このプロセスでは、エージェントが毎日の変更をレビューし、差分を取得して、互換性マトリックスのギャップを特定します。不一致が見つかった場合、エージェントはコードベース全体でその変更を特定し、再現環境を構築して修正案を提示します。現在、出力される診断の順序など、いくつかの軽微な差異が存在しますが、プロジェクトが安定版に向けて進むにつれて、これらの差異を最小限に抑えることが目標です。また、チームは発見したパフォーマンスの最適化を公式のTypeScript Goコードベースにフィードバックし、より広いコミュニティに利益をもたらすことも意図しています。

ガベージコレクション言語からRustへTypeScriptを移植する際の顕著な技術的課題の一つは、長期間生存するオブジェクトの管理です。Rustにはネイティブのガベージコレクタがないため、この移植版では独自のメモリモデルを採用しています。このモデルでは、Rustの安全性保証を維持しながら必要な動作をシミュレートするために、長期間生存するオブジェクトに対して「決して解放されないアリーナ(never-freed arenas)」を使用します。このアプローチにより、コンパイラはフルランタイムのオーバーヘッドなしで高いパフォーマンスを達成でき、Cloudflare Workersのようなサンドボックス環境や、ブラウザ内でのクライアントサイドにおける完全なカプセル化された開発ツールチェーンの実行を可能にします。