もはやTypeScriptはTypeScriptではない...

BBetter Stack
Computing/SoftwareInternet Technology

Transcript

00:00:00TypeScriptがバージョン7のリリース候補を公開しました。
00:00:04今回は「TypeScriptがTypeScriptでなくなる」そんなバージョンになりそうです。
00:00:07以前からTypeScriptコンパイラをTypeScript自身からGo言語へと書き換える作業が進められており、
00:00:12なんと10倍も高速化されたようです。来月にもTypeScript 7をリリース予定とのことですので、
00:00:17何が変更されたのか、どれくらい速くなったのか、導入前の破壊的変更の有無について見ていきましょう。
00:00:26Goへの移行についてのニュースを見逃した方のために説明すると、プロジェクトは約1年前に始まりました。
00:00:29要点は、型チェックのようなCPU負荷の高い処理は、JavaScriptの設計には向いていなかったと彼らが気づいたことです。
00:00:34そこでGo言語での書き換えを開始し、早い段階から大きな成功を収めました。
00:00:39基本的には既存のTypeScriptの実装をほぼ一行ずつ移植していったため、
00:00:44型チェックのロジックは構造的に全く同じで、動作もそのまま引き継がれています。
00:00:48関数の中には言語が違うだけで、ほとんど同じというものもありました。
00:00:52今ならClaudeにコードベースを渡して「好きな言語に書き換えて」と言えば済みますが、当時はそうはいきませんでした。
00:00:56Bunを見ていてそう思いましたよ。さて、移植の結果は一目瞭然です。
00:01:00ここにPlaywrightのレポジトリがあります。古いバージョンのTypeScriptで型チェックを行うと、
00:01:041400ファイル、50万行のコードに対して完了まで約6秒かかります。
00:01:08何も変更せずにコマンドだけ変えてリリース候補版に切り替えると、
00:01:12合計でわずか0.87秒で完了しました。驚異的な改善です。また、
00:01:18全く同じエラーを検出し、同じファイルとコード行を処理しているため、動作はTypeScript 6と完全に同じです。
00:01:23Goのネイティブコードは、このようなタスクにおいてJavaScriptよりも根本的に高速なのです。
00:01:27さらに、共有メモリを用いた並列処理が可能になった点も重要です。
00:01:32JavaScriptコンパイラはシングルスレッドでしたが、Goは型チェックを複数のコアに分散させることができます。
00:01:37TypeScript 7では、デバッグやリソースが限られた環境のために、あえてシングルスレッドで動かすフラグも用意されています。
00:01:41同じPlaywrightのコードベースで試すと、
00:01:46シングルスレッドでも約2秒かかりました。これでも以前より3倍速いですね。
00:01:50並列処理といえば、新しい「checkers」フラグも導入され、
00:01:54並列で動作させる型チェッカーのワーカー数を設定できるようになりました。
00:01:58デフォルト値は4です。CPUコア数が多い場合はこの値を増やすことで、大規模プロジェクトでのビルドが高速化されます。
00:02:03ただし、メモリ消費量が増えるという代償もあります。Playwrightのレポジトリで
00:02:08チェッカーの数をデフォルトの倍である8に設定したところ、さらに実行時間が3分の1短縮されました。
00:02:12また、プロジェクト参照ビルドを並列化するための新しい「builders」フラグも追加されました。
00:02:16これは複数のプロジェクトを一度にビルドする際に、並列ビルダーの数を制御できます。
00:02:20これを先ほどのチェッカーと組み合わせれば、例えばそれぞれを4つにすることで、
00:02:24最大16個の型チェッカーを同時に動かせることになります。ネイティブ化と並列処理に加えて、
00:02:29TypeScript 7におけるもう一つの大きな変更がウォッチモードの書き換えです。
00:02:34Goへの移行にあたり、この部分は少し難易度が高かったようです。Goの標準ライブラリには、
00:02:38ファイル監視の組み込みAPIが存在せず、サードパーティライブラリも安定性や
00:02:43パフォーマンス、クロスプラットフォーム対応の面で問題があったためです。そこでチームは、
00:02:47MicrosoftがVS Codeで使用しているParcelのファイル監視エンジンに着目しましたが、これはC++製でした。
00:02:53そのため、必要な部分をGoへと移植する必要がありました。幸い、無事に実装が完了し、
00:02:57これまで以上にスムーズに動作しているようです。次に、メジャーバージョンアップということもあり、
00:03:01大規模な書き換えがあったため破壊的変更を心配されるかもしれませんが、
00:03:05TypeScript 6から7への移行に関しては、特に問題はなさそうです。
00:03:10もしバージョン5から7へ移行する場合であれば、かなりの変更が必要になります。
00:03:14まずは6に上げて、そこでの問題をクリアしてから7へ上げるのが推奨されています。
00:03:19TypeScript 6での大きな変更点には、ES5ターゲットの削除、baseUrlの削除、
00:03:24AMD/UMD/SystemJSのモジュールシステムの非推奨化などがありました。また、strictがデフォルトでtrueになり、
00:03:31moduleがESNextに、targetはESNextの直前の安定版ECMAScriptバージョンがデフォルトになりました。
00:03:36これらは過去の遺産を整理し、TypeScriptを近代化するもので、個人的には大賛成です。
00:03:40全てのバージョンで古いプロジェクトをサポートし続けることは、ツール開発の進歩を鈍化させかねませんから。
00:03:45残りのブログ記事を見てみると、言語機能自体の新しい変更点は一つだけのようです。
00:03:49テンプレートリテラル型がUnicodeコードポイントを正しく保持するようになったことです。
00:03:53TypeScript 7以前はUTF-16コード単位で分割していたため、絵文字を半分に割ってしまうことがありました。
00:03:59そのため、変な型のヘッドやテイルになってしまっていたのです。
00:04:04しかし、TypeScript 7では完全なコードポイントごとに分割されるため、絵文字が保持されます。
00:04:09これこそが期待通りの挙動ですよね。これに実際に直面したことがある方がいたら、本当に驚きます。
00:04:13まあ、とにかくこの変更によって、エディタ上でのTypeScriptの動作など、
00:04:18大規模プロジェクトでTypeScriptを使うあらゆる場面が、はるかに高速に感じられるはずです。
00:04:22安定版のリリースは1ヶ月後を予定しています。
00:04:27また、ツール開発者がコンパイラの上に構築するための安定したプログラムAPIは、
00:04:32バージョン7.1で提供される予定です。そのため、TypeScript 6と7を
00:04:36競合させることなく共存させるための互換性パッケージも用意されています。
00:04:41皆さん、これらの変更についてどう思いますか?TypeScriptが遅いと感じたことはありましたか?
00:04:44ぜひコメント欄で教えてください。動画が良ければチャンネル登録もお願いします。それでは、また次回。

