Phase 32 L-2.1 complete implementation: 1. Stage-1 UsingResolver main line JoinIR connection - CFG-based LoopForm construction for resolve_for_source/5 - LoopToJoinLowerer integration with handwritten fallback - JSON snapshot tests 6/6 PASS 2. JoinIR/VM Bridge improvements - Simplified join_ir_vm_bridge.rs dispatch logic - Enhanced json.rs serialization - PHI core boxes cleanup (local_scope_inspector, loop_exit_liveness, loop_var_classifier) 3. Stage-1 CLI enhancements - Extended args.rs, groups.rs, mod.rs for new options - Improved stage1_bridge module (args, env, mod) - Updated stage1_cli.hako 4. MIR builder cleanup - Simplified if_form.rs control flow - Removed dead code from loop_builder.rs - Enhanced phi_merge.rs 5. Runner module updates - json_v0_bridge/lowering.rs improvements - dispatch.rs, selfhost.rs, modes/vm.rs cleanup 6. Documentation updates - CURRENT_TASK.md, AGENTS.md - Various docs/ updates 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
3.2 KiB
3.2 KiB
ExternCall vs BoxCall: 分離設計の理由(要約)
-
目的: VM/JIT間で同一挙動を担保しつつ、最適化や診断を明確にするため、ExternCall と BoxCall を上位で分離、下位で合流する。
-
上位(MIR/意味論)
- ExternCall: env.*(IO/タスク/デバッグ/チェックポイント等)を表現。EffectMaskで最適化境界を明示。
- BoxCall: 型ディスパッチ(vtable→PIC→汎用)。副作用はBox内部に閉じやすい。
-
下位(VM/JIT実装/ABI)
- 可能な限り共通のHostCall基盤へ合流(Cシンボル、HostHandle、TLV)。
- VM: ExternCall→PluginHost(extern_call)→必要に応じて host_api へ。
- JIT: 同じCシンボル群を直接リンクすることで一致挙動を確保。
-
STRICT(厳格モード)
NYASH_ABI_STRICT=1またはNYASH_EXTERN_STRICT=1で未登録/未対応を明確なエラーに。- vtable側は TypeRegistry に基づき未対応メソッドを検出。
- ExternCall側は Host/Loader が未登録なら明確な診断を返す。
-
最低限ハードコード
- print/console.log 等は ExternCall(env.console)側に限定して最小限のハードコード。
- BoxCall 側へのハードコードは避ける(最適化経路やキャッシュと混ざるのを防止)。
この方針により、最適化・キャッシュ・診断の責務範囲が鮮明になり、VM/JIT一致検証も行いやすくなる。 Extern vs BoxCall — 分離方針とスロット/アリティ一覧(Phase 12)
目的
- VM/JIT を問わず、BoxCall(Box上のメソッド呼び)と ExternCall(env.*)を明確に分離。
- Extern は name→slot 解決により、診断品質と性能を安定化(オプション)。
- BoxCall は vtable→PIC→汎用 の順で正式ルートとし、STRICT時の診断を最終仕様化。
方針
- BoxCall: vtable(TypeRegistry のスロット)→ PIC(poly→mono)→ 汎用メソッド呼び。
- STRICT: 未登録メソッドは型名・メソッド名・arity・known一覧を含めてエラー。
- ExternCall:
extern_registryで iface/method/arity を登録、任意で slot 経由のハンドラに集約。- name→slot 専用ハンドラは検討のみ。旧
NYASH_EXTERN_ROUTE_SLOTSは未使用につき撤去。
- name→slot 専用ハンドラは検討のみ。旧
TypeRegistryの代表スロット
- InstanceBox: 1(getField), 2(setField), 3(has), 4(size)
- ArrayBox: 100(get), 101(set), 102(len)
- MapBox: 200(size), 201(len), 202(has), 203(get), 204(set)
- StringBox: 300(len)
Extern スロット(抜粋)
- env.console: 10(log, warn, error, info, debug, println)
- env.debug: 11(trace)
- env.runtime: 12(checkpoint)
- env.future: 20(new, birth), 21(set), 22(await)
- env.task: 30(cancelCurrent), 31(currentToken), 32(yieldNow), 33(sleepMs)
環境変数
NYASH_ABI_VTABLE: VMのvtable経路有効化NYASH_ABI_STRICT: STRICT診断を有効化NYASH_EXTERN_ROUTE_SLOTS: (撤去済み)Externをslot経路に統一するトグルNYASH_JIT_HOST_BRIDGE: JITのhost-bridge(by-slot経路)を有効化NYASH_VM_PIC_THRESHOLD: (撤去済み)PICモノ化しきい値トグル