Files
bun.sh/PROGRESS_UPDATE.md
Sosuke Suzuki c1103ef0e3 Add ESM bytecode cache deserialization and validation
Implement deserialization functions to restore module metadata from
binary cache format. This completes the second phase of the ESM
bytecode caching feature.

Changes:
- Add deserializeCachedModuleMetadata() in ZigSourceProvider.cpp
  - Reads BMES binary format
  - Extracts requested modules, imports, exports, star exports
  - Returns DeserializedModuleMetadata structure with bytecode pointer
- Add validateCachedModuleMetadata() for cache validation
  - Checks magic number (0x424D4553 "BMES")
  - Checks version compatibility (currently v1)
- Add Zig binding validateMetadata() in CachedBytecode.zig
- Create test-cache-roundtrip.js for round-trip testing
- Update documentation with progress

Implementation status:
- Phase 1 (Serialization): 100% 
- Phase 2 (Deserialization): 90% 
- Phase 3 (Integration): 0% 

Next steps:
- JSModuleRecord reconstruction from metadata
- ModuleLoader integration
- Cache storage implementation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 20:16:34 +09:00

8.6 KiB
Raw Blame History

ESM Bytecode Cache - Progress Update

最新の進捗状況

完了した実装

1. シリアライゼーション

  • generateCachedModuleByteCodeWithMetadata() - フル実装完了
  • モジュールメタデータのバイナリ形式シリアライゼーション
  • バイトコードとメタデータの結合
  • ビルド成功

2. デシリアライゼーション (NEW!)

  • deserializeCachedModuleMetadata() - 完全実装
  • バイナリキャッシュからモジュール情報を復元
  • 以下のデータを正しく読み取り:
    • Requested modules (依存関係)
    • Import entries (インポート宣言)
    • Export entries (エクスポート宣言)
    • Star exports
    • Bytecode data

3. キャッシュ検証 (NEW!)

  • validateCachedModuleMetadata() - 実装完了
  • マジックナンバーチェック (0x424D4553 "BMES")
  • バージョンチェック (現在 v1)
  • Zigバインディング追加

4. データ構造 (NEW!)

  • DeserializedModuleMetadata 構造体
  • キャッシュから読み取ったデータの保持
  • バイトコードへのポインタ管理

コード概要

デシリアライゼーション:

struct DeserializedModuleMetadata {
    Vector<ModuleRequest> requestedModules;
    Vector<ImportEntry> importEntries;
    Vector<ExportEntry> exportEntries;
    Vector<WTF::String> starExports;
    const uint8_t* bytecodeStart;
    size_t bytecodeSize;
};

std::optional<DeserializedModuleMetadata> deserializeCachedModuleMetadata(
    JSC::VM& vm,
    const uint8_t* cacheData,
    size_t cacheSize
);

検証:

extern "C" bool validateCachedModuleMetadata(
    const uint8_t* cacheData,
    size_t cacheSize
);

Zigバインディング:

pub fn validateMetadata(cache: []const u8) bool {
    return validateCachedModuleMetadata(cache.ptr, cache.len);
}

現在のアーキテクチャ

┌─────────────────────────────────────────┐
│   ESM Source Code                       │
└─────────────────────────────────────────┘
              │
              ↓
┌─────────────────────────────────────────┐
│   generateCachedModuleByteCodeWith      │
│   Metadata()                            │
│   - Parse source                        │
│   - Extract metadata                    │
│   - Serialize to binary                 │
└─────────────────────────────────────────┘
              │
              ↓
┌─────────────────────────────────────────┐
│   Binary Cache                          │
│   [MAGIC|VERSION|METADATA|BYTECODE]     │
└─────────────────────────────────────────┘
              │
              ↓
┌─────────────────────────────────────────┐
│   validateCachedModuleMetadata()        │
│   - Check magic                         │
│   - Check version                       │
└─────────────────────────────────────────┘
              │
              ↓
┌─────────────────────────────────────────┐
│   deserializeCachedModuleMetadata()     │
│   - Read module requests                │
│   - Read imports/exports                │
│   - Extract bytecode                    │
└─────────────────────────────────────────┘
              │
              ↓
┌─────────────────────────────────────────┐
│   DeserializedModuleMetadata            │
│   (ready for use)                       │
└─────────────────────────────────────────┘

