10x高速なTypeScript ~TSがTSで実装される時代の終わりの始まり?~
昨夜TypeScriptの開発チームから"A 10x Faster TypeScript"という記事が公開されました。
ざっくりいうと、TypeScriptの(コンパイラ、型システムの)実装をTypeScriptからgolangに移植したら10倍早くなるという話です。
現時点でどれくらい実用的なレベルに達しているのか気になりますが、これまでのTypeScriptによるTypeScriptの実装のコードベースやVSCodeのコードベースを正常にロードできるようです。
VSCodeのコードベース(1,505,000行)のロード時間が77.8秒から7.5秒と、10.4倍に高速化されたということで、タイトルの通り偽りなく革命が起きようとしている予感がします!
このロード時間とは、tscコマンドがtype checkを実行する際に型情報を読み込む時間や、IDEでプロジェクトを開いた時にLSPサーバがTypeScriptの型情報の読み込む時間このとだと思います。
実行時のパフォーマンスとは無関係ですが、かなりのDXの改善になりそうですね!
また、メモリ使用量についてはまだまだ十分なチューニングはできていないそうですが、それでもTypeScriptの実装に比べてgolangの実装ではメモリ使用量がざっくり半分になるとのこと!
CIでメモリ不足に悩まされることも多いのでここについても期待したいところです。
type checkなど一部の機能を備えたtscが2025年半ばまでにリリースされる予定で、全ての機能を備えた正式なリリースとしては2025年内を目標としているそうです。
TypeScriptの型情報を無視してトランスパイルするだけの実装はすでにgolang(esbuild)やRust(swc)で実装されて、viteやTurbopackで利用されていしますが、type checkができるコンパイラの移植はswcの作者が挑戦していたけど難航していたという印象です。
参考記事
TypeScriptの複雑奇怪なtype systemを完全に移植することは難しいだろうし、挙動の異なる処理系が多言語で乱立し始めたらエコシステムの混乱を招くのではと危惧していました・・・
typescript-goは公式チームのプロジェクトなので圧倒的な期待感がありますね🙌
TypeScriptがセルフホストではなくなるとデメリットも多少はありそうな気はしますが、ほとんどの場面では10xの高速化のメリットの方が圧倒的に大きいですよね!
TypeScriptの仕様には(再帰回数の上限など)パフォーマンスの問題が起因ともいえる厄介な仕様もあったりするので、先々は言語仕様の面でもブレークスルーが起きる期待もできると思います。
速報として簡単な紹介になってしまいましたが、typescript-goを触ってみる時間が取れたら続報として記事を書きます🙌
Like, followよろしくお願いします😋
Discussion
なぜgoなのかという疑問に対するTypeScriptのリードエンジニアの回答
コードの挙動だけでなくコードの設計・構造も含めた互換性を重視した結果の判断
rustはメモリ管理の仕組みがTypeScriptと大きく異なり、goの方が既存のTypeScriptのコードベースの実装の構造をそのまま移植する形で表現しやすかった
goはメモリ(レイアウト・アロケーション)の制御を良い感じにできるが、メモリ管理のことを過度に意識する必要はない
GC(ガーベジコレクション)による悪影響はこのプロジェクトではとりわけ問題にはならない
TypeScriptのコードベースにはグラフ処理を扱うコードが多いが、既存のコードベースに近い形でgoで良い感じにかけた
goのプロセス内のjsインタプリタは他と比べて優れているとは言えなくて改善の余地がある