Slide 1

Slide 1 text

Rust製TypeScriptコンパイラ stcの現状と今後 2023/2/28 node学園41時限目 LT @togami2864

Slide 2

Slide 2 text

$WHOAMI ● インターン@plaid ○ SQLをRustでいい感じにする ● Student@Chuo univ. ● 4月から別会社で新卒Frontend Engineer @togami2864

Slide 3

Slide 3 text

話すこと ● そもそもstcとは? ● 今どんな状況? ● Weekly report(status)の読み方 ● これからの計画は? 話さないこと ● Rust周りの技術的な詳細 ● TypeScript型システムに関する詳細

Slide 4

Slide 4 text

STC(Speedy TypeScript Compiler)とは ● SWCの作者@kdy1氏が開発しているRust製TypeScriptコンパイラ ○ 正真正銘型チェックができる ■ swcは単にTSの型注釈を落とすだけだった ○ 2022年10月にオープンソース化。現在鋭意開発中 ● tsc互換な代替 & 高速化を目指す ○ Rust製 ○ Parallelに解析 ■ 一応tscにもworker_threadを使ったコンパイルのissueは立っている ● https://github.com/microsoft/TypeScript/issues/30235

Slide 5

Slide 5 text

他言語によるrewriteの難しさ 1. Specがない ● PRから読み解く(多くは@ahejlsberg氏のもの。めっちゃPRに説明書いてる) ● Release note ● Testケースから推測 ● tscのソースコード・コメントを読む 2. tsc自体のソースコードが複雑 ● checker.tsだけで約2.6MBあるのは有名(github上で表示できない) ● 10年くらい開発されている

Slide 6

Slide 6 text

stcの現状 ● TypeScript4.9とそのブランチのconformance testsを元に開発 ○ 多数のfalse-positive, false-negativeが存在 ■ class構文周りやthisが絡むケースに結構多い ■ ただしエッジケースも大量に含まれる ● 主要な構文や演算子はほぼ動く ○ Satisfies operator ○ Generics ○ Conditional type ○ Mapped Typesなど...

Slide 7

Slide 7 text

本当に早いの? ● 正確なベンチマークがまだ行われていないのでなんとも言えない ○ csstype(約2万行の型定義ファイル)の解析結果が従来の約57倍と報告 ■ https://twitter.com/atris_eth/status/1618376775956037632 ○ ↑はあくまで個人のマシンによる参考記録であることに注意 ○ こうご期待

Slide 8

Slide 8 text

Statusを読む ● 毎週日曜日にhttps://stc.dudy.dev/で進捗が更新される ● “npx tsc --noEmit --lib es2020” とstcの出力結果を比較することで算出

Slide 9

Slide 9 text

● Matched ○ tscでもstcでもエラーが正しく出ている状態。 増やしたい値 ● Bad(required) ○ tscでは出てるがstcでは出ていないエラーの数 (false-negative)。減らしたい値 ● Bad(excess) ○ tscでは出ないがstcでは出ているエラーの数 (false-positive)。最優先で減らしたい値 ● Bad(panic) ○ panicするテストファイルの数。減らしたい値

Slide 10

Slide 10 text

直近の目標 ● アルファ版としてLanguage Serverの公開を目指す ○ ちなみに今ほとんど手はつけられていない ● false-positiveを減らす(最優先) ● ダウンロード数の多い@typesパッケージを解析できるようにする ○ @types/node ○ @types/reactなど ○ めちゃくちゃ不安定 ■ 量が多くデバッグが大変 ■ namespaceが多い

Slide 11

Slide 11 text

stcのこれから ● 本家tscの挙動を仕様として追従 ● false-positive, false-negativeを限りなく少なく ● Language Server リリース・安定化 ● 現状で決まっていることは少ない

Slide 12

Slide 12 text

独自でTypeScriptの構文を拡張する可能性は? ● (私見ですが)@kdy1氏が関わっている限り可能性は低い ○ 標準順守の意識が強い ○ BunのJSXに対する構文拡張にかなり難色を示していた ■ https://twitter.com/kdy1dev/status/1609013152590725120 ○ swcはESM->cjs変換も最終的に標準順守を選んだ(workaroundな処理をrevert) ■ jest.mock of ESM should fail, and it’s correct. ● https://github.com/swc-project/swc/issues/5205 ● ただしエラーメッセージの改善などはあるかも ○ tscのエラーのわかりにくさには度々言及している

Slide 13

Slide 13 text

● Financial support ○ Open Collective(stc) ■ https://opencollective.com/stc ○ Github sponsors ■ @kdy1: https://github.com/sponsors/kdy1 ■ stc: https://github.com/sponsors/dudykr ● Contributing ○ https://github.com/dudykr/stc Support

Slide 14

Slide 14 text

References ● stc ○ https://stc.dudy.dev/ ○ https://github.com/dudykr/stc ● TypeScript ○ https://github.com/microsoft/TypeScript ● Rewriting TypeScript in Rust? You’d have to be(@kdy1へのインタビュー) ○ https://www.totaltypescript.com/rewriting-typescript-in-rust