165 lines
8.8 KiB
Markdown
165 lines
8.8 KiB
Markdown
# Phase 20.10 — Tasks (Script‑First Runner)
|
||
|
||
Status: In progress
|
||
|
||
Objectives
|
||
- Move orchestration/runner logic towards Hakorune scripts while keeping execution backends unchanged.
|
||
- Manage extern/effects and CLI/ENV policies with clear contracts and gates.
|
||
|
||
Focus Areas (Python は当面除外)
|
||
1) 実行エンジンとランナー(方針・調停部分のみ)
|
||
- Rust VM 本体・MIR インタプリタ(据え置き): `src/backend/mir_interpreter/*`, `src/runtime/*`
|
||
- バックエンド/実行選択・ランナー: `src/runner/*`, `src/cli/args.rs`
|
||
- Plan (20.10): Script Runner facade(lang側)を追加し、エントリ/前後処理を段階移譲(Gate: 既定ON・`HAKO_SCRIPT_RUNNER=0`でopt‑out)。
|
||
|
||
2) Extern/効果解決(VM ルート)
|
||
- Extern アダプタ/レジストリ: `src/backend/mir_interpreter/extern_adapter/*`
|
||
- 既存の最小 ABI 基本ルート: `src/runtime/method_router_box/abi_basic.rs`
|
||
- Plan (20.10): SSOT(`specs/externs.toml`)の雛形と検出スクリプト(WARN)を追加。C‑ABI (`hako_*`) 経由の原則を再確認。
|
||
|
||
3) CLI/ENV/設定
|
||
- 追加 CLI(quiet-result/using/macro/llvm-exe)と ENV エイリアス: `src/cli/args.rs`
|
||
- 環境読み出し/feature gates: `src/config/env/*`
|
||
- using 解決/モジュール: `src/using/*`, `src/runner/modes/common_util/resolve/*`
|
||
- Plan (20.10): ドキュメントを一本化(`docs/guides/env-variables.md` を正)。Envは補助、CLIが正。
|
||
|
||
4) LLVM ツールチェーン(AOT)
|
||
- Rust バイナリ: `crates/nyash-llvm-compiler`
|
||
- llvmlite 降ろし(Python): `src/llvm_py/*`(対象外・据え置き)
|
||
|
||
Deliverables(20.10)
|
||
- [x] Script Runner facade(lang/)
|
||
- [x] externs SSOT 生成スクリプト(tools/dev/run_gen_externs.sh)
|
||
- [ ] externs SSOT の雛形(specs/externs.toml)+差分WARNスクリプト
|
||
- [ ] ENV/CLIガイドの更新(HAKO_* 優先・エイリアス表)
|
||
- [ ] Dotted C symbol チェックの STRICT 化準備(ドキュメント)
|
||
|
||
Add‑ons(runner/SSOT 安定化)
|
||
- [x] Runner pre‑invoke の短文(stdout)を固定(invoke / invoke: FAIL)
|
||
- [x] Trace 行(START/DONE)を env ゲートで追加(`HAKO_SCRIPT_RUNNER_TRACE=1`)
|
||
- [x] workspace‑only 代表スモーク(quick/integration-core)を追加
|
||
- [x] dev トグル `HAKO_SCRIPT_RUNNER_FORCE_FAIL` を追加(TTL;FAIL 行の観測用)
|
||
- [x] externs の SSOT(effects)の取り込み導線を追加(env ゲート `HAKO_EXTERN_EFFECTS_SSOT=1`、Io だけ反映)
|
||
- [x] compare(lang) counts の観測(VM counts と lang stats を2行出力、スモーク整合)
|
||
- [x] resolve/1 最小形状(空形状)の言語側導線(観測用・挙動不変)
|
||
- [x] SSOT 生成のCI統合(build-only;STRICT_ALWAYS/CI_GEN_EXTERN_SSOTで生成→drift fail)
|
||
|
||
---
|
||
|
||
## 脱Rust 優先プラン & チェックリスト(20.10)
|
||
|
||
目標(ゴール)
|
||
- `lang/bin/hakorune`(Hakorune スクリプト由来の自己ホストバイナリ)をリポジトリ内に配置し、代表スモークを緑に保つ。
|
||
|
||
### 1) Runner 既定化(ゲート解除の準備)
|
||
- Plan
|
||
- workspace-only 導線を代表化(override 依存を縮小)
|
||
- TRACE/FAIL 注入の TTL を撤去(Docs/Smokes からの参照整理)
|
||
- 短文の最終版(invoke / invoke: FAIL)を固定
|
||
- Checklist
|
||
- [x] quick/integration-core: workspace-only 代表が恒常 PASS
|
||
- [x] TTL トグルの撤去(trace/force-fail)— スモークは短文観測のみ
|
||
- [x] Gate 既定ON・OFF時は静穏(opt‑out: HAKO_SCRIPT_RUNNER=0)
|
||
- DoD
|
||
- Gate を OFF しても既存挙動不変/ON 時は短文が安定出力
|
||
|
||
### 2) Using Resolver 前段を lang へ
|
||
- Plan
|
||
- メタResolver Box(公開名=SSOT)で `resolve/1` を Runner から呼べる導線を追加
|
||
- workspace→override の順に優先、private/aliases/衝突を Fail‑Fast
|
||
- Checklist
|
||
- [ ] メタResolver Box の公開名/SSOT を Docs に固定
|
||
- [ ] Runner から ModuleFunction 呼び出しで前段解決(代表1本 PASS)
|
||
- [ ] 既存 Rust 側の前処理は “検証/整流” に限定(重複はWARN→撤去)
|
||
- DoD
|
||
- using 解決の決定(方針/診断)が lang 側で一貫し、Rust は検証に専念
|
||
|
||
### 3) SSOT 完全一本化
|
||
- Plan
|
||
- extern/効果の読み込みを生成物(specs/externs.toml → Python/Rust)へ統一
|
||
- STRICT(drift=FAIL)の継続運用
|
||
- Checklist
|
||
- [x] Rust 側 effects 参照を ssot_generated に切替(既定)
|
||
- [x] 生成スクリプト tools/dev/run_gen_externs.sh を追加(specs→Python/Rust)
|
||
- [x] externs_ssot_check のローカルPASS(STRICT=1で運用可能)
|
||
|
||
---
|
||
|
||
## 残タスク(Remaining)
|
||
|
||
Runner / UsingResolver(安全な段階移行)
|
||
- [x] Shadow: DIFFの詳細化(`DIFF=aliases:X modules:Y paths:Z`)
|
||
- [x] Compare(lang): VM counts と lang stats の一致を観測(スモーク整合)
|
||
- [x] Compare: ModuleFunction結果のJSON1行出力(lang側 stats)+ VM側 stats を Runner が出力(挙動不変)
|
||
- 備考: 比較はスモーク側で実施(短文を安定維持)。shapeの厳密比較は将来の実値導入後に検討。
|
||
- [ ] 代表負例スモークの拡充(未存在/衝突/プライベート)— 比較/シャドウでの観測
|
||
|
||
UsingResolver(lang実装の充実)
|
||
- [x] resolve/1 の最小形状(空形状)を返す導線(観測用・挙動不変)
|
||
- [ ] using_paths/modules/aliases/packages/policy の実値構築(plugins無効環境でも最小が動作)
|
||
- [ ] host-slot依存の最小ガード(Box側での安全化)
|
||
|
||
SSOT(運用の固定化)
|
||
- [x] 生成スクリプトのCI統合(build-only)
|
||
- [ ] Python/Rustの参照経路を生成物に統一(残存定義の撤去/WARN化)
|
||
|
||
C‑ABI AOT(可搬性)
|
||
- [x] macOS/Windows のスモーク有効化(依存検出+実行;不足時はSKIP)
|
||
- [x] ny-llvmc呼出失敗時の詳細取込み(stderr→短文化)
|
||
|
||
Docs
|
||
- [ ] runner-facade.md に Shadow/Compare のDIFF出力仕様を追記(実装後)
|
||
- [ ] c-abi-aot.md にWindows/mingwの依存補足(lld/CRTの注意)
|
||
|
||
## 受け入れ基準(Acceptance)
|
||
- Runner(既定ON): quick/integration-core の代表が安定PASS(invoke/workspace-only)。
|
||
- UsingResolver: Shadow/Compare が quick/core で観測可能(DIFF=0が既定)。
|
||
- SSOT: externs drift=0(ローカル/CIでSTRICT)。
|
||
- C‑ABI: Linux/Darwinの代表スモークが依存整備環境でPASS(他OSはSKIP)。
|
||
- DoD
|
||
- 生成系のみで Python/Rust の乖離が発生しない(drift=0 を維持)
|
||
|
||
### 4) Selfhost Compiler 最小パス
|
||
- Plan
|
||
- const/binop/compare/ret/phi の emit を lang 側に実装(最小 JSON→MIR(JSON))
|
||
- Rust 側は Verify/整形に寄せる(意味論追加は行わない)
|
||
- Checklist
|
||
- [ ] lang 側最小 emitter で `const,binop,compare,ret,phi` の代表スモーク PASS
|
||
- [ ] Rust Verify を用いた形状検証が GREEN
|
||
- [ ] 既存 VM/LLVM 実行と出力パリティを代表で確認
|
||
- DoD
|
||
- 最小 MIR(JSON) 生成が lang 側のみで完結、Rust は検証に留まる
|
||
|
||
### 5) AOT C API の最小2関数(compile/link)
|
||
- Plan
|
||
- `compile(json_v0)->obj`, `link(obj)->exe` の C ABI を薄く定義(ヘッダ+実装)
|
||
- lang/build から呼び出す最小サンプルを同梱
|
||
- Checklist
|
||
- [ ] hako_hostbridge.h にプロトタイプ追記(所有権/戻り値/エラー)
|
||
- [ ] canary 実装(linker flags ガイド含む)が quick 代表1本 PASS
|
||
- [ ] Windows/macOS CRT 注意(hako_mem_free 以外禁止)の Docs 追記
|
||
- DoD
|
||
- C ABI の 2 関数で AOT 経路の基本が成立、配布ガイドが明文化
|
||
|
||
|
||
Gates
|
||
- `HAKO_SCRIPT_RUNNER`(既定ON。`0|off|false` で無効化)
|
||
- `HAKO_SCRIPT_RUNNER_TRACE=1`(runner pre‑invoke の START/DONE 行)
|
||
- `HAKO_SCRIPT_RUNNER_FORCE_FAIL=1`(dev限定;FAIL 短文を強制;TTL)
|
||
- `HAKO_EXTERN_EFFECTS_SSOT=1`(extern effects を SSOT から反映;Io のみ)
|
||
- `CI_STRICT=1`(lint類をFAIL化)
|
||
|
||
TTL / 移行計画(runner)
|
||
- `HAKO_SCRIPT_RUNNER_FORCE_FAIL` と `HAKO_SCRIPT_RUNNER_TRACE` は bring‑up 期間限定の dev トグル。
|
||
- TTL(目安): Phase‑20.10 の runner 配線が安定したら 1 リリース後に削除。
|
||
- 撤去手順: スモークから参照を削除 → 短文観測のみを維持(invoke / invoke: FAIL)。
|
||
|
||
STRICT への段階導入(externs)
|
||
- まずは `tools/ci/run_local_checks.sh` の WARN 運用を継続。
|
||
- `CI_STRICT=1`(or `CI_STRICT_ALWAYS=1`)でドライランし、差分ゼロを確認。
|
||
- 問題なければ CI 本線で STRICT 化(WARN→FAIL)へ移行。
|
||
|
||
Notes
|
||
- Extern は C‑ABI (`hako_*`) 経由で統一。dotted シンボルは IR まで(AOTへは流さない)。
|
||
- Python は据え置き。Rust VM/LLVM の本番経路は維持しつつ、上位調停をスクリプトへ段階移譲。
|