Phase 25.1b: Step2完了(FuncBodyBasicLowerBox導入)
Step2実装内容: - FuncBodyBasicLowerBox導入(defs専用下請けモジュール) - _try_lower_local_if_return実装(Local+単純if) - _inline_local_ints実装(軽い正規化) - minimal lowers統合(Return/BinOp/IfCompare/MethodArray系) Fail-Fast体制確立: - MirBuilderBox: defs_onlyでも必ずタグ出力 - [builder/selfhost-first:unsupported:defs_only] - [builder/selfhost-first:unsupported:no_match] Phase構造整備: - Phase 25.1b README新設(Step0-3計画) - Phase 25.2b README新設(次期計画) - UsingResolverBox追加(using system対応準備) スモークテスト: - stage1_launcher_program_to_mir_canary_vm.sh追加 Next: Step3 LoopForm対応 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -41,15 +41,28 @@ hakorune <command> [<subcommand>] [options] [-- script_args...]
|
||||
|
||||
## コマンド一覧(MVP 案)
|
||||
|
||||
| コマンド | 役割 |
|
||||
|-----------------------------------|-------------------------------------------|
|
||||
| `run` | .hako をコンパイルして実行(既定 VM) |
|
||||
| `build exe` | .hako からネイティブ EXE を AOT ビルド |
|
||||
| `emit program-json` | Stage‑B で Program(JSON v0) を出力 |
|
||||
| `emit mir-json` | Program(JSON) → MIR(JSON) を出力 |
|
||||
| `check` | 将来の構文/型/using チェック(予約) |
|
||||
| コマンド | 役割 | Phase 25.1a 実装状況 |
|
||||
|-----------------------------------|-------------------------------------------|----------------------|
|
||||
| `run` | .hako をコンパイルして実行(既定 VM) | プレースホルダ(`[hakorune] run: not implemented yet`) |
|
||||
| `build exe` | .hako からネイティブ EXE を AOT ビルド | 実装済み(env.codegen経由で `.o` → EXE を生成) |
|
||||
| `emit program-json` | Stage‑B で Program(JSON v0) を出力 | 実装済み(`BuildBox.emit_program_json_v0`) |
|
||||
| `emit mir-json` | Program(JSON) → MIR(JSON) を出力 | 実装済み(`MirBuilderBox.emit_from_program_json_v0`) |
|
||||
| `check` | 将来の構文/型/using チェック(予約) | プレースホルダ(`[hakorune] check: not implemented yet`) |
|
||||
|
||||
Phase 25.1 では、既存スクリプト置き換えに近い **`emit mir-json` / `build exe` を中心** に進め、`run`/`check` は設計レベルに留める。
|
||||
Phase 25.1a では、**`emit program-json` / `emit mir-json` / `build exe` の 3 系列のみが実働コード** であり、`run` / `check` はメッセージを返して終了するプレースホルダのまま運用する。CLI の出口コード(90〜93)やログ形式は docs と実装を同期済み。
|
||||
|
||||
### 実装ステータス(Phase 25.1a)
|
||||
|
||||
- `.hako → Program(JSON v0)`:
|
||||
- Stage‑B (`lang/src/compiler/entry/compiler_stageb.hako`) で `BuildBox.emit_program_json_v0` を呼び出し、`"version":0,"kind":"Program"` を持つ JSON を生成。
|
||||
- `Stage1UsingResolverBox` と `HAKO_STAGEB_MODULES_LIST` により、`using lang.mir.builder.MirBuilderBox` などの module alias を解決してから parse する。
|
||||
- `Program(JSON v0) → MIR(JSON)`:
|
||||
- 既定は provider 経路(`env.mirbuilder.emit`)を利用。`HAKO_MIRBUILDER_IMPORTS` に `using ns.Type [as Alias]` から得た alias を JSON で渡し、Rust 側ブリッジが static box 参照(`MirBuilderBox`, `BuildBox` など)を `Const(String(alias))` で生成できるようにする。
|
||||
- `hostbridge` 参照は JSON ブリッジ側で well-known グローバルとして扱い、`hostbridge.extern_invoke(...)` を含む CLI コードでも `undefined variable: hostbridge` にならないようにした。
|
||||
- `.hako → EXE` (`build exe`):
|
||||
- `env.codegen.emit_object`(MIR→.o)と `env.codegen.link_object`(.o→EXE)を `hostbridge.extern_invoke` で呼び出す。
|
||||
- `--quiet` でログ抑制、`-o/--out` で出力 EXE パスを指定可能。C-API トグル(`NYASH_LLVM_USE_CAPI`, `HAKO_V1_EXTERN_PROVIDER_C_ABI`)が無効な場合は fail-fast。
|
||||
- Stage1 バイナリ(`target/selfhost/hakorune`)を直接叩く際は `NYASH_NYRT_SILENT_RESULT=1` を付与し、stdout に JSON だけを流す運用を徹底する(`tools/selfhost/run_stage1_cli.sh` が環境セットとバイナリ検出を担当)。
|
||||
|
||||
## `run` コマンド
|
||||
|
||||
@ -192,6 +205,24 @@ hakorune emit mir-json [-o <out>] [--quiet] <source.hako>
|
||||
|
||||
※ `--force-jsonfrag` / `--normalize-provider` などは、引き続き設計のみで未実装。
|
||||
|
||||
## I/O と実行補助スクリプト
|
||||
|
||||
- Stage1 EXE(`target/selfhost/hakorune`)は NyRT(nyash_kernel)上で動作するため、既定ではプログラム終了時に `Result: <code>` が stdout に追記される。
|
||||
- llvmlite ハーネスとの互換性を保つため、Stage1 CLI をスクリプトから呼び出す際は `NYASH_NYRT_SILENT_RESULT=1` を常に有効化し、JSON 出力を純粋に保つ。
|
||||
- 補助スクリプト: `tools/selfhost/run_stage1_cli.sh`
|
||||
- 役割: Stage1 EXE の場所を解決し(既定 `target/selfhost/hakorune`)、`NYASH_NYRT_SILENT_RESULT=1` / `NYASH_DISABLE_PLUGINS=1` / `NYASH_FILEBOX_MODE=core-ro` を既定ONにしたうえで CLI 引数をそのまま渡す。
|
||||
- 使い方:
|
||||
```bash
|
||||
tools/selfhost/run_stage1_cli.sh emit program-json apps/tests/minimal.hako
|
||||
tools/selfhost/run_stage1_cli.sh --bin /tmp/hakorune-dev emit mir-json apps/tests/minimal.hako
|
||||
```
|
||||
- 直接 EXE を叩く場合も同じ環境変数を手動で設定すること(`NYASH_NYRT_SILENT_RESULT=1 ./target/selfhost/hakorune ...`)。
|
||||
これにより、stdout は JSON のみを返し、終了コードで成否を判別できる(llvmlite ハーネスと同一の契約)。
|
||||
- 現状の制約(2025-11-15 時点):
|
||||
- `lang/src/runner/launcher.hako` から生成された Program(JSON) がまだ `Main.main` のトップレベル式(`new HakoCli().run(args)`)しか含んでおらず、`HakoCli` / `BuildBox` 定義が JSON に落ちていないため、selfhost EXE 側でも `emit program-json` / `emit mir-json` の実体が欠落している。
|
||||
- `tools/selfhost/run_stage1_cli.sh --bin /tmp/hakorune-dev emit program-json apps/tests/minimal.hako` は exit code 0 だが stdout が空のまま。Stage‑B 側で box 定義を Program(JSON) に含められるようになるまで、Rust CLI / BuildBox (`tools/hakorune_emit_mir.sh`) 経由での JSON 取得を継続する。
|
||||
- using 解決は Stage0(Rust Runner)と Stage1(Hakorune)の二系統に分離する方針。Stage1 側は `lang.compiler.entry.using_resolver_box` で `nyash.toml` の `[modules]` を参照し、`HAKO_STAGEB_MODULES_LIST`(shell 側で生成した `name=path` リスト)をキーに依存 Box を text merge する。Rust 側は既存の Runner using 実装を維持し、Stage1 経路はこの Box で独立した自己ホスト導線を持つ。
|
||||
|
||||
## `check` コマンド(予約)
|
||||
|
||||
```text
|
||||
@ -239,3 +270,6 @@ hakorune check [options] <entry.hako>
|
||||
- Stage1 / Stage1' の CLI インターフェース・代表挙動が一致することをゴールデン/スモークで確認する。
|
||||
|
||||
このファイルは「Stage1 CLI の仕様 SSOT」として扱い、実装時は本仕様を先に更新→テスト→コードの順で進める。***
|
||||
|
||||
- Stage‑B using 未解決メモ:
|
||||
- `lang.mir.builder.MirBuilderBox` などの `using` 依存を Stage‑B emit が連結できておらず、`tools/selfhost/build_stage1.sh` では `undefined variable: MirBuilderBox` で停止する。BundleResolver / using resolver を Stage‑B 経路に統合し、依存 Box 定義を Program(JSON) に含めるのが次タスク。
|
||||
|
||||
Reference in New Issue
Block a user