Files
hakorune/CURRENT_TASK.md
Selfhosting Dev dc278d1a84 docs: Phase A完成&LLVM_SYS_180_PREFIX削除ドキュメント更新
📝 重要ドキュメント更新内容:

 CURRENT_TASK.md:
- Phase A真の完成達成を完全反映
- calleeフィールド設定修正、JSON v1統一Call生成完了記録
- FileBoxプラグイン&Core Box統一Call動作確認完了
- LLVM_SYS_180_PREFIX不要性証明を追加

 CLAUDE.md:
- LLVM_SYS_180_PREFIX環境変数削除(Rust LLVMバインディング非使用)
- llvmliteハーネス独立性を明記
- ビルドコマンド簡略化(env LLVM_SYS_180_PREFIX不要)
- 統一Callテストコマンド更新

 Phase 15.5 implementation-status.md:
- Phase A進捗を80%→100%完了に更新
- 総合進捗30%→40%に更新
- Week 2進行中→Phase A完全達成に変更
- llvmliteハーネス成功実績を追加

🎯 技術的成果記録:
- MIR Call命令統一革命第1段階100%達成
- Python独立プロセス安定動作確認
- LLVM環境変数依存完全除去
- FileBox/StringBox/ArrayBox統一Call成功

🚀 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 03:09:47 +09:00

34 KiB
Raw Blame History

Current Task — MIR Architecture Revolution (Design Innovation)

Updated: 20250924

🎯 現在進行中: Phase 15.5 JSON v0中心化・統一Call基盤革命

セルフホスティング前の基盤アーキテクチャ大改革

📋 詳細ドキュメント: Phase 15.5 README

MIR Call命令統一実装 (Phase A進行中)

ChatGPT5 Pro A++設計による6種類Call命令→1つのMirCallへの統一作業

Phase 1-2完了済み2025-09-24

  • MIR定義の外部化とモジュール化
    • src/mir/definitions/ディレクトリ作成
    • call_unified.rs: MirCall/CallFlags/Callee統一定義297行
    • Constructor/Closureバリアント追加完了
    • VM実行器・MIRダンプ対応済み
  • 統一Callメソッド実装完了
    • emit_unified_call()実装CallTarget→Callee変換
    • 便利メソッド3種実装emit_global/method/constructor_call
    • Math関数で実使用開始builder_calls.rs:340-347
    • 環境変数切り替えNYASH_MIR_UNIFIED_CALL=1実装済み
    • ビルドエラー: 0

Phase 3.1-3.2完了2025-09-24

  • Phase 3.1: build_indirect_call_expression統一移行
    • CallTarget::Value使用でindirect call実装
    • 環境変数切り替えで段階移行対応
  • Phase 3.2: print等基本関数のCallee型適用
    • print文をcall_global print()として統一出力
    • ExternCall(env.console.log)→Callee::Global(print)への完全移行
    • build_function_callemit_unified_call使用

Phase 3.3完了: emit_box_or_plugin_call統一化2025-09-24

  • emit_box_or_plugin_call統一実装完了
    • 環境変数NYASH_MIR_UNIFIED_CALL=1で切り替え可能
    • BoxCallをCallTarget::Methodとして統一Call化
    • MIRダンプでcall_method Box.method() [recv: %n]形式出力確認

Phase 3.4完了: Python LLVM dispatch統一2025-09-24

  • Python側のmir_call.py実装
    • 統一MirCall処理ハンドラ作成src/llvm_py/instructions/mir_call.py
    • 6種類のCalleeパターンに対応Global/Method/Constructor/Closure/Value/Extern
    • 環境変数NYASH_MIR_UNIFIED_CALL=1で切り替え可能
  • instruction_lower.py更新
    • op == "mir_call"の統一分岐を追加
    • 既存の個別処理との互換性維持

Week 1完了: llvmlite革命達成2025-09-24

  • 真の統一実装完成 - デリゲート方式→核心ロジック内蔵へ完全移行
    • lower_global_call(): call.py核心ロジック完全移植
    • lower_method_call(): boxcall.py Everything is Box完全実装
    • lower_extern_call(): externcall.py C ABI完全対応
    • lower_constructor_call(): newbox.py全Box種類対応
    • lower_closure_creation(): パラメータ+キャプチャ完全実装
    • lower_value_call(): 動的関数値呼び出し完全実装
  • 環境変数制御完璧動作
    • NYASH_MIR_UNIFIED_CALL=1: call_global print()統一形式
    • NYASH_MIR_UNIFIED_CALL=0: extern_call env.console.log()従来形式

Phase A真の完成達成2025-09-24 02:00-03:00

