Files
hakorune/docs/private/papers/paper-c-unified-revolution/data/chatgpt5-boxcall-insights.md

5.2 KiB
Raw Blame History

ChatGPT5's BoxCall Revolution Insights

🚀 革新的ポイントLoad/Store削除の意味

従来のVM命令

Load x      // メモリから変数xを読む
Store y, 42 // メモリの変数yに42を書く

Nyash MIR13の革新

BoxCall @x, "get", []      // xもBoxとして扱う
BoxCall @y, "set", [42]    // yへの代入もメッセージ

🎯 "表現は一つ、実行は二態" の具体例

1. スカラ変数の最適化パス

; ソースコード: x = x + 1
; MIR表現統一
%1 = BoxCall %x, "get", []
%2 = BinOp %1, Add, 1  
BoxCall %x, "set", [%2]

; 最適化後(二態実行)
; Case A: エスケープなし → レジスタ化
mov eax, [x_register]
add eax, 1
mov [x_register], eax

; Case B: 監査付き → メッセージ維持
call VarBox_get
add eax, 1
call VarBox_set

2. 配列アクセスの統一

; ソースコード: arr[i] = arr[i] + 1
; MIR表現統一
%elem = BoxCall %arr, "get", [%i]
%new = BinOp %elem, Add, 1
BoxCall %arr, "set", [%i, %new]

; 最適化後bounds check統合
cmp i, arr.length
jae slow_path
mov eax, [arr.data + i*4]
add eax, 1
mov [arr.data + i*4], eax

📊 性能目標と測定計画

Benchmark 1: スカラ変数ループ

// bench_scalar_loop.nyash
static box ScalarBench {
    main() {
        local x = 0
        local iterations = 100_000_000
        
        local start = Time.now()
        loop(x < iterations) {
            x = x + 1  // BoxCall化されるが最適化でレジスタに
        }
        local elapsed = Time.now() - start
        
        console.log("Scalar loop: " + elapsed + "ms")
        console.log("ops/sec: " + (iterations / (elapsed / 1000)))
    }
}

目標: 従来Load/Store実装の±5%以内

Benchmark 2: 配列連続アクセス

// bench_array_sum.nyash
static box ArrayBench {
    main() {
        local arr = new ArrayBox()
        local size = 10_000_000
        
        // 初期化
        loop(i < size) {
            arr.push(i)
        }
        
        // 連続読み込み
        local sum = 0
        local start = Time.now()
        loop(i < size) {
            sum = sum + arr.get(i)  // bounds check最適化対象
        }
        local elapsed = Time.now() - start
        
        console.log("Array sum: " + elapsed + "ms")
        console.log("Elements/sec: " + (size / (elapsed / 1000)))
    }
}

最適化ポイント:

  • bounds checkのループ外移動
  • 連続アクセスパターンの認識
  • SIMD化の可能性

Benchmark 3: 監査付き変数

// bench_audited_var.nyash
static box AuditedBench {
    main() {
        // 監査付き変数(フック可能)
        local x = new VarBox(0)
        x.onSet = function(old, new) {
            // 変更通知(本番では軽量化)
        }
        
        local iterations = 10_000_000
        local start = Time.now()
        
        loop(i < iterations) {
            x.set(x.get() + 1)
        }
        
        local elapsed = Time.now() - start
        console.log("Audited var: " + elapsed + "ms")
    }
}

目標: オーバーヘッド < 5ns/操作

🔬 PICPolymorphic Inline Cache統計

収集すべきデータ

// pic_stats.nyash
static box PICStats {
    main() {
        // VMから統計取得
        local stats = VM.getPICStatistics()
        
        console.log("=== PIC Statistics ===")
        console.log("Total sites: " + stats.totalSites)
        console.log("Monomorphic: " + stats.mono + " (" + 
                   (stats.mono * 100 / stats.total) + "%)")
        console.log("Polymorphic: " + stats.poly)
        console.log("Megamorphic: " + stats.mega)
        
        // ホットサイトの詳細
        for site in stats.hotSites {
            console.log("Site " + site.id + ": " + 
                       site.types.length + " types, " +
                       site.hits + " hits")
        }
    }
}

目標: 単相率 > 80%(ホットサイト)

🏗️ Lower実装の段階的アプローチ

Phase 1: 基本スカラ最適化

  • CellBox副作用なしの識別
  • エスケープ解析
  • レジスタ割り当て

Phase 2: 配列最適化

  • TypedArrayの型特殊化
  • bounds check除去
  • ベクトル化準備

Phase 3: 監査システム

  • 軽量フックメカニズム
  • JIT時の条件付きコード生成
  • プロファイルベース最適化

Phase 4: 完全統合

  • PIC + Lower協調
  • インライン化
  • 最終的な機械語生成

💡 革新性の証明ポイント

  1. 統一性がもたらす簡潔さ

    • パーサー: 変数もBoxCallとして扱うだけ
    • 最適化: 1種類の変換ルール
    • デバッグ: 統一的なトレース
  2. 性能ペナルティなし

    • スカラ: レジスタ化で従来同等
    • 配列: bounds除去で高速化
    • オブジェクト: PICで直接呼び出し
  3. 拡張性の確保

    • 監査: 必要時のみフック
    • トランザクション: BoxCallに統合
    • 並行性: Barrier命令で制御

🎯 最終目標

「Everything is Box, Everything is Message」を貫きながら、 実行時は「Everything is Optimized」を実現する。

これがNyash MIR13 + BoxCall統一アーキテクチャの真髄。