Node学園 41時限目 LT https://nodejs.connpass.com/event/275061/
- github: https://github.com/dudykr/stc/issues - stc: https://stc.dudy.dev/ - interview: https://www.totaltypescript.com/rewriting-typescript-in-rust
Rust製TypeScriptコンパイラstcの現状と今後2023/2/28 node学園41時限目 LT@togami2864
View Slide
$WHOAMI● インターン@plaid○ SQLをRustでいい感じにする● [email protected] univ.● 4月から別会社で新卒Frontend Engineer@togami2864
話すこと● そもそもstcとは?● 今どんな状況?● Weekly report(status)の読み方● これからの計画は?話さないこと● Rust周りの技術的な詳細● TypeScript型システムに関する詳細
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
他言語によるrewriteの難しさ1. Specがない● PRから読み解く(多くは@ahejlsberg氏のもの。めっちゃPRに説明書いてる)● Release note● Testケースから推測● tscのソースコード・コメントを読む2. tsc自体のソースコードが複雑● checker.tsだけで約2.6MBあるのは有名(github上で表示できない)● 10年くらい開発されている
stcの現状● TypeScript4.9とそのブランチのconformance testsを元に開発○ 多数のfalse-positive, false-negativeが存在■ class構文周りやthisが絡むケースに結構多い■ ただしエッジケースも大量に含まれる● 主要な構文や演算子はほぼ動く○ Satisfies operator○ Generics○ Conditional type○ Mapped Typesなど...
本当に早いの?● 正確なベンチマークがまだ行われていないのでなんとも言えない○ csstype(約2万行の型定義ファイル)の解析結果が従来の約57倍と報告■ https://twitter.com/atris_eth/status/1618376775956037632○ ↑はあくまで個人のマシンによる参考記録であることに注意○ こうご期待
Statusを読む● 毎週日曜日にhttps://stc.dudy.dev/で進捗が更新される● “npx tsc --noEmit --lib es2020” とstcの出力結果を比較することで算出
● Matched○ tscでもstcでもエラーが正しく出ている状態。 増やしたい値● Bad(required)○ tscでは出てるがstcでは出ていないエラーの数 (false-negative)。減らしたい値● Bad(excess)○ tscでは出ないがstcでは出ているエラーの数 (false-positive)。最優先で減らしたい値● Bad(panic)○ panicするテストファイルの数。減らしたい値
直近の目標● アルファ版としてLanguage Serverの公開を目指す○ ちなみに今ほとんど手はつけられていない● false-positiveを減らす(最優先)● ダウンロード数の多い@typesパッケージを解析できるようにする○ @types/node○ @types/reactなど○ めちゃくちゃ不安定■ 量が多くデバッグが大変■ namespaceが多い
stcのこれから● 本家tscの挙動を仕様として追従● false-positive, false-negativeを限りなく少なく● Language Server リリース・安定化● 現状で決まっていることは少ない
独自で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のエラーのわかりにくさには度々言及している
● 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/stcSupport
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