MIR Call命令統一革命第1段階100%完全達成

  • calleeフィールド設定修正 - emit_unified_call()でCallee型完全設定確認
  • JSON v1統一Call形式生成修正 - mir_call形式完璧生成確認
  • FileBoxプラグイン統一Call対応 - プラグインBox完全対応確認
  • 全Callee型動作確認 - Global/Method/Constructor完全動作、高度機能Closure/Value/Externは Phase 15.5対象外
  • Phase A真の完成テスト・コミット - コミットd079c052完了

技術的達成内容

  • 統一Call生成: 🔍 emit_unified_call: Using unified call for target: Global("print") デバッグログ確認
  • JSON v1出力: {"op": "mir_call", "callee": {"name": "print", "type": "Global"}} 完璧生成
  • プラグイン対応: FileBox constructor/method呼び出し完全統一
  • Core Box対応: StringBox/ArrayBox method呼び出し完全統一
  • スキーマ対応: {"capabilities": ["unified_call"], "schema_version": "1.0"} 完全実装

🎯 llvmliteハーネス + LLVM_SYS_180_PREFIX削除確認

  • LLVM_SYS_180_PREFIX不要性完全証明 - Rust LLVMバインディング非使用確認
  • llvmliteハーネス完全独立性確認 - Python独立プロセスで安定動作
  • 統一Call + llvmlite組み合わせ成功 - LLVMオブジェクト生成完璧動作
  • 実際のLLVMハーネステスト - モックルート回避完全成功!
    • 環境変数設定確立: NYASH_MIR_UNIFIED_CALL=1 + NYASH_LLVM_USE_HARNESS=1
    • オブジェクトファイル生成成功: /tmp/unified_test.o (1240 bytes)
    • 統一Call→実際のLLVM処理確認: printシンボル生成確認
    • CLAUDE.md更新: モックルート回避設定を明記
  • 詳細: Phase A計画

📊 マスタープラン進捗修正2025-09-24 バグ発覚後)

  • 4つの実行器特定: MIR Builder/VM/Python LLVM/mini-vm
  • 削減見込み: 7,372行 → 5,468行26%削減) - 要实装修正
  • 処理パターン: 24 → 483%削減) - 要calleeフィールド完成
  • Phase 15寄与: 全体目標の約7% - Phase A真の完成必須
  • FileBoxプラグイン: 実用統一Call対応の最重要検証ケース
  • 詳細: mir-call-unification-master-plan.md

完了済み基盤タスク

  • PyVM無限ループ完全解決(シャドウイングバグ修正)
  • using system完全実装環境変数8→6に削減
  • Callee型Phase 1実装完了2025-09-23
    • Callee enum追加Global/Method/Value/Extern
    • VM実行器対応完了
    • MIRダンプ改良call_global等の明確表示

🚀 MIR Call命令統一革新改名後に実施

ChatGPT5 Pro A++設計案採用による根本的Call系命令統一

🚀 Phase 15.5: MIR Call命令完全統一A++案)

問題: 6種類のCall系命令が乱立Call/BoxCall/PluginInvoke/ExternCall/NewBox/NewClosure 解決: ChatGPT5 Pro A++案で1つのMirCallに統一

📋 実装ロードマップ(段階的移行)

  • Phase 1: 構造定義 2025-09-24完了
    • Callee enum拡張Constructor/Closure追加済み
    • MirCall構造体追加call_unified.rsに実装
    • CallFlags/EffectMask整備完了
  • Phase 2: ビルダー移行(来週)
    • emit_call()統一メソッド
    • 旧命令→MirCallブリッジ
    • HIR名前解決統合
  • Phase 3: 実行器対応(再来週)
    • VM/PyVM/LLVM対応
    • MIRダンプ完全更新
    • 旧命令削除

🎯 A++設計仕様

// 唯一のCall命令
struct MirCall {
    dst: Option<ValueId>,
    callee: Callee,
    args: Vec<ValueId>,      // receiverは含まない
    flags: CallFlags,        // tail/noreturn等
    effects: EffectMask,     // Pure/IO/Host/Sandbox
}

// 改良版Calleereceiverを含む
enum Callee {
    Global(FunctionId),
    Extern(ExternId),
    Method {
        box_id: BoxId,
        method: MethodId,
        receiver: ValueId,    // ← receiverをここに
    },
    Value(ValueId),
}

📊 現状整理

🔮 Phase 16: using×Callee統合将来課題

usingシステムとCallee型の完全統合

