Files
hakorune/lang/src/compiler/pipeline_v2
..

Pipeline V2 — BoxFirst Extract→Emit

Scope

  • Selfhost compilerの emitonly 経路Stage1 JSON → MIR(JSON v0/v1))を、箱の責務で明確化する。
  • Parser/Resolver/Runtime には影響しない。既定挙動は不変devフラグ/引数でのみ起動)。

Modules責務

  • compare_extract_box.hako

    • 目的: Stage1 JSON から Compare(lhs, rhs, op) を堅牢に抽出(整数のみ)。
    • API:
      • extract_return_compare_ints(ast_json) -> {cmp,lhs,rhs} | null
      • extract_if_compare_ints(ast_json) -> {cmp,lhs,rhs} | null
    • 失敗時: null呼び出し側でフォールバック
  • emit_compare_box.hako

    • 目的: Compare の MIR(JSON v0) 生成。
    • API:
      • emit_compare_ret(lhs,rhs,cmp,trace) -> JSON v0compare→ret
      • emit_compare_cfg3(lhs,rhs,cmp,materialize,trace) -> JSON v0branch/jump/ret; materialize=2でcopy材化想定
    • 失敗時: なし(入力は抽出済み前提)。
  • pipeline.hakoflow PipelineV2

    • 役割: Extract系→Emit系の配線。Call/Method/New/Compare/If(Compare) を段階的に対応。
    • フラグ:
      • prefer_cfg=0: Returnonlycompare→ret
      • prefer_cfg=1: CFGbranch/jump/ret
      • prefer_cfg=2: CFG+材化(将来の copy after PHI を想定; 現状は等価分岐)
    • trace: 1で最小トレース[trace]を出力。既定は0静音

I/O最小仕様

  • 入力: Stage1 JSONReturn/If/Call/Method/New の最小形)。負数/空白は RegexFlow で吸収。
  • Call/Method/New の args 配列は {"type":"Int","value":…} のみを許容する。NamedArg/DefaultArg/VarArg など Int 以外が混在した場合は Null を返し、呼び出し側で FailFastStage0/Resolver 側で脱糖すること)。
  • 出力: MIR(JSON v0)。将来 v1(MirCall) への直出力は lower_stage1_to_mir_v1 を併設dev用途

FailFast & Fallback

  • 抽出箱は見つからない場合 null を返す。pipeline は legacy extractorStage1ExtractFlowでフォールバックする。
  • 既定ONは変えないdev引数でのみ有効

Stage GuardStage2 / Stage3

  • Stage2: Call/Method/New 向けの emit 手前ガード。Stage1 で弾いた NamedArg / DefaultArg / VarArg などが混入した場合は Null で FailFast し、呼び出し側に返す。
  • Stage3: MIR(JSON) 生成器。Stage2 の整形結果のみを受理し、PipelineV2.lower_stage1_to_mir が null を返した場合は Emit を実行しない。
  • 代表スモーク
    • Stage1 ガード: selfhost_pipeline_v2_stage1_invalid_args_fail_vm.sh / ..._named_default_fail_vm.sh / ..._vararg_fail_vm.sh
    • Stage2/3 正常系: selfhost_pipeline_v2_call_exec_vm.sh, selfhost_pipeline_v2_method_exec_vm.sh, selfhost_pipeline_v2_newbox_exec_vm.sh

Testing

  • quick/selfhost に compare/binop/call/method/new の代表スモークがある。Compare系は Returnonly と CFG をそれぞれ確認。
  • MiniVMapps/selfhost/vm/boxes/mir_vm_min.nyashは最小仕様。算術/比較/CFGのみのスモークで品質を担保。

Notes

  • 追加の Extract 箱Call/Method/Newを段階導入し、Stage1ExtractFlow の責務を縮小する計画。
  • trace は既定OFF。--emit-trace 指定時のみ出力する。CI/quick は既定で静音。

WASM 開発ラインとの取り込み方針(注意)

  • wasm-development ブランチは独立開発ライン。Selfhost 側には以下のみ注意して取り込む。
    • 共有仕様MIR JSON 形状、PHI invariants、v1/v0 変換ポリシ)に関するドキュメントの同期。
    • Python LLVM ハーネスの仕様更新点(値配線/PHI 正規化)を docs に反映し、実装取り込みは最小・可逆。
    • Selfhost本フォルダの箱 API/入出力は変更せず、adapter で吸収MirJsonV1Adapter など)。
    • 実装取り込みは小粒・局所・既定OFFのフラグ配下。quick が緑のままになる粒度で実施。
    • 互換チェックは quick/integration の代表スモークで行い、重い検証は wasm ライン側で継続。