Files
hakorune/docs/development/design/extern-vs-boxcall.md
nyash-codex 51ff558904 feat(phase32): L-2.1 Stage-1 UsingResolver JoinIR integration + cleanup
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>
2025-11-26 10:17:37 +09:00

56 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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→PluginHostextern_call→必要に応じて host_api へ。
- JIT: 同じCシンボル群を直接リンクすることで一致挙動を確保。
- STRICT厳格モード
- `NYASH_ABI_STRICT=1` または `NYASH_EXTERN_STRICT=1` で未登録/未対応を明確なエラーに。
- vtable側は TypeRegistry に基づき未対応メソッドを検出。
- ExternCall側は Host/Loader が未登録なら明確な診断を返す。
- 最低限ハードコード
- print/console.log 等は ExternCallenv.console側に限定して最小限のハードコード。
- BoxCall 側へのハードコードは避ける(最適化経路やキャッシュと混ざるのを防止)。
この方針により、最適化・キャッシュ・診断の責務範囲が鮮明になり、VM/JIT一致検証も行いやすくなる。
Extern vs BoxCall — 分離方針とスロット/アリティ一覧Phase 12
目的
- VM/JIT を問わず、BoxCallBox上のメソッド呼びと ExternCallenv.*)を明確に分離。
- Extern は name→slot 解決により、診断品質と性能を安定化(オプション)。
- BoxCall は vtable→PIC→汎用 の順で正式ルートとし、STRICT時の診断を最終仕様化。
方針
- BoxCall: vtableTypeRegistry のスロット)→ PICpoly→mono→ 汎用メソッド呼び。
- STRICT: 未登録メソッドは型名・メソッド名・arity・known一覧を含めてエラー。
- ExternCall: `extern_registry` で iface/method/arity を登録、任意で slot 経由のハンドラに集約。
- name→slot 専用ハンドラは検討のみ。旧 `NYASH_EXTERN_ROUTE_SLOTS` は未使用につき撤去。
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: 10log, warn, error, info, debug, println
- env.debug: 11trace
- env.runtime: 12checkpoint
- env.future: 20new, birth, 21set, 22await
- env.task: 30cancelCurrent, 31currentToken, 32yieldNow, 33sleepMs
環境変数
- `NYASH_ABI_VTABLE`: VMのvtable経路有効化
- `NYASH_ABI_STRICT`: STRICT診断を有効化
- `NYASH_EXTERN_ROUTE_SLOTS`: 撤去済みExternをslot経路に統一するトグル
- `NYASH_JIT_HOST_BRIDGE`: JITのhost-bridgeby-slot経路を有効化
- `NYASH_VM_PIC_THRESHOLD`: 撤去済みPICモ化しきい値トグル