目次
tsrsは、TypeScriptコンパイラをRustに移植する実験的なプロジェクトです。初期ベンチマークでは、TypeScript 7.0と比べて型チェックが最大8倍高速で、メモリ使用量が約70%少ないと報告されています。自分のプロジェクトで試す価値はありますが、互換性の不足や設定の違いがあるため、現在のコンパイラを置き換えられると考えるのは時期尚早です。
要点#
- Cloudflare、VoidZero、Owner.comのMax Schwenkが、TypeScriptチームと緊密に連携し、Oxc JavaScriptコンパイラツールチェーンの一環としてtsrsを開発しています。
- 初期ベンチマークでは、型チェック用ワーカー数が同じ条件で、TypeScript 7.0より最大8倍高速で、メモリ使用量が約70%少ないと報告されています。
- Rustを採用したtsrsは、ブラウザ上の開発ツールやCloudflare Workersなど、メモリに制約のあるWebAssembly環境での利用候補になります。
- npmでのリリースは実験段階で、既知の動作の違いがあり、tsrsとtsc-rsを1つのパッケージに統合する計画があります。
tsrsが変えるもの#
tsrsは、TypeScriptの既存の動作を維持しながら、Rustで実装することを目指しています。別の言語や、TypeScriptの新たな方向性を提案するプロジェクトではありません。言語設計は引き続きTypeScriptチームが担い、tsrsはその決定に従う必要があります。
評価する際には、この区別が重要です。高速なコンパイラも、コードを正しく理解できてこそ役に立ちます。採用の判断は、tsrsがプロジェクトの型、設定、診断を本家のコンパイラと一貫した形で扱えるかどうかに基づくべきです。
計画の対象は、コマンドラインでの型チェックにとどまりません。チームはTheo Browneと協力し、tsc-rsとtsrsを統合して、Language Server Protocol対応やコンテンツマッパーを含むTypeScriptの全機能をサポートするパッケージを開発しています。これらは目標として掲げられているものであり、実験的なリリースですでにすべてを網羅しているという意味ではありません。
ベンチマークは慎重に読む#
注目の数値は、型チェック用ワーカー数を同じにしてtsrsとTypeScript 7.0を比較したものです。プロジェクトによると、TypeScriptチームと協力してベンチマークの設定をそろえ、一方の実装により多くのリソースを割り当てる比較を避けたとのことです。
この比較は、基準となる性能がいかに速く変化しているかも示しています。TypeScript 7.1ベータ版は、TypeScript 7.0より最大2.5倍高速だと報告されています。tsrsから本家に取り込まれた最適化もあります。そのため、7.0に対する8倍という結果が、7.1ベータ版や、プロジェクトで使用しているコンパイラのバージョンに対しても同じ優位性を示すわけではありません。
tsrsはデフォルトで、マシンに応じた適応的な設定を使用します。これにより、メモリ消費量が増える一方で、さらに高速化する場合があります。ローカルで有用な比較を行うには、次を記録してください。
- コンパイラの正確なバージョンとコマンド。
- ワーカー数と設定オプション。
- 複数回実行した際の型チェックの所要時間。
- ピークメモリ使用量と診断の違い。
Rustが重要な理由#
別の実装を作る実用上の理由は、ローカルでの型チェックの高速化だけではありません。Rustはガベージコレクタを同梱せずにWebAssemblyへコンパイルできるため、制約のある環境でメモリのオーバーヘッドを減らせる可能性があります。
そのため、tsrsはブラウザ内やCloudflare Workers上で動作する開発環境に適しています。コンパイラのメモリ占有量が小さくなれば、コーディングエージェントが使う環境を含め、サンドボックス内で他のビルドツールとともに型チェックを実行しやすくなる可能性があります。
これらは導入の可能性であり、すべての対象環境で測定された結果ではありません。提示されたベンチマークからは、ブラウザでの起動時間、WebAssemblyのバンドルサイズ、特定のWorkersアプリケーション内でのメモリ消費量は分かりません。判断の決め手になる場合は、それぞれ別途確認してください。
自分のプロジェクトで試す#
一時的なブランチや使い捨てのチェックアウトに、実験的なパッケージをインストールします。
npm install --save-dev tsrs
npx tsrsまずは、すでにTypeScriptでチェックしているプロジェクトを使ってください。既存のコンパイラの結果を記録してから、同じ設定でtsrsを実行します。実行時間やメモリ使用量に加え、報告されるエラーも比較してください。正常終了しただけでは、両方のコンパイラが同じファイルをチェックし、同等の結果を出したことにはなりません。
評価中は、既存のTypeScriptによるチェックを維持してください。tsrsの結果が異なる場合は、どちらかを正しいと判断する前に、小さな再現例に絞り込んでください。エディタで使う場合は、コマンドラインでの性能から対応状況を推測せず、必要な言語サービス機能を個別に確認してください。
互換性の確認が必要#
チームは、診断の表示順序など、現時点で本家のTypeScriptとの違いがあることを認めています。順序の違いだけでも、コンパイラの出力を直接比較するスクリプトやスナップショットに影響する可能性があります。
互換性の維持には、継続的な作業が必要です。提案されているプロセスでは、エージェントを使って本家の変更をレビューし、互換性の不足が疑われる箇所を追跡し、互換性テストを実行して修正を提案します。また、適用可能な性能改善をTypeScriptのGo実装に還元する意向もあります。
このプロセスは保守計画であり、現時点で完全な互換性があることの証明ではありません。必須のチェックにtsrsを採用する前に、プロジェクトの診断と、ビルドが依存するコンパイラの動作を確認してください。どちらかのコンパイラが変更された際には、その結果を再確認してください。
次のステップ#
一時的なブランチで代表的なプロジェクト1つにtsrsを実行し、現在のTypeScriptコンパイラと比較した型チェック時間、ピークメモリ使用量、診断の結果を保存してください。
出典: https://blog.cloudflare.com/typescript-rust-port/
目次
