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

3.2 KiB
Raw Blame History

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モ化しきい値トグル