概要
scriptc は、TypeScriptコードを ネイティブ実行ファイル に直接コンパイルするツール。 Node.jsやV8 などのランタイム不要で、 高速・小型バイナリ を生成。 コード変更や独自記法は不要で、既存のTypeScriptと完全互換。 静的解析で99% 以上のコードをネイティブ化し、残りは明確な診断付きで処理。 幅広い標準・Node APIをサポートし、 パフォーマンスと互換性 を両立。
scriptcの特徴
- TypeScriptをそのまま ネイティブバイナリに変換
- NodeやV8 などのJavaScriptエンジン不要
- コード変更やアノテーション不要、既存のTypeScriptで動作
- 高速な起動時間 (約2ms)、小型バイナリ(170〜200KB)
- 静的解析 による高いネイティブ化率(99%以上)
- 標準ライブラリやNode API の広範なサポート
- fs、path、process、crypto、http/https、zlib、timers、net、fetchなど
- npm依存パッケージ にも対応(--dynamicオプション)
- 型安全性 と メモリ安全性 を重視した設計
- 差分テスト と アドレスサニタイザ による品質保証
インストールと環境
- npm によるグローバルインストール
npm install -g scriptc
- clang 必須(macOSはXcode Command Line Toolsに同梱)
- macOS arm64 が主プラットフォーム
- Linux/Windowsもクロスコンパイルで対応
- tsconfig.json や @types/node も利用可能
静的/動的/拒否の3段階判定
- 静的コンパイル :デフォルト。ネイティブコードのみで実行
- 動的実行(--dynamic) :QuickJSエンジンを埋め込み、静的化できない部分のみ実行
- npm依存やany型など、動的要素もサポート
- 静的⇔動的間の値は 型チェック を厳格に実施
- 拒否 :未対応構文は明確なエラーとヒントを出力
サポートされるTypeScript・標準API
- クラス、継承、クロージャ、ジェネリクス、分岐型、async/await、例外、デストラクチャリング など
- UTF-16文字列、配列、Map/Set、JSON、Math、Buffer、Error階層 など
- Node API :fs、path、process、child_process、os、crypto、url、zlib、timers、net、http、https、tls、dgram、dns、fs.watch、readline
- WHATWG fetch/Web API :fetch、Streams、Headers、AbortSignalなど
- npm依存 :--dynamic時に埋め込み、ビルド時にバイナリ化
パフォーマンス比較(Apple Mシリーズ)
- 起動時間 :~2.4ms(Nodeは~47ms、Zig並み、Go/Rustより高速)
- バイナリサイズ :170–200KB(--dynamic時は~3MB、Node SEAは60–100MB)
- メモリ使用量 :1–4MB(Nodeは67–116MB)
- 数値演算 :JS完全互換、Nodeとバイト単位で一致
安全性・正確性の担保
- 差分テスト :800以上のテストケースでNodeとバイナリ出力を比較
- メモリ安全 :AddressSanitizerによる全ケース検証
- 意図的なNodeとの差異 は全てドキュメント化
エスケープハッチ・拡張
- comptime :ビルド時にTypeScriptをVMで実行し、結果をリテラルとして埋め込み
- Native FFI(--ffi) :TypeScript型宣言でC ABIに直接バインド
- --dynamic :npm依存や動的コードもサポート
- Checked casts :JSON.parseなどの型アサーションもランタイムで検証
アーキテクチャ概要
- TypeScript → tsc(パース・型チェック) → IR → C → clang → ネイティブ実行ファイル
- Cランタイム :参照カウント付き値、イベントループ、サーバースタック、数値演算
- 機能単位でリンク :必要な機能のみバイナリに含める設計
開発・テストフロー
- pnpm による開発・ビルド・テスト
pnpm install && pnpm buildpnpm test(差分テスト・診断スナップショット)SCRIPTC_SAN=1 pnpm test(ASan+参照カウント監査)
- IRやC出力 もオプションで取得可能(
--emit-ir)
まとめ
- Node互換のTypeScriptコード を 高速・安全なネイティブバイナリ に変換可能
- 静的解析と厳格なテスト による高い信頼性
- 幅広いAPIサポート と npm依存対応 で実用的なアプリケーション開発が可能