Files
hakorune/docs/private/ideas/other/archived/2025-08-27-sync-box-automatic-locking.md

4.6 KiB
Raw Blame History

Sync自動ロック設計 - ChatGPT5 Proの革命的提案

作成日: 2025-08-27

🎯 核心:「多重箱」問題の完全解決

従来の問題

// MutexBox<Map>という「箱の中に箱」構造が重い
init { MutexBox<Map<str,Bytes>> table }
with table.lock as m {  // 面倒なガード構文
    m.put(k, v)
}

新提案

init { Sync<Map<str,Bytes>> table }  // 一体型Box
table.put(k, v)                      // これだけ!自動ロック

📦 Syncの設計思想

1. ロックが埋め込まれたBox

  • Sync<T>自体が単一のBox多重箱ではない
  • 内部にRwLock相当の同期機構を内蔵
  • APIからは通常のBoxと同じに見える

2. メソッドプロキシによる自動ロック

// ユーザーが書くコード
table.put(k, v)

// 内部で起きること
1. write効果を検出 → 排他ロック取得
2. 内部のMap.put(k,v)を呼び出し
3. ロック解放
// すべて単一メソッド呼び出し内で完結!

3. 効果注釈との統合

メソッド効果 ロック種別
pure なし 定数取得
read 共有ロック get, len, contains
write 排他ロック put, remove, clear
io 排他ロック save, load

🚀 具体的なAPI設計

基本使用99%のケース)

// 宣言
init { Sync<Map<str, int>> scores }
init { Sync<Vec<Player>> players }

// 書き込み(自動排他ロック)
scores.put("Alice", 100)
players.push(new Player("Bob"))

// 読み取り(自動共有ロック)
local score = scores.get("Alice")
local count = players.len()

// すべて普通のメソッド呼び出し!

ガード構文が必要な1%のケース

// 参照を返したい時のみ
read players as p {
    local leader = p[0]  // 参照を保持
    render(leader.name)
}

// 複数操作をまとめたい時
with scores.write as s {
    s.put("Alice", s.get("Alice") + 10)
    s.put("Bob", s.get("Bob") + 5)
    s.normalize()  // 3操作を1ロックで
}

🛡️ 安全性保証

コンパイル時検出

  1. S1: 参照返却の検出

    // ❌ エラー:参照は自動ロックでは返せない
    local ref = table.get_ref(k)
    // 💡 提案read table as t { local ref = t.get_ref(k) }
    
  2. S2: ネストロックの防止

    // ❌ エラーread中にwriteは不可
    read table as t {
        table.put(k, v)  // デッドロック防止
    }
    

実行時最適化

  • 単一操作:ロック取得→操作→即解放(最小オーバーヘッド)
  • 複数操作:withでまとめて効率化
  • デッドロック回避複数Syncの静的順序付け

🔧 実装戦略

Phase 1: 基本実装

// Sync<T>の内部構造
pub struct SyncBox<T: NyashBox> {
    inner: Arc<RwLock<T>>,
    base: BoxBase,
}

// 自動ロックプロキシ
impl<T> SyncBox<T> {
    pub fn put(&self, k: Key, v: Value) -> Result<()> {
        let mut guard = self.inner.write()?;
        guard.put(k, v)
        // guardのdropで自動アンロック
    }
}

Phase 2: 効果注釈統合

// メソッドに効果アノテーション
@effect(read)
method get(key) { ... }

@effect(write)  
method put(key, value) { ... }

Phase 3: MIR/VM統合

// MIR展開例
table.put(k, v) →
  LockAcquire(table, write)
  BoxCall(table.inner, "put", [k, v])
  LockRelease(table)

💡 革新性のポイント

  1. 多重箱問題の根本解決

    • 「BoxをBoxで包む」ではなく「ロック内蔵Box」
  2. 使いやすさの極致

    • 99%は通常メソッド呼び出し
    • 1%の特殊ケースのみガード構文
  3. Everything is Box哲学との完全調和

    • Syncも単なるBox
    • 特別扱いなし、統一的操作
  4. 効果システムとの自然な統合

    • 既存の効果注釈がそのままロック戦略に

🎯 結論

ChatGPT5 ProのSync<T>設計は:

  • 簡単 - table.put()で済む
  • 安全 - 自動ロック/アンロック
  • 高速 - 必要最小限のロック
  • 美しい - Everything is Box哲学を保持

これは単なる「同期プリミティブの追加」ではなく、並行プログラミングの新パラダイム

「同期を意識させない同期」

まさに、Nyashが目指す「初心者にも優しく、上級者にも強力」を体現した設計です。


「ロックは見えないところに。使うのは普通のメソッド」- 究極のユーザビリティ