diff --git a/docs/README.md b/docs/README.md index f07226b5..05dbfd39 100644 --- a/docs/README.md +++ b/docs/README.md @@ -84,6 +84,7 @@ - 🔥 **[Phase 12: TypeBox統合ABI](development/roadmap/phases/phase-12/)** - 🔥 **[Phase 16: マクロ革命](development/roadmap/phases/phase-16-macro-revolution/)** - 🧪 **[Phase 17: LoopForm Self‑Hosting](development/roadmap/phases/phase-17-loopform-selfhost/)** + - 💡 **[Rust所有権統合(候補)](private/ideas/new-features/2025-09-22-rust-ownership-fusion.md)** - Phase 17+候補 - 🧩 **[Mini‑VM 構築ロードマップ](development/roadmap/phases/phase-17-loopform-selfhost/MINI_VM_ROADMAP.md)** - 🧭 **Using→Loader 統合(最小設計)**: design/using-loader-integration.md - 🗂️ **Docsの書き方(小さく・リンク駆動)**: guides/contributing-docs.md diff --git a/docs/development/roadmap/phases/00_MASTER_ROADMAP.md b/docs/development/roadmap/phases/00_MASTER_ROADMAP.md index c3aa750a..df99626a 100644 --- a/docs/development/roadmap/phases/00_MASTER_ROADMAP.md +++ b/docs/development/roadmap/phases/00_MASTER_ROADMAP.md @@ -32,6 +32,7 @@ Purpose: Claude×Copilot×ChatGPT×Gemini×Codex協調開発の総合ロード | 15 | 🌟実現可能 | セルフホスティング(C実装ABI経由) | [phase-15/](phase-15/) | | 16 | 🔄進行中 | マクロ革命(正規化+テストランナー) | [phase-16-macro-revolution/](../phase-16-macro-revolution/) | | 17 | 🧪計画中 | LoopForm Self‑Hosting+Mini‑VM | [phase-17-loopform-selfhost/](../phase-17-loopform-selfhost/) | +| 17+ | 💡候補 | Rust所有権統合(オプショナル) | [rust-ownership-fusion](../../private/ideas/new-features/2025-09-22-rust-ownership-fusion.md) | --- diff --git a/docs/private/ideas/README.md b/docs/private/ideas/README.md index 2c48f6a1..628324da 100644 --- a/docs/private/ideas/README.md +++ b/docs/private/ideas/README.md @@ -56,6 +56,7 @@ Related-Code: src/path/to/file.rs::function_name() 例: - `2025-08-25-vm-andor-shortcircuit.md` - `2025-08-26-mir-builder-cleanup.md` +- `2025-09-22-rust-ownership-fusion.md`(Phase 17候補) ## 📊 優先度 diff --git a/docs/private/ideas/new-features/2025-09-22-rust-ownership-fusion.md b/docs/private/ideas/new-features/2025-09-22-rust-ownership-fusion.md new file mode 100644 index 00000000..c4e5b0ac --- /dev/null +++ b/docs/private/ideas/new-features/2025-09-22-rust-ownership-fusion.md @@ -0,0 +1,271 @@ +# Rust×Nyash 所有権融合理論 - 「最小単位が所有権のRust」×「Everything is Box」 + +Status: Pending (Phase 17候補) +Created: 2025-09-22 +Priority: High +Related: Phase 15 セルフホスティング完了後 + +## 🦀📦 融合の核心思想 + +**「最小単位が所有権のRust」** + **「Everything is Box のNyash」** = **完璧な哲学的融合** + +Rustの核心(所有権・借用・RAII)は、Boxの哲学と驚くほど相性が良い。 +重要なのは「厳密さを最初からMAXにしない」こと:まずはタグ+借用トークン+リージョン+Lintで"気持ちよさ"を保つ。 + +## 1) 所有権は「タグ」で、実装は軽く + +**Box に所有権タグを付ける**: +- `Unique / Shared`(唯一 or 共有) +- `Mut / Const`(可変性タグ) +- `Send / Sync`(スレッド安全タグ) + +これは**型の一部**でもいいし、まずは**メタ(注釈)**でもOK。実装を固める前に"設計の宣言"だけで効果が出る。 + +```nyash +// 所有権タグの使用例 +box DataProcessor { + data: Unique // 唯一所有 + cache: Shared // 共有可能 + + process(input: &Shared) -> Unique { + // 安全な所有権管理 + } +} +``` + +## 2) 借用は「借用トークン(権利証)」で表現 + +**BoxRef / BoxMut** = 「借りた権利」を表す軽量ハンドル(実体は Box) +寿命は**スコープ or ブロック**で自動返却。 + +**同時に成り立つルール**(Rustの核心を簡素化): +- `BoxMut` は**同時に1つ** +- `BoxRef` は**複数可**(ただし `BoxMut` と共存しない) + +まずは**コンパイラ警告(Lint)**から始める:違反は警告→将来エラー化。 + +```nyash +// 借用トークンの例 +local data = DataBox.new() // Unique所有 +local read_token = data.borrow_ref() // 読み取り権利証 +local write_token = data.borrow_mut() // ❌ エラー:すでに借用中 + +// 使用例 +box NetworkClient { + connection: Unique + + send_data(data: &Shared) { // 共有読み取りのみ + local write_handle = me.connection.borrow_mut() + write_handle.write(data.serialize()) + } // write_handle自動返却 +} +``` + +## 3) ライフタイムは「リージョン」ベースで緩やかに + +**リージョン(領域)** = `init…fini` の**Boxスコープ**や**関数/ブロック**を単位に、 +「この借用トークンはこのリージョンまで有効」と宣言。 + +Rustの厳密な `'a` 計算は後回し。まずは**リージョン内の整合**だけ保証すれば十分「気持ちよさ」が出る。 + +```nyash +region FileProcessing { + local file = FileBox.open("data.txt") // init + local content = file.borrow_ref() + process(content) + // region終了で自動fini(ファイルクローズ) +} +// ここでcontentは使えない(リージョン外) +``` + +## 4) RAII は「init/fini」を正規化して箱に組み込む + +Box 生成時 `init`、破棄時 `fini` を**必ず通る**(すでに思想に合ってる!) + +**例外/中断/キャンセル**時も `fini` が実行されることを**仕様で保証**(RustのDrop相当)。 +これで**C ABI** 包み込みも安全に:C資源の取得/解放を Box のライフサイクルに乗せる。 + +```nyash +box ResourceManager { + resource: Unique + + birth(config) { + me.resource = NativeResourceBox.acquire(config) // init + } + + fini() { + me.resource.release() // RAII保証 + } +} +``` + +## 5) 「型で安全」を強制せず、**3段階の安全レベル** + +1. **Safe**:所有権タグ+借用トークン必須(既定) +2. **Unsafe Box**:一括でルールを緩めるが、**境界に注釈を強制**(レビューしやすい) +3. **FFI Box**:C ABI 専用の型。`Unique/Shared` と `Send/Sync` の**既定値**を保守的に。 + +```nyash +// 段階的安全レベルの例 +box SafeProcessor { // Safe(既定) + process(data: Unique) { + // 厳密な所有権チェック + } +} + +box LegacyCode : unsafe { // Unsafe + legacy_operation(data) { + // 従来通りの自由なコード + } +} + +box CLibWrapper : ffi { // FFI + c_function(ptr: *const u8) { + // C連携専用、保守的な既定値 + } +} +``` + +## 6) "重くしない"ためのトリック + +**コンパイラ段階で 2層**: +1. **Lint/静的解析**(借用違反を"まず警告") +2. **MIR で軽い動的アサート**(デバッグビルドのみ) + +これで「Rustの厳密さ」前に**手触りの良さ**を損なわない。 + +**NLL(非字句借用)ぽい緩和**:リージョン内でも**最後の使用以降は借用解除**扱い(使い勝手が一気に上がる)。 + +## 7) API設計の型ルール(実用チートシート) + +```nyash +// API設計パターン +box DataAPI { + // 読み取りAPI + read(self: &BoxRef) -> TView { + // BoxRef で十分、BoxMut 不要 + } + + // 書き込みAPI + write(self: &BoxMut, v: T) { + // 呼び手は一時的に排他 + } + + // 分割API + split_at(data: &BoxRef<[T]>) -> (BoxRef<[T]>, BoxRef<[T]>) { + // 共有読みを安全に拡げる + } + + // 合流API + join(a: BoxMut, b: BoxMut) -> BoxMut<(A,B)> { + // 同一所有者が明示 + } +} + +// FFI橋 +box NetworkFFI : ffi { + // 既定で Send: false, Sync: false + // 明示 opt-in のみ許可 +} +``` + +## 8) MIRで"所有権の影"を持つ(実装は後でOK) + +**所有権/借用の影(Shadow)**を MIR の**メタ**に保持: +- `owner(var)=block_id` +- `borrow(var)=region_id` +- `mut=bool` + +最初は**検証だけ**に使い、将来**最適化(エイリアス解析)**へ拡張可能。 + +## 9) 失敗しがちな所に"軽いトリップワイヤ" + +- **同時可変**検出:`BoxMut` が2つ生きていたら警告→デバッグで即アサート +- **ダングリング防止**:リージョン終了時に借用トークンが残っていたら警告 +- **FFI越境**:`Send/Sync` 不一致を越境点で検出(C呼出し前にチェック) + +## 10) 受け入れやすい採用順(段階導入) + +### 🏷️ **「タグ = オプトイン」の天才設計** + +**使いたい人は使う、使いたくない人は使わない!** + +```nyash +// ✅ 使いたい人は使う(所有権厳密派) +box SafeProcessor { + process(data: Unique) { // タグ明示 + local ref = data.borrow_ref() + return ref.compute() + } +} + +// ✅ 使いたくない人は無視(従来通り派) +box SimpleProcessor { + process(data) { // タグなし = 従来通り + return data.compute() // 普通に動く + } +} +``` + +### 段階的導入戦略 + +1. **タグ導入**(Unique/Shared/Mut/Const)…意味だけ決める +2. **借用トークン**(BoxRef/BoxMut)…APIで返す/受ける +3. **リージョン検証**…init/fini単位で借用の片付けをLint +4. **MIRメタ**…影データで静的チェックを強める +5. **最適化に活用**…別解放/エイリアス前提の高速化 + +### 採用レベル + +- **レベル1**: 完全無視(既存コード変更不要) +- **レベル2**: 部分採用(新しいAPIだけ使用) +- **レベル3**: フル活用(型安全重視) + +## 💡 **哲学的な深さ** + +### **「所有権 = 責任」** の概念がNyashに完璧フィット +- **Box** = 責任の単位 +- **所有権** = その責任を誰が持つか +- **借用** = 責任の一時委託 +- **RAII** = 責任の確実な完了(init/fini) + +### **「軽くしすぎない、重くしすぎない」** の絶妙バランス +最初から厳密にすると使いにくい、でも後から追加するのは大変... +**段階的導入戦略** で両立を実現! + +## 🎯 実装への道筋 + +### Phase 17 候補として位置づけ +- **Phase 15**: セルフホスティング完了 +- **Phase 16**: マクロ革命完了 +- **Phase 17**: Rust所有権統合(このドキュメント) + +### 最高の「逃げ道」付き設計 + +万が一所有権システムが重すぎる・複雑すぎると感じても: +```nyash +// 全部 unsafe で回避可能 +box LegacyCode : unsafe { + // 従来通りの自由なコード +} +``` + +### **まとめ** + +Rustの核心(**所有権・借用・RAII**)は、**Boxの哲学**と驚くほど相性が良い。 +**"厳密さを最初からMAXにしない"** のがコツ: + +まずは**タグ+借用トークン+リージョン**+**Lint**で"気持ちよさ"を保ち、 +将来**MIRメタ→最適化**へ段階的に引き上げれば、**美しさと実用**を両立できる。 + +**「強制しない革新」** = **最強の言語設計** + +--- + +**関連リンク**: +- Phase 15: [セルフホスティング計画](../../roadmap/phases/phase-15/) +- Phase 16: [マクロ革命](../../roadmap/phases/phase-16-macro-revolution/) +- Everything is Box: [言語リファレンス](../../../reference/language/LANGUAGE_REFERENCE_2025.md) + +Created by: ChatGPT + Claude 協働設計 +Implementation Target: Phase 17 (Phase 15セルフホスティング完了後) \ No newline at end of file diff --git a/tools/test/smoke/selfhost/loopform_identity_smoke.sh b/tools/test/smoke/selfhost/loopform_identity_smoke.sh index 138a44d8..143f806e 100644 --- a/tools/test/smoke/selfhost/loopform_identity_smoke.sh +++ b/tools/test/smoke/selfhost/loopform_identity_smoke.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -ROOT_DIR=$(cd "$(dirname "$0")/../../.." && pwd) +ROOT_DIR=$(cd "$(dirname "$0")/../../../.." && pwd) cd "$ROOT_DIR" echo "[smoke] build nyash (release)" diff --git a/tools/test/smoke/selfhost/scopebox_identity_smoke.sh b/tools/test/smoke/selfhost/scopebox_identity_smoke.sh index db343022..d4e72b90 100644 --- a/tools/test/smoke/selfhost/scopebox_identity_smoke.sh +++ b/tools/test/smoke/selfhost/scopebox_identity_smoke.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -ROOT_DIR=$(cd "$(dirname "$0")/../../.." && pwd) +ROOT_DIR=$(cd "$(dirname "$0")/../../../.." && pwd) cd "$ROOT_DIR" echo "[smoke] build nyash (release)" diff --git a/tools/test/smoke/selfhost/selfhost_runner_smoke.sh b/tools/test/smoke/selfhost/selfhost_runner_smoke.sh index 9bc461c1..b754170c 100644 --- a/tools/test/smoke/selfhost/selfhost_runner_smoke.sh +++ b/tools/test/smoke/selfhost/selfhost_runner_smoke.sh @@ -3,7 +3,7 @@ set -euo pipefail # Smoke: Stage 0/1 selfhost runner wiring (harness JSON path) -ROOT_DIR=$(cd "$(dirname "$0")/../../.." && pwd) +ROOT_DIR=$(cd "$(dirname "$0")/../../../.." && pwd) cd "$ROOT_DIR" echo "[smoke] building nyash (release)"