Slide 1

Slide 1 text

TypeScript ネイティブ移植観察レポート TSKaigi 2025 berlysia 2025-05-24 TSKaigi公式スライドテンプレート“Type Puzzle” v1.0

Slide 2

Slide 2 text

誰 ● berlysia ○ べるりしあ、と読む ● TSKaigi 2025のトーク周りを統括 ● Webフロントエンドの民 ○ 縦書きCSSなど ● ドワンゴ教育事業 ○ Webフロントエンドをやる ○ Webフロントエンドのためのことをやる ● 書いてあることをよく読む方のオタク ○ 助走をつけて飛躍するのも楽しいけど ○ それは地に足の着いた前提があるからだよね 2

Slide 3

Slide 3 text

2.5か月前のこと

Slide 4

Slide 4 text

4 ウキウキで締切の告知をしていた

Slide 5

Slide 5 text

CfP締切4日後のこと

Slide 6

Slide 6 text

6 激アツのお知らせ https://devblogs.microsoft.com/typescript/typescript-native-port/

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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 ❗

Slide 9

Slide 9 text

2025-05-23 00:00 JST

Slide 10

Slide 10 text

10 シアトル時間22日朝8時のアナウンス https://devblogs.microsoft.com/typescript/announcing-typescript-native-previews/

Slide 11

Slide 11 text

11 シアトル時間22日朝8時半からのトーク https://build.microsoft.com/en-US/sessions/BRK116

Slide 12

Slide 12 text

なるほど 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

Slide 13

Slide 13 text

なるほど 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!

Slide 14

Slide 14 text

プレビューはもう試しましたか?

Slide 15

Slide 15 text

15 試す人向け:READMEを読む 対応状況がREADMEにまとまっているのでよく見る https://github.com/microsoft/typescript-go?tab=readme-ov-file#what-works-so-far

Slide 16

Slide 16 text

16 試す人向け:エラーコードを見る エラーコードにも情報が出てるので、落ちる人は見ておく internal/execute/system.go#L22-L31

Slide 17

Slide 17 text

プレビュー版所感 ● 未実装で落ちてるのに気づきにくい ○ エラーコードに注目するとよい ○ 変なところがあったらREADMEもみたほうがよい ● 本当にそのまま動く、マジで動く ○ プライベートの最近目をかけてるコードは未実装部以外全部動いた ■ 挙動の違いっぽいものを見つけたのでこれが終わったら報告するんだ…… ● 大規模になればなるほど、速さが際立つ ○ でかいやつは本当に10分の1で終わった ○ Language Serverもかなり高速なので、未実装が気にならなければアリ 17

Slide 18

Slide 18 text

TypeScript ネイティブ移植観察レポート TSKaigi 2025 berlysia 2025-05-24 TSKaigi公式スライドテンプレート“Type Puzzle” v1.0

Slide 19

Slide 19 text

おことわり ● ただの観察者として調査しました ○ 内情は一切わかりません ○ 内緒で何かを聞いていたりはしません ■ 聞いてたらこんなタイミングでこんな話を用意してるわけないだろ ● 公開情報だけを参照して構成されています ○ みなさんも気合いを入れれば同等以上のことを調べられます ○ 情報の探索にはChatGPTやNotebookLMを活用しています ● できるだけ元の記述・発言への参照を示します ○ 一次ソースを大事にするタイプの人としてがんばります ○ 翻訳や画面の都合で「ざっくり」する部分はご容赦ください ○ が、直近出てきたソースがだいたい話題にしていたので、省略している箇所も多い ● 目指すこと→面白いところを紹介するから興味があったら調べてね! 19

Slide 20

Slide 20 text

このトークのソース 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

Slide 21

Slide 21 text

このトークのソース 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 ○ 大抵の細かい話題はこれ見ればソースになると思います

Slide 22

Slide 22 text

呼び名が必要ですね 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は、速いんだということです

Slide 23

Slide 23 text

23 「10倍速いTypeScript」 https://devblogs.microsoft.com/typescript/typescript-native-port/

Slide 24

Slide 24 text

24 どこが10倍速くなるか TypeScript Source code TypeScript Compiler ココ!→ JavaScript Source code TypeCheck Result valid / error

Slide 25

Slide 25 text

なぜネイティブ実装に移行するのか 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~)]

Slide 26

Slide 26 text

JavaScript実装の限界を超える手段 Go言語への「移植」

Slide 27

Slide 27 text

27 「移植」のイメージをつかむスクリーンショット [A 10x faster TypeScript (04:45~)]

Slide 28

Slide 28 text

28 「移植」のイメージをつかむスクリーンショット [A 10x faster TypeScript (04:45~)] 関数から関数へ、1:1対応レベルの「移植」

Slide 29

Slide 29 text

なぜ「移植」が選ばれたか 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~)] ○ 「それが古いバージョンを永遠にメンテしなくて済む唯一の方法」

Slide 30

Slide 30 text

なぜGo言語なのか 30 関数+データ構造での手続き的な実装スタイルとの親和性 ガベージコレクションを持ち、循環参照を自然に扱える 共有メモリを用いた並列処理が自然にできる クロスプラットフォームにネイティブコードで動作する 全てをバランスよく満たすのがGo。どの出典でもほぼ同じことを言っているので省略 checker.tsはスコープ共有した関数の塊、分割できずに5万行 TSのASTは親への参照を持ち、高度に活用されていて不可分 JSのWorker+SharedArrayBufferでは余計にコストかかる ネイティブファーストに作られていて、十分成熟していてほしい

