静的コンパイル
既定の経路です。型と制御フローから証明できる処理をネイティブコードへ変換し、JavaScript エンジンを含めません。
scriptc / zero-runtime TypeScript compiler / native executable
scriptc は、通常の TypeScript を小さなネイティブ実行ファイルへ変換する実験的なコンパイラです。コードに専用アノテーションや別方言を導入せず、TypeScript コンパイラによる型検査を通したあと、型付き IR とネイティブ向けバックエンドへ渡します。
静的に証明できる処理は Node.js、V8、JavaScript エンジンを含まない実行ファイルになります。静的に扱えない箇所は明示的に動的実行へ切り替えるか、診断コードと書き換えの手掛かりを伴って拒否します。
数値はプロジェクト README に掲載された Apple M シリーズ上の測定例です。ワークロード、機能、ビルド条件で変わります。
既定の経路です。型と制御フローから証明できる処理をネイティブコードへ変換し、JavaScript エンジンを含めません。
--dynamic を明示すると、npm パッケージの JavaScript や any の処理を QuickJS ベースの埋め込みエンジンで実行します。静的側へ戻る値は実行時に検証されます。
どちらの経路でも安全に扱えない構文は、コードフレーム、固有の診断コード、多くの場合は書き換え案を示して停止します。
packages/compilerTypeScript API から IR への lowering、IR の検証と直列化、LLVM と C のコード生成を担当します。IR がフロントエンドとバックエンドの唯一の接点です。
packages/runtime参照カウント値、循環回収、スタックフル fiber、イベントループ、ネットワーク、JS 互換の数値整形などを C で提供します。
packages/clibuild、run、coverage を公開し、出力先やバックエンド、動的実行、FFI を制御します。
| 領域 | 代表的な対応 | 実装上の考え方 |
|---|---|---|
| TypeScript | クラス、クロージャ、ジェネリクス、判別可能な Union、例外、分割代入、async / await | TypeScript 自身の型検査と絞り込みを利用し、IR へ lower します。 |
| 標準ライブラリ | String、Array、Map、Set、JSON、Math、TypedArray、Buffer、正規表現 | UTF-16、列挙順、同一性など JavaScript の観測可能な意味を維持します。 |
| Node API | fs、path、process、child_process、crypto、net、http、https、tls、dns、timers | ネイティブ実装を必要な機能単位でリンクします。 |
| Web API | fetch、Streams、Headers、AbortSignal | 同じネイティブのネットワーク / TLS 層を利用し、libcurl には依存しません。 |
| 拡張境界 | comptime、ネイティブ FFI、--dynamic、検証付き cast | ビルド時、C ABI、動的 JS、実行時検証の境界をそれぞれ明示します。 |
npm install -g scriptc
scriptc run fib.ts
scriptc build fib.ts
scriptc coverage app.ts| コマンド | 目的 | 主な出力 |
|---|---|---|
scriptc build file.ts | ネイティブ実行ファイルを作る | .scriptc/<name> と生成した .ll または .c |
scriptc run file.ts | ビルド後、そのまま実行する | 対象プログラムの標準出力・終了コード |
scriptc coverage file.ts | 静的にコンパイルできる割合と阻害要因を調べる | 文単位の集計、診断コード、ブロッカー |
各コーパスを Node と scriptc のネイティブ実行ファイルで動かし、標準出力、標準エラー、終了コードをバイト単位で比較します。サーバー機能は両実装へ同じクライアントを接続して検証します。
同じコーパスを AddressSanitizer と参照カウント監査つきで再実行し、リークや use-after-free をビルド失敗として扱います。
タイミング内部や Error オブジェクトの一部プロパティなど、Node と意図的に異なる箇所は番号を付けて文書化します。
通常レーンと ASan / 参照カウント監査レーンの両方が通ることを変更の出荷条件とし、新機能には Node とネイティブの挙動を固定するコーパスを追加します。
--dynamic で使う埋め込みエンジン