Key Takeaway

TypeScript 7はコンパイラのGo言語化と並列処理の導入により、型チェック速度を大幅に向上させ、大規模プロジェクトのビルド時間を劇的に短縮する。

Highlights

  • TypeScript 7コンパイラの型チェック処理をGo言語で実装し直すことで、実行速度が約6.9倍に向上した。

  • Playwrightのリポジトリにおいて、従来の環境では6秒かかっていた型チェックが0.87秒で完了する。

  • JavaScriptベースのシングルスレッドからGoベースの並列処理へ移行し、CPUコアを活用したビルド高速化が可能になった。

  • 新しい「checkers」フラグにより、並列動作させる型チェッカーのワーカー数を設定できる。

  • TypeScript 6から7への移行において破壊的変更は確認されていないが、バージョン5からの移行には注意が必要である。

  • テンプレートリテラル型がUnicodeコードポイントを保持するように変更され、絵文字の分割問題が解消された。

Timeline

TypeScript 7におけるGo言語への移行と高速化

  • TypeScript 7のコンパイラはGo言語で再実装された。
  • 型チェック処理の高速化により、実行時間が約6.9倍短縮された。
  • 既存のロジックを一行ずつ移植したため、動作は以前のバージョンと完全に一致する。

JavaScriptの設計がCPU負荷の高い型チェック処理に適していなかったため、コンパイラのGo言語への書き換えが実施された。Playwrightのリポジトリを用いた検証では、1400ファイル・50万行のコードに対して、旧バージョンで6秒かかっていた処理が0.87秒で完了する結果となった。機能的な互換性は維持されており、同じエラー検出と処理が行われる。

並列処理の導入とビルド設定の最適化

  • Goの共有メモリ並列処理により、複数のCPUコアを活用した型チェックが可能になった。
  • 「checkers」フラグにより、並列化するワーカー数を指定してビルド時間を短縮できる。
  • 「builders」フラグにより、複数のプロジェクト参照ビルドを同時に並列処理できる。

シングルスレッドだった従来に対し、Goの並列処理を利用することで大規模プロジェクトのビルド速度が向上した。デフォルトのワーカー数は4だが、設定で増やすことでさらなる高速化が可能となる。メモリ消費量とのトレードオフになるものの、チェッカーとビルダーを組み合わせることで、最大16個のプロセスを同時に動作させる設定も可能である。

ウォッチモードの更新と移行手順

  • ウォッチモードの監視エンジンをC++からGoへ移植し、動作を改善した。
  • TypeScript 6から7への移行には破壊的変更はないが、5からの移行は段階的なアップデートが推奨される。
  • テンプレートリテラル型がUnicodeコードポイントを保持し、絵文字の分割を防ぐ仕様に変更された。

VS Codeで使用されていたParcelのファイル監視エンジンをGoへ移植することで、安定したウォッチモードを実現した。TypeScript 6ではES5ターゲットの削除やstrictモードのデフォルト化など近代化が進められており、バージョン7への移行前段階として、まず6へアップデートすることが推奨される。また、言語仕様としては絵文字を正しく扱うための変更が加えられた。

Community Posts

No posts yet. Be the first to write about this video!

Write about this video