67 lines
3.7 KiB
Markdown
67 lines
3.7 KiB
Markdown
## Plan — Phase 20.17 (Full Self‑Hosting)
|
||
|
||
1) Lock boundaries and gates
|
||
- Freeze MIR(JSON v0) schema doc; add validator smoke
|
||
- Ensure Gate‑C(Core) rc/output consistency across file/pipe
|
||
- Front EXE OK/NOOP/FAIL contract finalized (runner/loader/vm)
|
||
- Runner: nyvm(Core) 直行を既定(wrapperはTTL互換)。Selfhost経路は JSON→Interpreter で終端。
|
||
|
||
2) Stage pipeline (S0→S1→S2)
|
||
- S0 (Rust) builds S1 (Hakorune compiler AOT)
|
||
- S1 builds S2 from the same sources; compare artifacts (size/hash/canonical diff)
|
||
- Add time‑boxed S3 for confidence (optional)
|
||
|
||
Status
|
||
- S2 canonical compare: driver側は既定ON化(tools/stage/pipeline.sh)。代表題材は緑
|
||
- CI への導入は最小1本から段階導入(nested‑if or phi 代表)
|
||
- Selfhost 最小系: emit→parse→execute の quick opt‑in canary が PASS(Core直行)。
|
||
|
||
3) Coverage to green(契約準拠)
|
||
- Builder: copy/unary/typeop/load/store/phi/compare/branch/jump/call/extern/boxcall(min) の契約準拠率を上げる
|
||
- Core VM mir_call: Array/Map/Extern/Method/ModuleFunction の最小セット+Fail‑Fast タグ
|
||
- Reader: unary(unop)/params/Constructor/Const/ModuleFunction のネスト表現を受理(v0 互換)
|
||
|
||
4) Docs/TTLs
|
||
- Spec v1 docs, ABI minimal, stdlib nucleus
|
||
- Mark Rust boundary diagnostics as TTL; move into Core/fronts gradually
|
||
- Selfhost ガイド(Core直行・子emit-only・first-line JSON 捕捉)の簡易 runbook を追加
|
||
|
||
---
|
||
|
||
## Optional/Bang sugar(CallAttrs)— 20.18 に移動(本フェーズでは設計のみ)
|
||
|
||
0) 前提・非目標(20.18で実装、20.17はセルフホスティング優先)
|
||
- Published 名(SSOT)は増やさない(`String.indexOf/1` のみ)。`?`/`!` は糖衣で CallAttrs.optionality に落とす。
|
||
- OptionalBox は本フェーズでは導入しない(代替として `{present:0|1, value:Any}` を使用する)。
|
||
|
||
1) Parser → MIR → JSON の配線(20.18で実装)
|
||
- Parser: メソッド名末尾の `?`/`!` を検出し、AST.optional_mark=None|Question|Bang を付与(文字列名からは除去)。
|
||
- MIR: `CallAttrs.optionality = {Default, Optional, Bang}` を追加し、AST から転写。
|
||
- JSON v0: `mir_call.flags.optionality` を出力/読取(欠損は default)。
|
||
|
||
2) Verifier ガード(20.18で実装)
|
||
- Optionality が default 以外で、対応メソッドでない場合は `E_OPTIONAL_UNSUPPORTED`(Fail‑Fast)。
|
||
- 対応メソッド(MVP): String.indexOf/lastIndexOf、Map.get、Array.get(拡張は後続)。
|
||
|
||
3) Runtime(最小スコープから:20.18)
|
||
- Rust interpreter: String.indexOf の Optionality を尊重
|
||
- Default: not found → -1(互換)
|
||
- Optional: not found → VoidBox
|
||
- Bang: not found → Fail(E_NOT_FOUND)
|
||
- Map.get: Default=現行(missing→Fail)。Optional: `{present:0, value:Void}`。Bang: missing→Fail。
|
||
- Gate‑C(Core) と nyvm 経路で同じ意味論を適用。
|
||
|
||
4) カナリア(opt‑in:20.18)
|
||
- Gate‑C/Core: `"abc".indexOf?("x") → Void`、`indexOf!("x") → E_NOT_FOUND`、`indexOf?("a") → 0`
|
||
- Map.get?:missing → `{present:0}`、存在 → `{present:1, value:…}`(表現は簡易Map)
|
||
- Verifier: plugin メソッドへの `?`/`!` → `E_OPTIONAL_UNSUPPORTED`
|
||
|
||
5) Docs(公開仕様と移行:本フェーズは設計メモのみ)
|
||
- Optional/Null セマンティクス(MVP)に Sugar→CallAttrs と JSON flags を追記(済)
|
||
- Testing Guide に Optional カナリアの観測方法(VoidBox/簡易Map)を追記
|
||
- 20.18+ の OptionalBox 導入に向けた移行ノートを `TTLs` に記録
|
||
|
||
6) 拡張(任意・後段:20.19+)
|
||
- Array.get の Optionality 反映(empty時は Optional→Void)
|
||
- Bang 版の代表を1本追加(curated 昇格可)
|