Files
hakorune/docs/development/current/main/phases/phase-29y/10-ABI-SSOT.md

78 lines
2.9 KiB
Markdown
Raw Normal View History

# Phase 29y: ABI SSOTlifecycle / RC / weak
2025-12-27 14:17:18 +09:00
Status: Ready (docs-first, post self-host)
Scope: “脱RustランタイムNyRT/.hako” を進める前提で、lifecycle/RC/weak の境界を ABI として固定する。
この文書は「実装の現状」を説明するのではなく、**将来の置換NyRT/.hako化に耐える契約**を先に固定する。
## 0. 目的SSOT
- backendVM/LLVM/wasm/othersが “同じ意味” を実装できる最小 ABI を定義する
- “言語意味論” と “実装都合VMのregs等” を切り離し、hidden root を再発しにくくする
## 1. 前提(言語意味論)
ここでの weak は観測可能:
- `weak_to_strong()` が成功/失敗を返す(失敗は `null`
- したがって「SSA last-use = 寿命」を意味論にしてはいけない
## 2. ハンドル/値の表現(最低限)
### 2.1 Box handle
- `BoxHandle` は runtime 管理の参照opaqueとする
- 返値/引数は「0 = null」を許す`null` を表す)
### 2.2 Weak handletoken identity
weak の等価性identityは backend 差が出にくい token を SSOT として固定する:
- `alloc_id + generation` を含む token概念
- ログ表示も token を使う(例: `WeakRef(#1234:g7)`
比較(`==`)の扱い:
- `WeakRef``==` は token 同一性比較Alive/Dead/Freed に依存しない)
## 3. 関数 ABI最小契約
推奨 SSOT:
- **args borrowed / return owned**
契約:
- 引数は borrowedcallee は retain/release しない)
- 戻り値は ownedcaller が release 責務を持つ)
- borrowed を保存/捕獲/フィールド格納/返す等の “escape” を行う場合のみ、compile 側が acquireretainを挿入する
## 4. NyRT lifecycle ABI最小セット案
ここでは “名前” より契約を SSOT とする(既存の実装名が異なる場合は shim で吸収)。
### 4.1 strong
- `retain(h: BoxHandle) -> BoxHandle`
- `h == 0` のときは `0` を返すno-op
- `release(h: BoxHandle) -> void`
- `h == 0` のときは no-op
- 物理解放のタイミングは runtime 実装に委譲(言語意味論では規定しない)
### 4.2 weak
- `weak_new(h: BoxHandle) -> WeakHandle`
- `h == 0` はエラー(または `0` weak を禁止)
- `weak_drop(w: WeakHandle) -> void`
- `weak_to_strong(w: WeakHandle) -> BoxHandle`
- 成功: Alive のときだけ non-null を返す
- 失敗: Dead/Freed は `0`nullを返す
## 5. 非目標このABIで扱わない
- finalizer の自動実行RC/GC が勝手に `fini()` を呼ばない)
- GCアルゴリズムcycle回収等の規定
## 6. 関連(参考リンク)
- ABIの既存ドキュメント参考:
- `docs/reference/abi/nyrt_c_abi_v0.md`
- `docs/reference/abi/NYASH_ABI_MIN_CORE.md`
- 言語意味論 SSOT参照のみ:
- `docs/reference/language/lifecycle.md`