2025-12-27 01:11:36 +09:00
|
|
|
|
# Phase 29y: ABI SSOT(lifecycle / RC / weak)
|
|
|
|
|
|
|
2025-12-27 14:17:18 +09:00
|
|
|
|
Status: Ready (docs-first, post self-host)
|
2025-12-27 01:11:36 +09:00
|
|
|
|
Scope: “脱Rustランタイム(NyRT/.hako)” を進める前提で、lifecycle/RC/weak の境界を ABI として固定する。
|
|
|
|
|
|
|
|
|
|
|
|
この文書は「実装の現状」を説明するのではなく、**将来の置換(NyRT/.hako化)に耐える契約**を先に固定する。
|
|
|
|
|
|
|
|
|
|
|
|
## 0. 目的(SSOT)
|
|
|
|
|
|
|
|
|
|
|
|
- backend(VM/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 handle(token 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**
|
|
|
|
|
|
|
|
|
|
|
|
契約:
|
|
|
|
|
|
- 引数は borrowed(callee は retain/release しない)
|
|
|
|
|
|
- 戻り値は owned(caller が release 責務を持つ)
|
|
|
|
|
|
- borrowed を保存/捕獲/フィールド格納/返す等の “escape” を行う場合のみ、compile 側が acquire(retain)を挿入する
|
|
|
|
|
|
|
|
|
|
|
|
## 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`
|