Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TypeScriptネイティブ移植観察レポート TSKaigi 2025

Avatar for berlysia berlysia
May 23, 2025
2.7k

TypeScriptネイティブ移植観察レポート TSKaigi 2025

Avatar for berlysia

berlysia

May 23, 2025
Tweet

More Decks by berlysia

Transcript

  1. 誰 • berlysia ◦ べるりしあ、と読む • TSKaigi 2025のトーク周りを統括 • Webフロントエンドの民

    ◦ 縦書きCSSなど • ドワンゴ教育事業 ◦ Webフロントエンドをやる ◦ Webフロントエンドのためのことをやる • 書いてあることをよく読む方のオタク ◦ 助走をつけて飛躍するのも楽しいけど ◦ それは地に足の着いた前提があるからだよね 2
  2. 2025-05-22までのイメージ 7 2025-03-07 TSKaigi 2025 CfP締切 2025-03-11 “A 10x faster

    TypeScript” 2025-05-23 TSKaigi 2025 day1 mid-2025 TypeScript Native Preview…? CfPに入りようがなかったし Native Portの話をするか プレビューも近そうだしなー 2025-05-24 TSKaigi 2025 day2
  3. 2025-05-22までのイメージ 8 2025-03-07 TSKaigi 2025 CfP締切 2025-03-11 “A 10x faster

    TypeScript” 2025-05-23 TSKaigi 2025 day1 mid-2025 TypeScript Native Preview…? CfPに入りようがなかったし Native Portの話をするか プレビューも近そうだしなー 2025-05-24 TSKaigi 2025 day2 ~2025-05-23(JST) Microsoft Build ❗
  4. なるほど 12 2025-03-07 TSKaigi 2025 CfP締切 2025-03-11 “A 10x faster

    TypeScript” 2025-05-23 TSKaigi 2025 day1 2025-05-24 TSKaigi 2025 day2 ~2025-05-23(JST) Microsoft Build 2025-05-23(JST) TypeScript Native Preview
  5. なるほど 13 2025-03-07 TSKaigi 2025 CfP締切 2025-03-11 “A 10x faster

    TypeScript” 2025-05-23 TSKaigi 2025 day1 ~2025-05-23(JST) Microsoft Build 2025-05-23(JST) TypeScript Native Preview 2025-05-24 TSKaigi 2025 day2 today!
  6. プレビュー版所感 • 未実装で落ちてるのに気づきにくい ◦ エラーコードに注目するとよい ◦ 変なところがあったらREADMEもみたほうがよい • 本当にそのまま動く、マジで動く ◦

    プライベートの最近目をかけてるコードは未実装部以外全部動いた ▪ 挙動の違いっぽいものを見つけたのでこれが終わったら報告するんだ…… • 大規模になればなるほど、速さが際立つ ◦ でかいやつは本当に10分の1で終わった ◦ Language Serverもかなり高速なので、未実装が気にならなければアリ 17
  7. おことわり • ただの観察者として調査しました ◦ 内情は一切わかりません ◦ 内緒で何かを聞いていたりはしません ▪ 聞いてたらこんなタイミングでこんな話を用意してるわけないだろ •

    公開情報だけを参照して構成されています ◦ みなさんも気合いを入れれば同等以上のことを調べられます ◦ 情報の探索にはChatGPTやNotebookLMを活用しています • できるだけ元の記述・発言への参照を示します ◦ 一次ソースを大事にするタイプの人としてがんばります ◦ 翻訳や画面の都合で「ざっくり」する部分はご容赦ください ◦ が、直近出てきたソースがだいたい話題にしていたので、省略している箇所も多い • 目指すこと→面白いところを紹介するから興味があったら調べてね! 19
  8. このトークのソース 1/2 20 • A 10x Faster TypeScript 記事 ◦

    A 10x faster TypeScript YouTubeの動画 ◦ A 10x faster TypeScript - YouTube ショートもあがってた • GitHub - microsoft/typescript-go ◦ Staging repo for development of native port of TypeScript ◦ 主にDiscussion • GitHub - microsoft/TypeScript ◦ TypeScript is a superset of JavaScript that compiles to clean JavaScript output. ◦ TypeScript 5.9 Iteration Plan, 6.0 Deprecation Candidates
  9. このトークのソース 2/2 21 • TypeScript community Discord ◦ 2025-03-14にAsk me

    anythingが開催されていた • Typescript Just Got 10x Faster - Syntax #884 ◦ Anders Hejlsbergさん、Daniel Rosenwasserさんがゲスト • LIVE: Anders Hejlsberg on TypeScript’s Go Port • TypeScript is being ported to Go | interview with Anders Hejlsberg • Announcing TypeScript Native Previews • A 10x Faster TypeScript with Anders Hejlsberg | BRK116 ◦ 大抵の細かい話題はこれ見ればソースになると思います
  10. 呼び名が必要ですね 22 • Strada(ストラーダ)……既存のTypeScript実装の系列 ◦ 元々のTypeScriptのコードネーム、理由は失伝 ◦ 現行のTypeScript 5.xと、TypeScript 6.xまでがこちらに連なる

    • Corsa(コルサ)……新しいGo言語による実装 ◦ TypeScript 7.0としていずれリリースされる、開発中の実装 • 📝Strada, Corsaの命名理由 ◦ Strada's origin is lost to the sands of time. Strada is Italian for "Road", Corsa ("race course") was chosen by analogy [Ask me Anything, RyanC] ▪ なので、Corsaは、速いんだということです
  11. なぜネイティブ実装に移行するのか 25 既にJavaScript実装での限界に達している • TypeScriptはTypeScriptで書かれ、JavaScriptランタイムで動く ◦ パフォーマンスとスケーラビリティーに課題がある • 「JavaScriptはコンパイラのような計算負荷の高い用途に最適でない」[A 10x

    faster TypeScript (00:30~)] ◦ 「大規模なプロジェクトではout-of-memoryが頻発する」 ◦ 「柔軟すぎるオブジェクトモデルはコストがかかる、構造体へのインライン割り当てはできない、 共有メモリを用いた並行処理もない」 ◦ 「JavaScriptのVMは世界最高クラスの性能があるが、コンパイラ用途には限界がある」 • 「プロファイリングしてもホットスポットはない。最適化をやり尽くしている」 [TypeScript is being ported to Go (07:25~)]
  12. なぜ「移植」が選ばれたか 29 • 「TypeScriptのあらゆる挙動は、どこかのプロジェクトで利用されている」 [Why a port instead of a

    rewrite? What's the difference? #410 / microsoft/typescript-go] ◦ ハイラムの法則:利用者が十分いるとき、仕様ではなく観測可能な振る舞いに誰かが依存する ▪ 📝`string & {}` なんかは挙動が保存されたいい例 • 「型チェッカーにとって、後方互換性は絶対」[LIVE: Anders Hejlsberg on TypeScript’s Go Port (42:17~)] ◦ 「古いバージョンでコンパイルできたコードは、新しいバージョンでもコンパイルできる。 それだけが型チェッカーとして意味がある唯一のやりかた」 ◦ 「移植によってしか、細部まで同じセマンティクスを持ったものにはならない」 ▪ 💡メジャーバージョンが上がっても何かを壊していいとは思っていない ▪ 動作を変えるときは、フラグによって従前のコードがコンパイルできるようにする • 「プラグアンドプレイで置き換えられるものを目指す」 [TypeScript is being ported to Go (30:34~)] ◦ 「それが古いバージョンを永遠にメンテしなくて済む唯一の方法」
  13. ものの9ヶ月で「触れる」状態に到達 32 2024-09頃 「移植」取り組みの開始 2025-03-11 ネイティブ移植の取り組みを発表 10万行程度が移植済み、型チェック8割、言語サービス着手したばかり 2025-05-24 TSKaigi 2025

    day2 2025-05-23(JST) プレビュー版提供開始 型チェック “done”、JSX、JSDoc対応、言語サービスは補完可能に 25万行中の15万行が移植済み、IPCベースAPIプロトタイプ提供 today! 2025年後半までに主要機能と言語サービス提供目指す (”by October”、とBuildで話していた)
  14. ネイティブ化による高速化要素 35 ネイティブ化 3x~3.5x 並列処理 3x~3.5x (3x~4xとも) • JITとdeopt、柔軟で動的なオブジェクトモデルからの脱却 ◦

    実行時コストが低減、予測可能になってチューニングしやすい • 型やASTといったデータ構造のインライン化、メモリの効率的な利用 ◦ JSではオブジェクトごとにヒープに割り当てられ、GCが頻発 ◦ Corsaではまとめてメモリを確保、局所性向上、GCコストも激減(これだけで倍速になる) • 文字列管理が効率的なGoの言語特性 ◦ JSの文字列はUTF-16だが、Goの文字列はUTF-8で、TSのコード前提ならほぼ半分で済む ◦ Goのスライスを使った部分文字列表現は、メモリの割り当てが発生しない
  15. 並列処理による高速化要素 36 ネイティブ化 3x~3.5x 並列処理 3x~3.5x (3x~4xとも) • ファイルごとに独立処理可能な部分を積極的に並列化 ◦

    パース、バインドまではGoroutineを使って一斉に処理し、ASTとスコープ情報を得る ▪ Goランタイムのスケジューラによって、CPU数に対して線形スケール • 型チェッカーはプロジェクトを4分割して並列処理 ◦ 割り当て範囲のファイルを型チェック、共通・グローバルな型は重複するが、メリットが大きい ▪ ASTとスコープをimmutableに扱い、ロックなしで処理できる ◦ 型チェック結果を決定的にするために4分割で固定されている ▪ 将来的にはオプションで可変になるかもしれない
  16. 互換性の追求 37 • 「目標は99.99%の互換性」[TypeScript is being ported to Go (29:22~)]

    ◦ 「同じコードベースに対して全く同じエラーセットを出したい」 ◦ 「2万件の適合テストをクラッシュせずに実行できる」 • 10万件のエラー差分検知テストが存在する[A 10x Faster TypeScript with Anders Hejlsberg (22:15〜)] ◦ Strada, Corsaの2実装に同じコードを与え、結果の差異をみている ◦ 互換性を機械的に検証し、暗黙的な挙動に至るまで同じ結果を目指す • 『Union型や型自体の決定的順序付け』の導入 [LIVE: Anders Hejlsberg on TypeScript’s Go Port (46:02~)][Total ordering of types #200 / microsoft/typescript-go] ◦ 型チェックの並列化によって順序が変わってしまうので、順序を与えて決定的にする ▪ 今までは偶然できた順序だった ◦ この導入によってStradaとは差が生まれることになる ▪ PR見るのがおすすめ
  17. 驚くべき開発スピードの背景 38 • Stradaの開発に関わってきた人が、Corsaにも関わっている ◦ 移植専任を置いたりしていない。TypeScriptに詳しい開発者が移植に携わる • 「移植」を支援する、TypeScriptからGoへの構文変換ツールが存在 ◦ TypeScriptのASTからGoの構文に決定的に変換

    ▪ ユニオン型やオプショナルプロパティなど、Goにはない要素はエラーになる状態 ◦ 自動変換→人の手を介して細部を修正→テストで検証、のサイクル • AIベースの一括変換は使われていない ◦ AIは出力にランダム要素を持ち、決定的な移植に向いていないという見解 ▪ 何もないところに書いていくのではなく、既存のものを守らなければならない ▪ スクリプト作成やレビュー時には補助的に利用されていた シンプルかつ強力な戦術で、着実に進んできた
  18. Compiler APIの今後 39 • ネイティブ実装への移行により、何らかの変化を免れない ◦ StradaのCompiler APIは、内部の関数を自由に触れていた ◦ Corsaでは、バイナリ実行ファイルになるので、公開されたものしか使えない

    [What is the API story for this new codebase? #455 / microsoft/typescript-go] ▪ Go向けのパブリックAPIは今のところ予定なし [Potential Public-Facing Go API for Embedding? #481 / microsoft/typescript-go] • IPCを前提としたAPIの確立が進んでいる ◦ 同一のプロセスから複数のGoランタイムをロードすべきでない(Goの制限) [What is the API story for this new codebase? #455 / microsoft/typescript-go] ▪ 単一のAPIサーバーを起動し、クライアントが複数ぶら下がる形式になる ◦ 標準入出力でやり取りするレイヤーの初期基盤が構築された [Scaffold IPC-based API #711 / microsoft/typescript-go][Announcing TypeScript Native Previews / #API Progress] ▪ 現行のAPI利用例は主に同期的であることをうけ、同期的に使う道具になっている • 新たなAPIには「APIバージョン」の類が設定されることになる見込み [What is the API story for this new codebase? #455 / microsoft/typescript-go] ◦ それが言語バージョンと一致するかどうかは不明、おそらく別軸 ▪ 💭『型チェッカーにとって、後方互換性は絶対』とぶつかるため? 理解可能
  19. Compiler APIの今後、の周辺の話 40 • 言語サービスプラグインの開発はある程度様変わりしそう [What is the API story

    for this new codebase? #455 / microsoft/typescript-go] ◦ .ts, .tsx以外のファイルに型チェックを利かせたい人たちに影響 ◦ 少なくとも現行の内部実装に直接フックする方法は変化する見込み ▪ 📝Writing a Language Service Plugin · microsoft/TypeScript Wiki · GitHub • ts-morphは今後に注意 ◦ Ownerの方は現状 “I don’t think ts-morph will continue to exist” と言っている [ts-morph and Go based native tsc #1621 / dsherret/ts-morph] ▪ 「WASMで動かせるならどうにかなるかもしれないが余力がない」 ▪ 📝GoーWASMビルドは並列化の恩恵がなく、Stradaと同等かやや下の状態 ◦ 💭Strada並行期間はある程度猶予がありそう、使い方によってはCorsaの恩恵が薄れるかも
  20. 得たパフォーマンスバジェットの使い道 41 • 「型の決定的な順序付け」によって旧実装に対し7%のコストが発生 ◦ しかしこれによって並列化がサポートされている • これまで見送ってきたちょっと重い機能や改善(〜2%程度)が導入できるかも • induced

    demand……出来た余裕を使い切らないようバランスは取る • AIと連携したリアルタイムな体験も考えられるだろう • 複雑すぎる型を書いて性能の余裕を使い潰さないでほしい ◦ 再帰限界の緩和なども議論はあるが、この前提がある
  21. 気持ち 42 • 取り組み全体が、いち開発者として印象的 ◦ 「本家本元がやる」だけでは埋まらない不安が「ちゃんと動いてて本当に速い」で吹き飛ぶ ◦ 自動変換→手動修正→テスト、その繰り返し、みたいなやり方は、マジでクール ▪ 完璧じゃなくてもちょうどいい道具をつくって、問題になるところに集中する

    • 別にコンパイラじゃないと出来ない話ではないはず ◦ 複数のチェッカーが多少の重複を許容して並列処理する方針も、興味深いバランス感覚 ▪ 随所でちゃんと計測をしてるような印象はある ◦ 型あってこその「型破り」を実現してる感じがする • コストをかけて取り組みの説明にも臨んでいるのもアツい ◦ 想定される疑問に対する回答は先に出してあって、何度も説明されている ▪ 取り組みに自信を持ち、説明の準備と合わせて発表に踏み切ったのだろうけど ◦ Compiler APIにしろプラグインAPIにしろ一定のハレーションは想像できるが、 気を配ってることはすくなくとも感じられる(当事者がどう感じるかは別の話)
  22. Corsaの成長に期待しましょう 45 2024-09頃 「移植」取り組みの開始 2025-03-11 ネイティブ移植の取り組みを発表 10万行程度が移植済み、型チェック8割、言語サービス着手したばかり 2025-05-24 TSKaigi 2025

    day2 2025-05-23(JST) プレビュー版提供開始 型チェック “done”、JSX、JSDoc対応、言語サービスは補完可能に 25万行中の15万行が移植済み、IPCベースAPIプロトタイプ提供 today! 2025年後半までに主要機能と言語サービス提供目指す (”by October”、とBuildで話していた)
  23. Versioning Roadmap概要 46 • Strada(ストラーダ)……5.x, 6.x, 既存のTypeScript実装の系列 ◦ 十分にCorsaが普及するまでは6.x系も並行して維持される予定 ◦

    5.8……latest ◦ 5.9……もうすぐbetaが出る見込み ◦ 6.0……Corsaに備えた様々なdeprecationとbreaking changeを含む ▪ 並行期間は大きな新機能には慎重になる見込み [TypeScript 5.9 Iteration Plan #61648 / microsoft/TypeScript] • Corsa(コルサ)……7.x, 新しいGo言語による実装 ◦ その時点のStradaと十分同等になった時点で7.0としてリリースされる予定 ◦ 💭6.0がCorsaに備えた変更が入る予定なので、6.0よりは後になりそう?