Files
hakorune/CURRENT_TASK.md
Tomoaki a2b89fae7e phase15: update CLAUDE.md and sync with current progress
- Update phase indicator to Phase 15 (Self-Hosting)
- Update documentation links to Phase 15 resources
- Reflect completion of R1-R5 tasks and ongoing work
- Fix CURRENT_TASK.md location to root directory

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 13:29:17 +09:00

9.8 KiB
Raw Blame 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.tomlenv/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.rsrunner/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: ラウンドトリップ E2Etools/ny_roundtrip_smoke.{sh,ps1}

  • R3: 直結ブリッジ v0--parser ny/NYASH_USE_NY_PARSER=1NYASH_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.rsbackend/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)*3Binary('*', Binary('+',1,2), 3) の形で生成

■ 補足(優先/範囲)

  • 先行するのは Ny→MIR→MIR-Interp→VM の自己ホスト経路AOTはP2以降
  • OS 優先: Windows →(後続で Linux/macOS
  • メモリ/GC: P0は整数演算/定数返し中心でNyRT拡張不要。
  • Codex 非同期運用: tools/codex-async-notify.shtools/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 例:
      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