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ぜひコメント欄で教えてください。動画が良ければチャンネル登録もお願いします。それでは、また次回。
Community Posts
No posts yet. Be the first to write about this video!
Write about this video