Slide 31

Slide 31 text

31 そりゃこういうスタイルもとりたくなるよね [A 10x faster TypeScript (04:45~)] 関数から関数へ、1:1対応レベルの「移植」

Slide 32

Slide 32 text

ものの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で話していた)

Slide 33

Slide 33 text

いくつかの疑問 33 どれくらい速く・効率よくなったのか、それはどうしてか? 9ヶ月で15万行の移植、いったいどんなやり方で? “10x” なのはわかるけど、一体何をどうやった? Go言語移植職人の朝は早いかもしれない Go言語への移行 高い互換性はどのようにして・どれくらい維持されている? 「移植」といったって違いはさまざまに生まれるはずだ 互換性の追求 驚くべきスピード

Slide 34

Slide 34 text

“10x Faster” の内訳 34 ネイティブ化 3x~3.5x 並列処理 3x~3.5x (3x~4xとも) [大抵この主旨の説明がある、最新はMicrosoft Buildのトーク]

Slide 35

Slide 35 text

ネイティブ化による高速化要素 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のスライスを使った部分文字列表現は、メモリの割り当てが発生しない

Slide 36

Slide 36 text

並列処理による高速化要素 36 ネイティブ化 3x~3.5x 並列処理 3x~3.5x (3x~4xとも) ● ファイルごとに独立処理可能な部分を積極的に並列化 ○ パース、バインドまではGoroutineを使って一斉に処理し、ASTとスコープ情報を得る ■ Goランタイムのスケジューラによって、CPU数に対して線形スケール ● 型チェッカーはプロジェクトを4分割して並列処理 ○ 割り当て範囲のファイルを型チェック、共通・グローバルな型は重複するが、メリットが大きい ■ ASTとスコープをimmutableに扱い、ロックなしで処理できる ○ 型チェック結果を決定的にするために4分割で固定されている ■ 将来的にはオプションで可変になるかもしれない

Slide 37

Slide 37 text

互換性の追求 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見るのがおすすめ

Slide 38

Slide 38 text

驚くべき開発スピードの背景 38 ● Stradaの開発に関わってきた人が、Corsaにも関わっている ○ 移植専任を置いたりしていない。TypeScriptに詳しい開発者が移植に携わる ● 「移植」を支援する、TypeScriptからGoへの構文変換ツールが存在 ○ TypeScriptのASTからGoの構文に決定的に変換 ■ ユニオン型やオプショナルプロパティなど、Goにはない要素はエラーになる状態 ○ 自動変換→人の手を介して細部を修正→テストで検証、のサイクル ● AIベースの一括変換は使われていない ○ AIは出力にランダム要素を持ち、決定的な移植に向いていないという見解 ■ 何もないところに書いていくのではなく、既存のものを守らなければならない ■ スクリプト作成やレビュー時には補助的に利用されていた シンプルかつ強力な戦術で、着実に進んできた

Slide 39

Slide 39 text

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] ○ それが言語バージョンと一致するかどうかは不明、おそらく別軸 ■ 💭『型チェッカーにとって、後方互換性は絶対』とぶつかるため? 理解可能

Slide 40

Slide 40 text

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の恩恵が薄れるかも

Slide 41

Slide 41 text

得たパフォーマンスバジェットの使い道 41 ● 「型の決定的な順序付け」によって旧実装に対し7%のコストが発生 ○ しかしこれによって並列化がサポートされている ● これまで見送ってきたちょっと重い機能や改善(〜2%程度)が導入できるかも ● induced demand……出来た余裕を使い切らないようバランスは取る ● AIと連携したリアルタイムな体験も考えられるだろう ● 複雑すぎる型を書いて性能の余裕を使い潰さないでほしい ○ 再帰限界の緩和なども議論はあるが、この前提がある

Slide 42

Slide 42 text

気持ち 42 ● 取り組み全体が、いち開発者として印象的 ○ 「本家本元がやる」だけでは埋まらない不安が「ちゃんと動いてて本当に速い」で吹き飛ぶ ○ 自動変換→手動修正→テスト、その繰り返し、みたいなやり方は、マジでクール ■ 完璧じゃなくてもちょうどいい道具をつくって、問題になるところに集中する ● 別にコンパイラじゃないと出来ない話ではないはず ○ 複数のチェッカーが多少の重複を許容して並列処理する方針も、興味深いバランス感覚 ■ 随所でちゃんと計測をしてるような印象はある ○ 型あってこその「型破り」を実現してる感じがする ● コストをかけて取り組みの説明にも臨んでいるのもアツい ○ 想定される疑問に対する回答は先に出してあって、何度も説明されている ■ 取り組みに自信を持ち、説明の準備と合わせて発表に踏み切ったのだろうけど ○ Compiler APIにしろプラグインAPIにしろ一定のハレーションは想像できるが、 気を配ってることはすくなくとも感じられる(当事者がどう感じるかは別の話)

Slide 43

Slide 43 text

43 使ってみよう、フィードバックをしよう https://devblogs.microsoft.com/typescript/announcing-typescript-native-previews/

Slide 44

Slide 44 text

44 毎日publishされ、今後も告知があるとのこと https://devblogs.microsoft.com/typescript/announcing-typescript-native-previews/

Slide 45

Slide 45 text

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で話していた)

Slide 46

Slide 46 text

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よりは後になりそう?

Slide 47

Slide 47 text

No content