3.7 KiB
3.7 KiB
Plan — Phase 20.17 (Full Self‑Hosting)
- 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 で終端。
- 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直行)。
- 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 互換)
- 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 に移動(本フェーズでは設計のみ)
- 前提・非目標(20.18で実装、20.17はセルフホスティング優先)
- Published 名(SSOT)は増やさない(
String.indexOf/1のみ)。?/!は糖衣で CallAttrs.optionality に落とす。 - OptionalBox は本フェーズでは導入しない(代替として
{present:0|1, value:Any}を使用する)。
- 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)。
- Verifier ガード(20.18で実装)
- Optionality が default 以外で、対応メソッドでない場合は
E_OPTIONAL_UNSUPPORTED(Fail‑Fast)。 - 対応メソッド(MVP): String.indexOf/lastIndexOf、Map.get、Array.get(拡張は後続)。
- 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 経路で同じ意味論を適用。
- カナリア(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
- Docs(公開仕様と移行:本フェーズは設計メモのみ)
- Optional/Null セマンティクス(MVP)に Sugar→CallAttrs と JSON flags を追記(済)
- Testing Guide に Optional カナリアの観測方法(VoidBox/簡易Map)を追記
- 20.18+ の OptionalBox 導入に向けた移行ノートを
TTLsに記録
- 拡張(任意・後段:20.19+)
- Array.get の Optionality 反映(empty時は Optional→Void)
- Bang 版の代表を1本追加(curated 昇格可)