Vercel、OSS の TypeScript ネイティブコンパイラ「scriptc」を公開──C言語変換でバイナリサイズを 170KB に削減
TypeScript コードを型付き中間表現経由で C 言語に変換し clang でコンパイルすることで、Node.js ランタイム不要の高速な単一バイナリを生成する。
リリース: 2024-01-01 · 読了 3 分記事の要約
1. 核心(What)
- VercelはTypeScriptコードをC言語のコードに変換し、Cコンパイラのclangでネイティブバイナリにコンパイルする「scriptc」をオープンソースで公開した。
- fs、path、http/https、cryptoなどの主要なNode.js APIや標準ライブラリの機能と同等のものをネイティブバイナリに組み込んでいる。
- npmパッケージの依存性はNode.jsと同じアルゴリズムで解決され、必要に応じてクイックなJavaScriptエンジンであるquickjs-ngの組み込みを指定できる。
- 対象のTypeScriptコードがコンパイル可能かチェックし、ブロッカーを出力する診断機能を備えている。
2. 影響(Why)
- ランタイム依存ゼロの超軽量化: 従来のランタイム同梱型ツールと異なり、仮想マシンを含まない純粋なネイティブコードにコンパイルするため、バイナリサイズを数MB以下に抑えられる。
- コールドスタートの劇的改善: 起動時間が47ミリ秒から2.4ミリ秒以下に短縮されるため、API Gatewayやエッジワーカーなどミリ秒単位のレイテンシが要求される環境で有利になる。
3. 根拠・詳細(How)
- 型付き中間表現(Typed IR)への変換: TypeScriptコードを一度型付きの中間表現(Typed IR)へ落とし込んだ上で、clangを利用して最適化されたCコード経由でバイナリを生成する。
- quickjs-ngによるコード埋め込み: JavaScriptコードの埋め込みが必要なケースでは、620KB以下のコンパクトなJavaScriptエンジンであるquickjs-ngを明示的に組み込める。
4. 展望・課題(Next)
- 対応APIの拡充とエコシステムの検証: Node.jsの全APIや複雑な外部npmパッケージに対するコンパイル互換性の検証と、実際のプロダクション環境での安定稼働テストが進められる。