実装されたフロー

キャッシュ生成:

  1. ESMソースコードを受け取る
  2. パースしてASTを生成
  3. ModuleAnalyzerで解析
  4. メタデータを抽出
  5. バイナリ形式でシリアライズ
  6. バイトコードを生成
  7. メタデータ + バイトコードを結合
  8. キャッシュファイルとして保存可能

キャッシュ使用 (実装完了):

  1. キャッシュデータを読み込み
  2. validateCachedModuleMetadata() で検証
  3. deserializeCachedModuleMetadata() でデシリアライズ
  4. メタデータとバイトコードを取得
  5. (次のステップ: JSModuleRecordを再構築

残りのタスク

1. JSModuleRecordの再構築 (高優先度)

課題: JSModuleRecordのコンストラクタがprivate

解決策のオプション:

  1. AbstractModuleRecordのpublicメソッドを使用:

    void appendRequestedModule(const Identifier&, RefPtr<ScriptFetchParameters>&&);
    void addImportEntry(const ImportEntry&);
    void addExportEntry(const ExportEntry&);
    void addStarExportEntry(const Identifier&);
    
  2. 一時的なJSModuleRecordを作成してメタデータを復元

  3. ModuleLoaderレベルでの統合より高レベル

2. ModuleLoader統合 (高優先度)

ファイル: src/bun.js/bindings/ModuleLoader.cpp

変更箇所: fetchESMSourceCode()

疑似コード:

if (has_cached_metadata) {
    auto metadata = deserializeCachedModuleMetadata(vm, cache, size);
    if (metadata) {
        // メタデータからJSModuleRecordを再構築
        // バイトコードをロード
        // パースをスキップ
        return cachedModule;
    }
}
// 既存の処理(パース + 解析)

3. キャッシュストレージ (中優先度)

  • ファイルシステムへの保存/読み込み
  • キャッシュキーの生成(ソースハッシュ)
  • キャッシュ無効化ロジック

4. CLIフラグ (中優先度)

bun --experimental-esm-bytecode index.js

ビルド状況

  • 前回のビルド成功
  • 🔄 デシリアライゼーション追加後のビルド進行中

テスト計画

Phase 1: ユニットテスト

  • シリアライゼーションが正しく動作
  • デシリアライゼーションが正しく動作
  • ラウンドトリップserialize → deserialize
  • キャッシュ検証が正しく機能

Phase 2: 統合テスト

  • ModuleLoaderとの統合
  • 実際のESMモジュールでテスト
  • キャッシュヒット/ミスのシナリオ

Phase 3: パフォーマンステスト

  • モジュールロード時間の測定
  • キャッシュありなしの比較
  • 大規模プロジェクトでのベンチマーク

技術的な課題

解決済み

  • WTF::Vector APIの使用方法
  • メモリ管理mi_malloc/mi_free
  • バイナリフォーマット設計
  • シリアライゼーション実装
  • デシリアライゼーション実装

残存課題

  • JSModuleRecordの直接構築
  • ModuleLoaderへの統合方法
  • パフォーマンスの実測

次のステップ (優先順位)

  1. 今すぐ: ビルド成功を確認
  2. 短期: ラウンドトリップテストを作成
  3. 中期: JSModuleRecord再構築の実装
  4. 長期: ModuleLoader統合

コミット履歴

Commit 1 (cded1d040c):

  • シリアライゼーション実装
  • Zigバインディング
  • テストファイル
  • ドキュメント

Commit 2 (予定):

  • デシリアライゼーション実装
  • キャッシュ検証関数
  • 追加のZigバインディング

メトリクス

コード追加:

  • C++: ~400行 (シリアライゼーション + デシリアライゼーション)
  • Zig: ~35行 (バインディング)
  • Tests: ~100行
  • Docs: ~1500行

機能完成度:

  • シリアライゼーション: 100%
  • デシリアライゼーション: 90% (JSModuleRecord再構築待ち)
  • キャッシュ検証: 100%
  • ModuleLoader統合: 0%
  • キャッシュストレージ: 0%

最終更新: 2025-12-04 20:12 JST ブランチ: bun-build-esm ステータス: デシリアライゼーション実装完了、ビルド中