📋 統合計画

  • 現状の問題

    • usingとCalleeが分離別々に動作
    • nyash.*using nyashstdが混在
    • 名前解決が2段階using→Callee
  • 統合後の理想

    // namespace経由の解決
    using nyash.console as Console
    Console.log("hello")  // → Callee::Global("Console.log")
    
    // 明示的インポート
    using nyashstd::print
    print("hello")        // → Callee::Global("print")
    
    // 完全修飾
    nyash.console.log("hello") // → Callee::Extern("nyash.console.log")
    
  • 実装ステップ

    1. HIRでusing解決結果を保持
    2. MirBuilderでusing情報を参照
    3. Callee生成時にnamespace考慮
    4. スコープ演算子::実装

📊 改行処理の状況(参考)

  • Phase 0-2: 完了skip_newlines()根絶済み)
  • Phase 3 TokenCursor: 準備済み(将来オプション)

📊 従来タスク(継続)

  • Strings (UTF8/CP vs Byte): baseline done
  • MiniVM BinOp(+): stabilization complete
  • CI: all green (MacroCtx/selfhost-preexpand/UTF8/ScopeBox)

This page is trimmed to reflect the active work only. The previous long form has been archived at CURRENT_TASK_restored.md.

🎯 設計革新原則Architecture Revolution

  • バグを設計の糧に: シャドウイングバグから根本的アーキテクチャ改良へ昇華
  • ChatGPT5 Pro協働: 人間の限界を超えた設計洞察の積極活用
  • 段階的移行: 破壊的変更回避(Option<Callee>で互換性保持)
  • コンパイル時解決: 実行時文字列解決の排除→パフォーマンス・安全性向上
  • Phase 15統合: セルフホスティング安定化への直接寄与

📚 継続原則featurepause

  • Selfhosting first. Macro normalization preMIR; PyVM semantics are authoritative.
  • 設計革新以外の大型機能追加は一時停止。バグ修正・docs・スモーク・CI・堅牢性は継続。
  • 最小限変更維持。仕様変更は重大問題修正時のみ、オプション経路はdefaultOFFフラグで保護。

Delta (since last update)

  • SelfHost Ny ExecutorMIR→Ny 実行器計画を追加既定OFF・段階導入
    • Docs 追加: docs/development/roadmap/selfhosting-ny-executor.md
    • 目的/原則/フラグ/段階計画/受け入れ/ロールバック/リスクを整理
    • 既定は PyVM。NYASH_SELFHOST_EXEC=1 で Ny Executor に委譲(当面 noop→順次実装
    • Stage 0 実装: スカフォールド + ランナー配線既定OFF/noop
      • 追加: apps/selfhost-runtime/{runner.nyash,mir_loader.nyash,ops_core.nyash,ops_calls.nyash,boxes_std.nyash}(雛形)
      • 配線: src/runner/modes/pyvm.rsNYASH_SELFHOST_EXEC=1 検出時の Ny ランナー呼び出し(子には同フラグを継承しない)
      • 受け入れ: cargo check 緑。既定挙動不変。フラグONで noop 実行exit 0可能。
    • Stage 1 一部: MIR(JSON v0) の最小ローダ実装(要約抽出のみ)
      • apps/selfhost-runtime/mir_loader.nyash: FileBox で読込→JsonDocBox で parse→version/kind/body_len を要約
      • apps/selfhost-runtime/runner.nyash: args[0] の JSON を読み、{version:0, kind:"Program"} を検証NGは非0exit
      • v0 とハーネスJSON{"functions":…})の両フォーマットを受理。--trace で v0 要約/stmt数、ハーネス要約functions数を出力
  • P1 標準箱のlib化完了既定OFF・段階導入
    • 薄ラッパlib実装: apps/lib/boxes/{console_std.nyash,string_std.nyash,array_std.nyash,map_std.nyash}(恒等の薄ラッパ)
    • 自己ホスト実行器の導線: src/runner/modes/pyvm.rs--box-pref=ny|plugin 子引数伝達(既定=plugin
    • BoxCall ディスパッチ骨格: apps/selfhost-runtime/{runner.nyash,ops_calls.nyash} でpref解析・初期化
  • ScopeBox/LoopForm 前処理完了恒等・導線ON
    • 前処理本体恒等apply: apps/lib/{scopebox_inject.nyash,loopform_normalize.nyash}
    • Selfhost Compiler適用: apps/selfhost/compiler/compiler.nyash--scopebox/--loopform 受理→apply後emit
    • Runner env→子引数マップ: src/runner/selfhost.rsNYASH_SCOPEBOX_ENABLE=1--scopebox 変換
  • Smoke 追加(任意実行): tools/test/smoke/selfhost/selfhost_runner_smoke.sh
  • 恒等性確認スモーク追加:
    • ScopeBox恒等: tools/test/smoke/selfhost/scopebox_identity_smoke.sh
    • LoopForm恒等: tools/test/smoke/selfhost/loopform_identity_smoke.sh
  • Identity 確認スモークSelfhost Compiler 直呼び)
    • ScopeBox: tools/test/smoke/selfhost/scopebox_identity_smoke.sh
    • LoopForm: tools/test/smoke/selfhost/loopform_identity_smoke.sh
  • Selfhost Compiler 前処理導線既定OFF
    • 追加: apps/lib/{scopebox_inject.nyash,loopform_normalize.nyash}(恒等版・将来拡張の足場)
    • 配線: apps/selfhost/compiler/compiler.nyash--scopebox/--loopform を受理して JSON を前処理
    • Runner 側: src/runner/selfhost.rs が env→子引数にマップNYASH_SCOPEBOX_ENABLE=1--scopeboxNYASH_LOOPFORM_NORMALIZE=1--loopform
    • 任意: NYASH_SELFHOST_CHILD_ARGS で追加引数を透過
  • ループ内 if 合流の PHI 決定を MIR で正規化(仕様不変・堅牢化)
    • 変更: src/mir/loop_builder.rs
      • then/else の代入変数を再帰収集→合流で変数ごとに PHI/直バインドを決定
      • 到達ブランチのみ incoming に採用break/continue 終端は除外)
      • no_phi_mode では到達 pred に対して edgecopy を生成(意味論等価)
    • 効果: i/printed 等のキャリア変数が合流後に正しく統一。無限ループ/古い SSA 値混入の根治
  • MiniVmPrintsJSON 経路): 出力総数のカウントを安定化(仕様不変)
    • 各 Print ステートメントでの実出力回数を 1 回だけ加算するよう整理Compare を 1/0 直接 print に)
    • 代表プローブ: A/B/7/1/7/5 → count=6 を確認PyVM と一致)
  • JSON provideryyjsonベンダリング完了・切替はランタイム
    • plugins/nyash-json-plugin/c/yyjson/{yyjson.h,yyjson.c,LICENSE} を同梱し、build.rs + cc で自己完結ビルド。
    • env NYASH_JSON_PROVIDER=serde|yyjson(既定=serde。nyash.toml の [env] からも設定可能。
    • yyjson 経路で parse/root/get/size/at/str/int/bool を実装TLVタグは従来準拠。失敗時は安全に serde にフォールバック。
    • JSON スモークparse_ok/err/nested/collect_printsは serde/yyjson 両経路で緑。専用の yyjson CI ジョブは追加しない(不要)。
  • MiniVmPrints 揺れ対応の既定OFF化
    • BinaryOp('+') の 2 値抽出や未知形スキップのフォールバックは「開発用トグル」のみ有効化既定OFF
    • 本線は JSON Box 経路に統一collect_prints_mixed は JSON ベースのアプリに切替)。
  • Plugin v2 (TypeBox) — resolve→invoke 経路の堅牢化(仕様不変)
    • v2 ローダが perBox TypeBox FFI の resolve(name)->method_id を保持し、nyash.toml 未定義メソッドでも動的解決→キャッシュ
    • Unified Host の resolve_method も config→TypeBox.resolve の順で解決
    • 影響範囲はローダ/ホストのみ。既定動作不変、失敗時のフォールバック精度が向上
  • JSON Boxbringup
    • 追加: plugins/nyash-json-pluginJsonDocBox/JsonNodeBox、serde_json backend
    • nyash.toml に JsonDocBox/JsonNodeBox の methods を登録birth/parse/root/error, kind/get/size/at/str/int/bool/fini
    • PyVM 経路: src/llvm_py/pyvm/ops_box.py に最小シムJsonDoc/JsonNodeを追加parse/root/get/size/at/str/int/bool
    • Smoke: tools/test/smoke/selfhost/jsonbox_collect_prints.shA/B/7/1/7/5を追加し緑を確認
  • Using inliner/seam (dev toggles defaultOFF)
    • Resolver seam join normalized; optional brace safety valve addedstrings/comments除外カウント
    • Python combineroptional hook: tools/using_combine.py を追加(--fix-braces/--seam-debug など)
    • mini_vm_core の末尾ブレースを整合(未閉じ/余剰の解消)
    • MiniVm.collect_prints の未知形スキップを Print オブジェクト全体に拡張(停滞防止)
  • Docs
    • Added strings blueprint: docs/blueprints/strings-utf8-byte.md
    • Refreshed docs index with clear "Start here" links (blueprints/strings, EBNF, strings reference)
    • Clarified operator/loop sugar policy in guides/language-core-and-sugar.md ("!" adopted, dowhile not adopted)
    • Concurrency docs (design-only): box model, semantics, and patterns/checklist added
      • docs/proposals/concurrency/boxes.md
      • docs/reference/concurrency/semantics.md
      • docs/guides/box-patterns.md, docs/guides/box-design-checklist.md
  • CI/Smokes
    • Added UTF8 CP smoke (PyVM): tools/test/smoke/strings/utf8_cp_smoke.sh using apps/tests/strings/utf8_cp_demo.nyash (green)
    • Wired into mingate CI alongside MacroCtx smoke (green)
    • Added using mix smoke (PyVM, using ON): tools/test/smoke/selfhost/collect_prints_using_mixed.sh — green
      • Fix: MiniVmBinOp.try_print_binop_sum_any gains a lightweight typeddirect fallback scoped to the current Print slice when expression bounds are missing. Spec unchanged; only robustness improved.
      • Repro flags: default (NYASH_RESOLVE_FIX_BRACES/NYASH_PARSER_STATIC_INIT_STRICT remain available but not required)
    • Added loaderpath dev smoke (MiniVm.collect_prints focus): tools/test/smoke/selfhost/collect_prints_loader.sh(任意/開発用)
    • Added emptyargs using smoke (PyVM, using ON): tools/test/smoke/selfhost/collect_empty_args_using_smoke.sh (uses seam brace safety valve; defaultOFF)
  • Runtime (Rust)
    • StringBox.length: CP/Byte gate via env NYASH_STR_CP=1 (default remains byte length; pausesafe)
    • StringBox.indexOf/lastIndexOf: CP gate via env NYASH_STR_CP=1既定はByte index; PyVMはCP挙動

Notes / Risks

  • PyVM はプラグイン未連携のため、JsonBox は最小シムで対応仕様不変、既定OFFの機能変更なし。将来的に PyVM→Host ブリッジを導入する場合はデフォルトOFFで段階導入。
  • 現在の赤は 2 系統の複合が原因:
    1. Nyash 側の || 連鎖短絡による digit 判定崩れ(→ if チェーン化で解消)
    2. 同一 Box 内の me.* 呼びが PyVM で未解決(→ __me__ ディスパッチ導入)。 付随して、substring(None, …) 例外や print_prints_in_slice のステップ超過が発生。 ここを「me 撤去index ガード+ループ番兵」で仕上げる。

Design DecisionStrings & Delegation

  • Keep StringBox as the canonical text type (UTF8 / Code Point semantics). Do NOT introduce a separate "AnsiStringBox".
  • Separate bytes explicitly via ByteCursorBox/buffer types (byte semantics only).
  • Unify operations through a cursor/strategy interface (length/indexOf/lastIndexOf/substring). StringBox delegates to Utf8Cursor internally; byte paths use ByteCursor explicitly.
  • Gate for transition (Rust only): NYASH_STR_CP=1 enables CP semantics where legacy byte behavior exists.

Implementation Order12 days

  1. Strings CP/Byte baselinefoundation
  • CP smokePyVM: length/indexOf/lastIndexOf/substringapps/tests/strings/utf8_cp_demo.nyash
  • ASCII byte smokePyVM: length/indexOf/substringapps/tests/strings/byte_ascii_demo.nyash
  • Rust CP gate: length/indexOf/lastIndexOf → NYASH_STR_CP=1 でCP既定はByte
  • Docs note: CP gate env (NYASH_STR_CP=1) を strings blueprint に明記
  1. MiniVM BinOp(+安定化StageB 内部置換)
  • 広域フォールバック(全数値合算)を削除(安全化)
  • typed/token/value-pair の局所探索を導入(非破壊)
  • 式境界Print.expression{…} 内で value×2 を確実抽出→加算(決定化)
  • Main.fastpath を追加(先頭で確定→即 return
  • PyVM__me__ ディスパッチ追加/substring None ガード
    • MiniVMme 呼びの全面撤去(関数呼びへ統一)
    • substring 呼び前の index>=0 ガード徹底・print_prints_in_slice に番兵を追加
    • 代表スモークint+int=46を緑化
  1. JSON ローダ分離(導線のみ・互換維持)
  • MiniJsonLoader薄ラッパ経由に集約の導線を適用prints/単一intの抽出に使用→ 後で apps/libs/json_cur.nyash に差し替え可能
  • スモークは現状維持stdin/argv 供給とも緑)
  • loaderpath の検証用スモーク追加dev 任意)
  1. Nyash 箱の委譲(内部・段階導入)
  • StringBox 公開API → Utf8CursorBoxlength/indexOf/substringへ委譲互換を保つ
  • Byte 系は ByteCursorBox を明示利用(混線防止)
  1. CI/Docs polish軽量維持
  • README/blueprint に CP gate を追記
  • Min-gate は軽量を維持MacroCtx/前展開/UTF8/Scope系のみ

MiniVMStageB 進行中)

目的: Nyash で書かれた極小VMMiniVMを段階育成し、PyVM 依存を徐々に薄める。まずは “読む→解釈→出力” の最小パイプを安定化。

現状(達成)

  • stdin ローダ(ゲート): NYASH_MINIVM_READ_STDIN=1
  • Print(Literal/FunctionCall)、BinaryOp("+") の最小実装とスモーク
  • Compare 6種<, <=, >, >=, ==, !=)と int+int の厳密抽出
  • Ifリテラル条件片側分岐の走査

次にやる(順)

  1. JSON ローダの分離(apps/libs/json_cur.nyash 採用準備)
  2. if/loop の代表スモークを 12 本追加PyVM と出力一致)
  • Ifリテラル条件: T/F の分岐出力mini_vm_if_literal_branch_smoke
  • Loop 相当(連続 Print の順序): a,b,c,1,2 の順序確認mini_vm_print_sequence_smoke
  1. MiniVM を関数形式へ移行(トップレベル MVP から段階置換)
  • Entry を薄くargs→json 決定→core.run へ委譲)
  • core.run の単発 Literalstring/int対応を内製
  • 純関数 API 追加: MiniVm.collect_prints(json)(最小: literal対応

受け入れStageB

  • stdin/argv から供給した JSON 入力で Print/分岐が正しく動作(スモーク緑)

UTF8 計画UTF8 First, Bytes Separate

目的: String の公開 API を UTF8 カーソルへ委譲し、文字列処理の一貫性と可観測性を確保(性能最適化は後続)。

現状

  • Docs: docs/reference/language/strings.md
  • MVP Box: apps/libs/utf8_cursor.nyash, apps/libs/byte_cursor.nyash

段階導入(内部置換のみ)

  1. StringBox の公開 API を段階的に Utf8CursorBox 委譲(length/indexOf/substring
  2. MiniVM/macro 内の簡易走査を Utf8CursorBox/ByteCursorBox に置換(機能同値、内部のみ)
  3. Docs/スモークの更新(出力は不変;必要時のみ観測ログを追加)

Nyash スクリプトの基本ボックス(標準 libs

  • 既存: json_cur.nyash, string_ext.nyash, array_ext.nyash, string_builder.nyash, test_assert.nyash, utf8_cursor.nyash, byte_cursor.nyash
  • 追加候補(機能追加ポーズ遵守: libs 配下・任意採用・互換保持)
    • MapExtBoxkeys/values/entries
    • PathBox minidirname/join の最小)
    • PrintfExtStringBuilderBox 補助)

CI/Gates — Green vs Pending

Alwayson期待値: 緑)

  • rustcheck: cargo check --all-targets
  • pyvmsmoke: tools/pyvm_stage2_smoke.sh
  • macrogolden: identity/strings/array/map/loopformkeyorder insensitive
  • macrosmokeslite:
    • match guardliteral OR / type minimal
    • MIR hintsScope/Join/Loop
    • ScopeBoxnoop
    • MacroCtx ctx JSON追加済み
  • selfhostpreexpandsmoke: upper_stringauto engage 確認)

Pending / Skipped未導入・任意

  • Match guard: 追加ゴールデンtype最小形
  • LoopForm: break/continue 降下の観測スモーク
  • MiniVM StageB: JSON ローダ分離 + if/loop 代表スモーク(継続的に強化)
  • UTF8 委譲: StringBox→Utf8CursorBox の段階置換(内部のみ;ゲート)
  • UTF8 CP gate (Rust): indexOf/lastIndexOf envgated CP semantics既定OFF
  • LLVM 重テスト: 手動/任意ジョブのみ(常時スキップ)

80/20 Plan小粒で高効果

JSON / Plugin v2現状に追記

  • v2 resolve→invoke 配線TypeBox.resolve フォールバック + キャッシュ)
  • JsonBox methods を nyash.toml に登録
  • PyVM 最小シムJsonDoc/JsonNodeを追加
  • JSON collect_prints スモーク追加(緑)
  • yyjson ベンダリングード操作実装parse/root/get/size/at/str/int/bool
  • ランタイム切替env NYASH_JSON_PROVIDER)— 既定は serde。yyjson 専用 CI は追加しない。
  • TLV void タグ整合(任意:共通ヘルパへ寄せる)
  • method_id キャッシュの統一化loader 内で Box単位の LRU/Hash で維持)
  • MiniVmPrints フォールバックは開発用トグルのみ既定OFF

Box Std Liblib化計画・共通化

目的

  • VM/PyVM/自己ホスト実行器で共通に使える“最小面の標準箱”を apps/lib に蒸留し、名前と戻り値を統一する意味論不変・既定OFF

置き場Ny libs

  • apps/lib/boxes/{console_std.nyash,string_std.nyash,array_std.nyash,map_std.nyash,path_std.nyash,json_std.nyash}(段階追加)

導線/トグル既定OFF

  • 優先度切替(自己ホスト実行器のみ):NYASH_SELFHOST_BOX_PREF=plugin|ny(既定=plugin
    • plugin: 既存のプラグイン/シムを優先(後方互換)
    • ny: lib/boxes 実装を優先(プラグイン未定義メソッドは安全フォールバック)
  • 導入は include/using ベース(採用側のみ差し替え、広域リネームは行わない)

優先順位(段階導入)

  1. P1高頻度・最小面
    • ConsoleBox: print/println/log → i64status
    • String: length/substring/indexOf/lastIndexOf/esc_json
    • ArrayBox: size/len/get/set/push/toString
    • MapBox: size/has/get/set/toString
  2. P2周辺ユーティリティ
    • PathBox: dirname/joinPOSIX 風)
    • JsonDocBox/JsonNodeBox adaptor: plugin へ薄ラップPyVM シムと同名)
  3. P3補助
    • StringBuilderBox最小/ Pattern helpers既存 libs を整理)

受け入れ基準

  • 既定OFFで挙動不変pref=pluginpref=ny 時も VM/LLVM/PyVM の出力一致。
  • 代表スモークstrings/array/map/path/jsonを green。未実装メソッドは no-op/None で安全に退避。

ロールバック/リスク

  • ロールバックは NYASH_SELFHOST_BOX_PREF=plugin で即時復帰。
  • 命名衝突は採用側の include/using に限定(既存ファイルの広域変更は行わない)。

TODO段階タスク

  • P1: console_std/string_std/array_std/map_std の雛形を追加apps/lib/boxes/
  • P1: 自己ホスト実行器の BoxCall ディスパッチに NYASH_SELFHOST_BOX_PREF を導入(既定=plugin
  • ScopeBox/LoopForm 前処理(恒等版)実装+スモーク
  • 今すぐ推奨: 恒等性スモーク実行(実装検証)
    • tools/test/smoke/selfhost/scopebox_identity_smoke.sh
    • tools/test/smoke/selfhost/loopform_identity_smoke.sh
    • tools/test/smoke/selfhost/selfhost_runner_smoke.sh
  • P1: strings/array/map の最小スモークを selfhost 経路で追加pref=ny
  • P2: path_std/json_std の雛形とアダプタ(プラグイン優先のラップ)
  • P2: path/json のスモークdirname/join、parse/root/get/size/at/str/int/bool
  • P3: string_builder_std と tests の軽量追加(任意)

次フェーズ推奨順序(小粒・安全):

  1. ScopeBox 前処理実装安全包み込み。JSON v0互換維持、If/Loop に "ヒント用余剰キー" 付与)
  2. LoopForm 前処理実装(キー順正規化→安全な末尾整列)
  3. P1 箱スモークpref=ny での一致確認)
  4. Stage2自己ホスト実行器: const/ret/branch 骨格exit code パリティ

Checklist更新済み

  • Selfhost 前展開の固定スモーク 1 本upper_string
  • MacroCtx ctx JSON スモーク 1 本CI 組み込み)
  • Match 正規化: 追加テストは当面維持(必要時にのみ追加)
  • プロファイル運用ガイド追記(--profile dev|lite
  • LLVM 重テストは常時スキップ(手動/任意ジョブのみ)
  • 警告掃除は次回リファクタで一括(今回は非破壊)

Acceptance

  • 上記 2 本preexpand/MacroCtx常時緑、既存 smokes/goldens 緑
  • README/ガイドにプロファイル説明が反映済み
  • UTF8 CP smoke is green under PyVM; Rust CP gate remains optin

Repo / Branches (private)

  • Active: selfhost(作業用), main(既定)
  • Cleanup: 古い開発ブランチacademic-papers / feat/match-type-pattern / selfhosting-devを整理。必要なら再作成可。

SelfHosting — Stage A要約

Scope最小

  • JSON v0 ローダ(ミニセット)/ MiniVM最小命令/ スモーク 2 本print / if

Progress

  • MiniVM MVPprint literal / if branch

  • PyVM P1: String.indexOf 追加

  • Entry 統一(Main.main/ ネスト関数リフト

  • Nextクリーン経路

  • MiniVM: 入口薄化MiniVm.run 呼び一択)— apps/selfhost-vm/mini_vm.nyash を薄いラッパに再編using 前置に依存)

  • MiniVM: collect_prints の混在ケース用スモーク追加echo/itoa/compare/binoptools/test/smoke/selfhost/collect_prints_mixed.sh

  • MiniVM: JSON ローダ呼び出しの段階統一digits/quoted/whitespace を MiniJson に寄せる・第一弾完了)

  • Dev sugar: 行頭 @ = local のプリエクスパンドをランナー前処理に常時組込み(ゼロセマンティクス)

  • MiniVM ソースの @ 採用apps/selfhostvm 配下の入口/補助を段階 @ 化)

  • Runner CLI: clap ArgActionbool フラグを一通り点検・SetTrue 指定panic 回避)

  • Docs: invariants/constraints/testingmatrix へ反映追加(前処理: using前置/@正規化)

  • Docs: Using→Loader 統合メモ(短尺)— docs/design/using-loader-integration.mdREADMEにリンク済

Guardrailsactive

  • 参照実行: PyVM が常時緑、マクロ正規化は preMIR で一度だけ
  • 前展開: NYASH_MACRO_SELFHOST_PRE_EXPAND=autodev/CI
  • テスト: VM/goldens は軽量維持、IR は任意ジョブ

PostBootstrap BacklogDocs only

  • Language: Scope reuse blocksdesign — docs/proposals/scope-reuse.md
  • Language: Flow blocks & -> pipingdesign — docs/design/flow-blocks.md
  • Guards: Range/CharClass sugarreference — docs/reference/language/match-guards.md
  • Strings: toDigitOrNull / toIntOrNulldesign note — docs/reference/language/strings.md
  • Concurrency: Box modelRoutine/Channel/Select/Scope — docs/proposals/concurrency/boxes.md
  • Concurrency semanticsblocking/close/select/trace — docs/reference/concurrency/semantics.md

Nyash VM めど後 — 機能追加リンク(備忘)

  • スコープ再利用ブロックMVP 提案): docs/proposals/scope-reuse.md
  • 矢印フロー × 匿名ブロック(設計草案): docs/design/flow-blocks.md
  • Match Guard の Range/CharClass参照・設計: docs/reference/language/match-guards.md
  • String 便利関数toDigit/Int; 設計): docs/reference/language/strings.md

Trigger: nyash_vm の安定主要スモーク緑・自己ホスト経路が日常運用。達成後に検討→MVP 実装へ。

Next Up (Parity & Using Edge Smokes)

  • Parity quick harness任意: tools/smokes/parity_quick.sh で代表 apps/tests を PyVM vs llvmlite で比較
  • Using エッジケース: 相互依存/相対パス混在/alias のスモーク追加apps/tests + tools/test/smoke/using/edge_cases.sh
  • Using 混在スモークの緑化仕上げPyVM
    • MiniVmPrints.print_prints_in_slice の binop/compare/int リテラル境界obj_end/p_obj_endを調整
    • ArrayBox 経路の size/get 依存を避け、直接 print する経路の安定化を優先
    • 再現フラグ(開発のみ): NYASH_RESOLVE_FIX_BRACES=1 NYASH_PARSER_STATIC_INIT_STRICT=1

Next Up (JSON line)

  • TLV void タグの統一(任意)
  • method_id 解決キャッシュの整備・計測
  • YYJSON backend のスケルトン追加既定OFF・プラグイン切替可能設計
  • JSON smokes をCI最小ゲートへ追加
  • SelfHost自己ホスト実行器
    • Stage 0: フラグ/ランナー配線のみnoop Ny runner
    • Stage 1: MIR ローダJSON→構造体
    • Stage 2: コア命令const/binop/compare/branch/jump/ret/phi
    • Stage 3: call/externcall/boxcallMVP
    • Stage 4: Array/Map 最小メソッド
    • Stage 5: using/seam 代表ケース安定化
    • Stage 6: パリティハーネス/CI非ブロッキング→昇格

SelfHost フラグ/戻し手順(記録)

  • フラグ既定OFF
    • NYASH_SELFHOST_EXEC=1: Ny Executor を有効化
    • NYASH_SELFHOST_TRACE=1: 追跡ログ
    • NYASH_SELFHOST_STEP_MAX: ステップ上限
    • NYASH_SELFHOST_STRICT=1: 厳格モード
  • ロールバック: フラグ OFF で即 PyVM に復帰(既定)。差分は最小・局所で導入。

Notes (Stage 0 wiring)

  • Rust 側は MIR(JSON) を tmp/nyash_selfhost_mir.json に出力→Ny ランナーapps/selfhost-runtime/runner.nyashへ引き渡し。
  • 子プロセスへは NYASH_SELFHOST_EXEC を伝播しない(再帰配線を防止)。
  • 現段階の Ny ランナーは noop で 0 を返す。次ステージでローダ/ディスパッチを追加。