Files
hakorune/CURRENT_TASK.md

154 lines
9.8 KiB
Markdown
Raw Normal View History

# CURRENT TASK (Compact) — Phase 15 / Self-HostingNy→MIR→MIR-Interp→VM 先行)
このドキュメントは「いま何をすれば良いか」を最小で共有するためのコンパクト版です。詳細は git 履歴と `docs/`phase-15を参照してください。
— 最終更新: 20250905 (R1R5 反映)
■ 進捗サマリ
- Phase 12 クローズアウト完了。言語糖衣12.7-B/P0と VM 分割は反映済み。
- Phase 15Self-Hosting: Cranelift AOTへフォーカス移行。
- 設計/仕様ドキュメントとスモーク雛形を追加済み。
- 設計: `docs/backend-cranelift-aot-design.md`
- API案: `docs/interfaces/cranelift-aot-box.md`
- LinkerBox: `docs/interfaces/linker-box.md`
- スモーク仕様: `docs/tests/aot_smoke_cranelift.md`
- 雛形スクリプト: `tools/aot_smoke_cranelift.sh`, `tools/aot_smoke_cranelift.ps1`
- README にセルフホスト到達の道筋を明記C ABI を Box 化)。
■ 現在のフォーカス(優先順)
1) Ny から `nyash.toml` を読む最小ユーティリティny-config
- FileBox + TOMLBox で `nyash.toml``env`/`tasks`/`plugins`/`box_types` を取得する Ny スクリプトapps/std/ny-config.nyash
2) Ny スクリプトプラグインの列挙・読み込み方針
- `nyash.toml``[ny_plugins]` を追加純Nyashのプラグイン列挙。Runner にオプトイン・フック(`NYASH_LOAD_NY_PLUGINS=1`/`--load-ny-plugins`)。
3) 直結ブリッジ(実験)の段階導入
- `--parser ny`/`NYASH_USE_NY_PARSER=1` で v0 を直結実行JSONはデバッグダンプへ縮退。整合/スモーク拡充。
4) AOT P2 継続
- CraneliftAotBox/LinkerBox のスタブから RUN スモークまでの仕上げと計測。
■ ブランチ/構成Phase 15
- 実装ブランチ: `phase-15/self-host-ny-mir`
- 既存 Workspace は維持(`crates/*`)。
- 方針: crates 側は変更せず「Nyash スクリプト + nyash.exe」だけで実装・運用Windows優先
- 例: `C:\git\nyash-project\nyash_self\nyash` 直下で `target\release\nyash` 実行。
- Nyash 製パーサは `apps/ny-parser-nyash/`Nyashコードとして配置最初は最小サブセット
- MIR 解釈層は既存 `backend/mir_interpreter.rs``runner/modes/mir_interpreter.rs` を拡充。
- AOT 関連の雛形は `src/backend/cranelift/` に維持feature gate: `cranelift-aot`)。
■ 直後に回すタスク2本運用
- E) R4 finalize: Interpreter 実行前の BID v2 初期化の同期化FileBox/TOMLBox 安定化)
- 目的: `apps/std/ny-config.nyash` の初動「Unknown Box type」解消
- 内容: init 完了→Interpreter 構築の順序固定、最小スモーク追加
- F) AOT P2(step2): emit→link→run の計測雛形
- 目的: .o→実行→サイズ/時間ログを `tools/aot_smoke_cranelift.{sh,ps1}` に反映
■ 予定R5 拡張: Ny Plugins → Namespace
- Phase A最小: 共有レジストリ `NyModules` を追加し、`env.modules.set/get` で exports を登録/取得。
- `[ny_plugins]` は戻り値Map/StaticBoxを「ファイルパス→名前空間」に変換して登録。
- 名前空間導出: ルート相対・区切りは `.`、拡張子除去・無効文字は `_`。予約 `nyashstd.*` 等は拒否。
- Phase B範囲: 共有Interpreterオプション`NYASH_NY_PLUGINS_SHARED=1`)で静的定義を共有。ログに REGISTERED を出力。
- Phase C言語結線: `using <ns>``NyModules` 参照→未解決時にファイル/パッケージ解決nyash.linkへフォールバック。
■ 直近で完了したこと(主要抜粋)
- R1: JSON v0 ブリッジ(`--ny-parser-pipe`/`--json-file`)、変換器 `src/runner/json_v0_bridge.rs`、スモーク追加
- R2: ラウンドトリップ E2E`tools/ny_roundtrip_smoke.{sh,ps1}`
- R3: 直結ブリッジ v0`--parser ny`/`NYASH_USE_NY_PARSER=1``NYASH_DUMP_JSON_IR=1`)→ `return (1+2)*3` で 9
- R5: Ny スクリプトプラグイン([ny_plugins]列挙実行OK/FAIL 出力・列挙のみガード付き)
- AOT P2(step1): RUN スモーク配線(最小オブジェクト生成+実行ログ)
- ■ 直近で完了したこと(主要抜粋)
- T0: MIRインタープリタ強化分岐/比較/PHI/extern/Box最小 Runner 観測ログ
- T1: Nyash製ミニパーサ整数/四則/括弧/return→ JSON IR v0 出力
- T2: JSON IR v0 → MIRModule 受け口(`--ny-parser-pipe`
- T3: CLI 切替/ヘルプ(`--ny-parser-pipe`/`--json-file`、mirヘルプ追補
- T4: Docs/Samples/Runner scriptsapps/ny-mir-samples, tools/*, README 追補)
- Phase 15 起点準備
- CLIに `--backend cranelift-aot``--poc-const` を追加(プレースホルダ動作)。
- `src/backend/cranelift/{mod.rs,aot_box.rs,linker_box.rs}` の雛形追加feature gate
- MIR解釈層スケルトン`semantics/eval.rs``backend/mir_interpreter.rs`)の確認
■ 開発者向けクイックメモ
- ビルド
- VM/JIT: `cargo build --release --features cranelift-jit`
- LLVM必要時: `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) cargo build --release --features llvm`
- AOT導入後: `cargo build --release --features cranelift-aot`
- スモークDRYRUN→実行
- `./tools/aot_smoke_cranelift.sh release`
- 実行モード: `CLIF_SMOKE_RUN=1`
- 参照
- Phase 15 概要/ロードマップ: `docs/development/roadmap/phases/phase-15/README.md`, `docs/development/roadmap/phases/phase-15/ROADMAP.md`
- ハンドオフ: `docs/handoff/phase-15-handoff.md`
- 設計/API: `docs/backend-cranelift-aot-design.md`, `docs/interfaces/*`
■ 合否基準P0: Ny→MIR→MIR-Interp→VM 最小成立)
- 自作Nyashパーサ最小サブセットが Nyash で動作し、テスト入力から中間形式(JSON暫定)を生成できる。
- Runner が中間形式を MIRModule に変換し、MIR 解釈層で実行して既知の結果(例: `Result: 42`)を出力する。
- 代表ケース(整数四則演算/括弧/returnで往復が安定。
■ JSON IR v0暫定スキーマ
- version: 整数(例: 0
- kind: 固定 "Program"
- body: 配列Stmt[]
- Stmt最小
- { "type": "Return", "expr": Expr }
- Expr最小
- { "type": "Int", "value": 123 }
- { "type": "Binary", "op": "+"|"-"|"*"|"/", "lhs": Expr, "rhs": Expr }
- error失敗時
- { "version":0, "kind":"Error", "error": { "message": "...", "span": {"start":N, "end":M} } }
-
- `return 1+2*3` → {"version":0,"kind":"Program","body":[{"type":"Return","expr":{"type":"Binary","op":"+","lhs":{"type":"Int","value":1},"rhs":{"type":"Binary","op":"*","lhs":{"type":"Int","value":2},"rhs":{"type":"Int","value":3}}}}]}
- `return (1+2)*3``Binary('*', Binary('+',1,2), 3)` の形で生成
■ 補足(優先/範囲)
- 先行するのは Ny→MIR→MIR-Interp→VM の自己ホスト経路AOTはP2以降
- OS 優先: Windows →(後続で Linux/macOS
- メモリ/GC: P0は整数演算/定数返し中心でNyRT拡張不要。
- Codex 非同期運用: `tools/codex-async-notify.sh``tools/codex-keep-two.sh` 継続利用。
## 実行コマンド(サマリ)
- VM/JIT 実行例
- `printf "Hello\n" | NYASH_CLI_VERBOSE=0 ./target/release/nyash apps/ny-echo/main.nyash`
- `printf "Hello\n" | NYASH_CLI_VERBOSE=0 ./target/release/nyash --backend vm apps/ny-echo/main.nyash`
- AOT スモークPhase 15
- Unix/WSL: `./tools/aot_smoke_cranelift.sh release`
- Windows: `pwsh -File tools/aot_smoke_cranelift.ps1 -Mode release`
- 実行時: `CLIF_SMOKE_RUN=1` を付与
- JSON v0 ブリッジR1 Quick Start
- パイプ実行Unix/WSL: `printf '{"version":0,"kind":"Program","body":[{"type":"Return","expr":{"type":"Binary","op":"+","lhs":{"type":"Int","value":1},"rhs":{"type":"Binary","op":"*","lhs":{"type":"Int","value":2},"rhs":{"type":"Int","value":3}}}}]}' | ./target/release/nyash --ny-parser-pipe`
- ファイル指定Unix/WSL: `./target/release/nyash --json-file sample.json`
- スモークUnix/Windows: `./tools/ny_parser_bridge_smoke.sh` / `pwsh -File tools/ny_parser_bridge_smoke.ps1`
- E2E ラウンドトリップR2
- Unix/WSL: `./tools/ny_roundtrip_smoke.sh`
- Windows: `pwsh -File tools/ny_roundtrip_smoke.ps1`
- tmux通知で並列実行:
- `CODEX_ASYNC_DETACH=1 ./tools/codex-async-notify.sh "./tools/ny_roundtrip_smoke.sh" codex`
- `CODEX_ASYNC_DETACH=1 ./tools/codex-async-notify.sh "pwsh -File tools/ny_roundtrip_smoke.ps1" codex`
- Ny プラグイン列挙R5
- 有効化: `--load-ny-plugins` または `NYASH_LOAD_NY_PLUGINS=1`
- `nyash.toml` 例:
```toml
ny_plugins = [
"apps/std/ny-config.nyash",
"apps/plugins/my-helper.nyash"
]
```
- 実行: 列挙に加え、Interpreterで順次実行ベストエフォート
- ガード: `NYASH_NY_PLUGINS_LIST_ONLY=1` で列挙のみ(実行しない)
- 注意: プラグインスクリプトは副作用の少ない初期化/登録処理に限定推奨。
## トレース/環境変数(抜粋)
- AOT/Link: `NYASH_LINKER`, `NYASH_LINK_FLAGS`, `NYASH_LINK_VERBOSE`
- ABI: `NYASH_ABI_VTABLE=1`, `NYASH_ABI_STRICT=1`
- VM/JIT: `NYASH_VM_PIC_STATS`, `NYASH_JIT_DUMP` など従来通り
---
詳細な履歴や議事録は docs 配下の Phase 15 セクションを参照してください。
- ny-configR4
- `./target/release/nyash apps/std/ny-config.nyash`
- 現状: Interpreter 経路のプラグイン初期化順序により FileBox/TOMLBox を使うには Runner 側の微調整が必要VM 経路への移行 or プラグイン登録の早期化)。スクリプト本体は追加済み。
- 直結ブリッジ v0R3 Quick Start
- `printf 'return (1+2)*3\n' > t.ny && NYASH_USE_NY_PARSER=1 NYASH_DUMP_JSON_IR=1 ./target/release/nyash t.ny`