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>
This commit is contained in:
nyash-codex
2025-11-26 10:17:37 +09:00
parent 7d0581c9a4
commit 51ff558904
36 changed files with 474 additions and 361 deletions

View File

@ -32,6 +32,11 @@ Phase 25.1 A-3: `.hako` 側 Stage1Cli skeleton に env-only 実処理を実装
- Stage1 は **自分で VM/LLVM を実装しない**。常に Ring0 のサービスenv.codegen/env.mirbuilder, NyRT/ny-llvmc 等を経由して実行・AOT する。
- Stage1 CLI は「どのステージまで進めるか」と「どのバックエンドで実行/ビルドするか」を宣言的に指定するだけに留める。
- Stage1 バイナリ自体は Stage0 の CLI からは独立しており、Stage0 はあくまで「ブートストラップおよびランタイムサービス提供者」として扱う。
- JSON v0 境界の扱い:
- Stage0 直通: Rust AST → MirCompiler で MIR を生成し、`--dump-mir` は MirPrinter の stdout 出力のみProgram(JSON v0) は介さない)。
- Stage1/selfhost: BuildBox/ParserBox などが `Program(JSON v0)` を返し、Stage0 は `json_v0_bridge::parse_json_v0_to_module``maybe_dump_mir``RUST_MIR_DUMP_PATH`/`--dump-mir` 両対応) → VM/LLVM という共通導線で処理する。
- Stage1 専用モード: `STAGE1_EMIT_MIR_JSON=1` で Program(JSON v0) を生成して Rust 側が即座に MIR 化し dump/emit までを行う(実行はしない。`RUST_MIR_DUMP_PATH` / `--dump-mir` / `--emit-mir-json` が JSON v0→MIR 共通パスで効く)。
- CLI フラグ整理: `.hako` / Stage1 を経由する入口は `--hako-emit-program-json` / `--hako-emit-mir-json` / `--hako-run` を前置きで区別する(内部で Stage1 stub を呼び出し、JSON v0 境界から先は共通パスへ流す)。
## トップレベル構文
@ -251,13 +256,15 @@ hakorune emit mir-json [-o <out>] [--quiet] <source.hako>
- `mir_stage1_cli_emit_program_min_compiles_and_verifies`:
- Stage1Cli + UsingResolver + BuildBox を含んだモジュールが MIR 生成・verify まで通ることを確認SSA/PHI 崩壊なし)。
- `mir_stage1_cli_emit_program_min_exec_hits_type_error`:
- VM 実行まで進め、Stage1 CLI 経路の型エラーや未解決呼び出しが発生しないことを確認するための箱(現在は安定化済み)。
- VM 実行まで進め、Stage1 CLI 経路の型エラーや未解決呼び出しが発生しないことを確認するための箱(現在は LoopForm/ParserBox 修正により安定化済み)。
### Stage1 CLI 環境変数env-only 仕様)
- Stage0 の `stage1_bridge.rs` から `.hako` 側 `stage1_cli.hako` を呼び出す際の最低限の ENV:
- `STAGE1_EMIT_PROGRAM_JSON` / `STAGE1_EMIT_MIR_JSON` / `NYASH_USE_STAGE1_CLI`:
- モード選択emit_program_json / emit_mir_json / run
- モード選択emit_program_json / emit_mir_json / run
- `STAGE1_EMIT_PROGRAM_JSON=1`: Program(JSON v0) を stdout に出して終了VM 実行なし)。
- `STAGE1_EMIT_MIR_JSON=1`: Program(JSON v0) を JSON v0 ブリッジで MIR(JSON) に変換し、`--dump-mir` / `RUST_MIR_DUMP_PATH` / `--emit-mir-json` を通す emit 専用モードVM 実行なし)。
- `STAGE1_SOURCE`:
- .hako ソースパスFileBox 経由で読み込むときに使用)。
- `STAGE1_SOURCE_TEXT`: