3月12日、Microsoft Developer Blogsで「10倍高速なTypeScript(A 10x Faster TypeScript)」と題した記事が公開された。この記事では、ネイティブ実装に移植することによるTypeScriptの大幅なパフォーマンス向上について詳しく紹介されている。
公式による動画による解説はこちら。
本記事は、以下のエキスパートに監修していただきました:
監修者 うひょさんからのコメント
最近Andersさんが活動しているのを見かけないので引退したのかな? と思っていたのですが、こんなプロジェクトに取り組まれていたということで驚きました。TypeScript周りのエコシステムではRustなどを用いた高速なツールチェインが進化を続けていましたが、TypeScriptの型チェックという点ではこれまで本家TypeScriptの代替が存在せず、高速な言語で書き直すという第三者の取り組みもうまくいっていませんでした。それを本家TypeScriptチームが取り組むということで、とても期待できます。
ただ、GoはWASMにコンパイルした際のパフォーマンスが悪いことが知られています。TypeScriptをブラウザ上で実行するユースケースもあるため、それが今度どうなるのかは注視が必要です。
この話題については誤解も見られるため注意しましょう。まず、今回は「書き直し (rewrite)」ではなく「移植 (port)」であることが強調されています。元のTypeScriptによる型チェッカーの実装をほぼ1:1でGoに翻訳するものであり、コンパイラの設計などが変わることはありません。そのやり方でないと、既存のTypeScriptの挙動を維持したまま再実装するのは難しいのでしょう。
また、この移植による10倍高速化の恩恵を主に受けられるのは「型チェック」の時間です。あくまで、型チェッカーを含むコンパイラが10倍高速化するという話なので、我々が書いたTypeScriptコードの実行時間が10倍になるとかではありません。また、トランスパイルについても、本家TypeScript以外にも高速な実装(esbuild、SWCなど)がすでに使われていますから、それらを使っている人がさらにスピードアップの恩恵を受けることはないでしょう。
監修者 古川陽介さんからのコメント
まさに優しい終身の独裁者だからこその決断で、その勇気が素晴らしいなと思います。移植だけする予定とのことでしたが、それもここまで広がってしまった言語を広くサポートするうえで素晴らしい決断だなと思います。
1990年代はセルフホストが流行ってました。自分の言語で自分のコンパイラを書くという技術がよく使われてました。それはひとえにハードウェアとCPUが多種多様だったことやドッグフーディングの重要性が叫ばれていたことなどが要因です。一方今はハードウェアも多様ではなくなり、コンパイラも複雑さを増しています。別言語で実装して、パフォーマンスを出すという判断を取るのは非常に理にかなっています。一方TypeScriptに慣れ親しんだ人が貢献しようとするとGoも知らないといけないというハードルが少し上がったように思えます。開発者の貢献しやすさを取るか、パフォーマンスを取るかというバランスを常にリーダーは求められていくのでしょう。
いずれにせよ、ここにきて Anders Hejlsberg 氏が大きな決断をしたことを尊敬します。
TypeScriptパフォーマンス向上の概要
TypeScriptは大規模コードベースを扱う際、エディタの起動やコードチェックに時間がかかる場面が多いという課題があった。そこで今回、新たにネイティブ移植を進めることで大幅な速度改善を図っている。それによる速度向上効果は大きく、 エディタの起動が格段に速くなり、ビルド時間も10倍程度短縮される見込み である。
TypeScriptチームは、このネイティブ移植版コンパイラとツール群により、エディタ起動時間の高速化やメモリ使用量の削減、そしてAIを活用した高度な開発体験の実現を狙っている。現時点では完全な機能実装には至っていないが、tsc
(TypeScriptコンパイラ)や言語サービスを段階的にネイティブ化し、 2025年中頃にはコマンドラインでの型チェックを行えるプレビュー版を公開する計画 だという。
ネイティブコードベースの安定版は TypeScript 7.0としてリリースされる予定であり、それまでは既存のJavaScript実装のTypeScriptコードベースも引き続き開発が続けられる予定である。
現状すでに、TypeScriptのGo言語による実装をビルド・実行できるようになっている。動作方法や実装済みの機能についてはREADMEを参照のこと。
どのくらい速くなるのか
記事には、いくつかの有名なオープンソースコードベースを使ったビルド速度の比較結果が示されている。以下に示すのは、それらをまとめた図表である。
ネイティブ移植版のビルド速度比較Codebase | Size (LOC) | Current | Native | Speedup |
---|---|---|---|---|
VS Code | 1,505,000 | 77.8s | 7.5s | 10.4x |
Playwright | 356,000 | 11.1s | 1.1s | 10.1x |
TypeORM | 270,000 | 17.5s | 1.3s | 13.5x |
date-fns | 104,000 | 6.5s | 0.7s | 9.5x |
tRPC (server + client) | 18,000 | 5.5s | 0.6s | 9.1x |
rxjs (observable) | 2,100 | 1.1s | 0.1s | 11.0x |
いずれのプロジェクトでも約10倍の速度向上が報告されている のが確認できる。この新たなネイティブ基盤によって、エラーリストの即時表示や高度なリファクタリング、さらにはAIとの連携機能の強化などが期待できるという。
またVisual Studio Codeにおける速度向上も顕著で、従来約9.6秒かかっていたロード時間がネイティブ版では約1.2秒になり、約8倍の高速化が確認されているという。メモリ使用量もまだ最適化の余地がある段階ながら、大きく削減できていると報告されている。
今後の展望・ロードマップ
TypeScriptの最新版は現時点では5.8であり、5.9も近々公開される見通しである。現行のJavaScript実装のTypeScriptは今後6.x系として開発が続けられるが、ネイティブ移植されたTypeScriptが十分に完成した段階でTypeScript 7.0としてリリースされる。
プロジェクトによっては、依存ライブラリやレガシーな設定の関係でTypeScript 6.x系を使い続ける必要がある場合があるため、当面はJavaScript版とネイティブ版の両方が並行してメンテナンスされる。最終的にはTypeScript 7+への移行が推奨されるが、環境が整うまでは柔軟に選択できるよう配慮される予定である。
今後数か月のうちに、さらに詳しい性能検証やコンパイラAPI、LSP対応などに関する情報が公開される予定である。また、GitHubリポジトリには想定される質問に対するFAQが用意されているほか、3月13日にはTypeScript Community DiscordにてQ&Aセッションが行われる予定である。
詳細はA 10x Faster TypeScriptを参照していただきたい。
まさに優しい終身の独裁者だからこその決断で、その勇気が素晴らしいなと思います。移植だけする予定とのことでしたが、それもここまで広がってしまった言語を広くサポートするうえで素晴らしい決断だなと思います。
1990年代はセルフホストが流行ってました。自分の言語で自分のコンパイラを書くという技術がよく使われてました。それはひとえにハードウェアとCPUが多種多様だったことやドッグフーディングの重要性が叫ばれていたことなどが要因です。一方今はハードウェアも多様ではなくなり、コンパイラも複雑さを増しています。別言語で実装して、パフォーマンスを出すという判断を取るのは非常に理にかなっています。一方TypeScriptに慣れ親しんだ人が貢献しようとするとGoも知らないといけないというハードルが少し上がったように思えます。開発者の貢献しやすさを取るか、パフォーマンスを取るかというバランスを常にリーダーは求められていくのでしょう。
いずれにせよ、ここにきて Anders Hejlsberg 氏が大きな決断をしたことを尊敬します。
最近Andersさんが活動しているのを見かけないので引退したのかな? と思っていたのですが、こんなプロジェクトに取り組まれていたということで驚きました。TypeScript周りのエコシステムではRustなどを用いた高速なツールチェインが進化を続けていましたが、TypeScriptの型チェックという点ではこれまで本家TypeScriptの代替が存在せず、高速な言語で書き直すという第三者の取り組みもうまくいっていませんでした。それを本家TypeScriptチームが取り組むということで、とても期待できます。
ただ、GoはWASMにコンパイルした際のパフォーマンスが悪いことが知られています。TypeScriptをブラウザ上で実行するユースケースもあるため、それが今度どうなるのかは注視が必要です。
この話題については誤解も見られるため注意しましょう。まず、今回は「書き直し (rewrite)」ではなく「移植 (port)」であることが強調されています。元のTypeScriptによる型チェッカーの実装をほぼ1:1でGoに翻訳するものであり、コンパイラの設計などが変わることはありません。そのやり方でないと、既存のTypeScriptの挙動を維持したまま再実装するのは難しいのでしょう。
また、この移植による10倍高速化の恩恵を主に受けられるのは「型チェック」の時間です。あくまで、型チェッカーを含むコンパイラが10倍高速化するという話なので、我々が書いたTypeScriptコードの実行時間が10倍になるとかではありません。また、トランスパイルについても、本家TypeScript以外にも高速な実装(esbuild、SWCなど)がすでに使われていますから、それらを使っている人がさらにスピードアップの恩恵を受けることはないでしょう。
iine