Files
hakorune/CURRENT_TASK.md
Tomoaki 7d88c04c0e wip(phase15): AOT修正作業中 - Nyプラグインと標準ライブラリ実装
Phase 15のAOT/ネイティブビルド修正作業を継続中。
ChatGPTによるstd実装とプラグインシステムの改修を含む。

主な変更点:
- apps/std/: string.nyashとarray.nyashの標準ライブラリ追加
- apps/smokes/: stdライブラリのスモークテスト追加
- プラグインローダーv2の実装改修
- BoxCallのハンドル管理改善
- JIT hostcall registryの更新
- ビルドスクリプト(build_aot.sh, build_llvm.sh)の調整

まだ修正作業中のため、一部の機能は不完全な状態。

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-06 06:24:08 +09:00

24 KiB
Raw Blame History

CURRENT TASK (Compact) — Phase 15 / Self-HostingNy→MIR→MIR-Interp→VM 先行)

このドキュメントは「いま何をすれば良いか」を最小で共有するためのコンパクト版です。詳細は git 履歴と docs/phase-15を参照してください。

— 最終更新: 20250906 (Phase 15.16 反映, AOT/JIT-AOT 足場強化)

■ 進捗サマリ

  • 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 化)。

【本日更新】

  • VM if/return 無限実行バグを修正(基本ブロック突入時に should_return/next_block をリセット。include 経路のハングも解消。
  • ArrayBox プラグイン生成失敗に対し、v2 ローダへパス解決フォールバック(plugin_paths.search_paths)を追加し安定化。
  • std/string の P0 関数を Ny 実装で追加length/concat/slice/index_of/equals。index_of は substring ループで代替。
  • 残課題: string_smoke で fails 累積の else 側に φ が入らず未定義値参照MIR Builder 側の SSA/φ 振る舞い)。別タスク化。

【ハンドオフ20250906— AOT/JITAOT 足場と箱下寄せリファクタ】

  • 変更サマリ

    • nyrt: AOT 連携の dotted 名を追加Map/String/Any/birth
      • nyash.map.{size_h,get_h,get_hh,set_h,has_h}
      • nyash.string.{len_h,charCodeAt_h,concat_hh,eq_hh,lt_hh} / nyash.any.{length_h,is_empty_h}
      • NewBox/文字列: nyash.instance.birth_name_u64x2, nyash.string.from_u64x2
    • JITAOT(ObjectBuilder):
      • 文字列リテラル→ハンドル生成u64x2 パック → nyash.string.from_u64x2
      • 出力関数を ny_main としてエクスポート
      • 最小 Store/Loadi64を StackSlot で実装
    • Lower箱を下に寄せる最小整理:
      • Map: param 不在でもローカルハンドルがあれば _H シンボルで直呼び
      • Any.length: StringBox は nyash.string.len_h を優先。ローカル/再構築/旧 index の順にフォールバック
      • Copy/Load でローカルハンドルを dst 側 slot に伝播
      • Array.length は ArrayBox 受けに限定ops_ext ガード)
  • 追加スモークJITAOT

    • apps/smokes/jit_aot_string_min.nyashconcat+eq→ PASS
    • apps/smokes/jit_aot_any_isempty_string.nyash → PASS
    • apps/smokes/jit_aot_any_len_string.nyash → 現状 Result: 0後述の未解決
    • apps/smokes/jit_aot_map_min.nyash → 環境により MapBox 生成が必要
  • 実行例

    • 文字列ミニAOT:
      • NYASH_AOT_OBJECT_OUT=target/aot_objects/test_str.o ./target/release/nyash --jit-direct apps/smokes/jit_aot_string_min.nyash
      • cc target/aot_objects/test_str.o -L target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o app_str && ./app_strResult: 1
    • isEmptyAOT:
      • 同様に app_emptyResult: 1
    • Map 最小AOT:
      • .o 生成/リンクは通る。new MapBox() はプラグイン/設定に依存(nyash.toml.so の配置を確認)
  • 未解決 / 既知の課題(優先度高)

    1. String.length の AOT 実行が 0 になるケース
      • 症状: s = new StringBox("abc"); return s.length()Result: 0
      • 現状の対処: Any.length を String.len_h 優先にし、ローカル/再構築/旧 index の順でフォールバック。Const fold も追加済み。
      • 追加方針: 受け型伝播Copy/Load→dst へ型共有)をより堅牢化。最終手段として、ローカルハンドル時に string.len_hany.length_h の二段呼び分け0 返りのときだけ後者)で保険を張る。
    2. MapBox 生成AOT 実行バイナリ)
      • 環境によりプラグイン解決が必要。nyash.toml のあるディレクトリで実行し、必要なら各プラグインを target/release に配置。
  • 次アクション(引き継ぎ TODO

    • Any.length の 0 問題を完全解消
      • 受けの型/ハンドル伝播Copy/Load/Storeを統一ヘルパ化し、length/len/charCodeAt で確実にハンドルを積む
      • StringBox(Const) は定数畳み込みを最優先len を即値化)
      • 保険: string.len_h→0→any.length_h の順にフォールバック(ローカルハンドル時)
    • メソッド→シンボル/引数規約の集中表を作成Array/Map/String/Any
      • ops_ext/core の分岐重複を縮減(箱の責務を「下」に寄せる)
    • AOT スモーク拡充
      • String/Array の length/len を追加、select/分岐のミニ例も用意
      • Map.get/has/setプラグインあり環境用
  • 影響ファイル(主要)

    • 追加/更新: crates/nyrt/src/lib.rsdotted エクスポート多数)、 src/jit/lower/builder/{object.rs,cranelift.rs}src/jit/lower/{core.rs,core/ops_ext.rs,core_hostcall.rs}、 スモーク: apps/smokes/jit_aot_*.nyash

■ ハンドオフJIT AOT / LLVM の現状と次アクション)

  • 現状サマリ

    • Array fastpath: VM 側 len/length を最前段に早期化Void→0 も確認)。
    • Null 互換: NullBox→VMValue::Void へ統一(比較の整合確保)。
    • std/array smoke: NYASH_DISABLE_PLUGINS=1 で PASSlen/push/pop/slice
    • LLVM AOT: 復活nyrt の read lock 寿命修正、build_llvm.sh のリンクパス -L target/release 追加)。
    • JIT AOT(ObjectBuilder): P0 安定化P1 実装済const/return、i64 binop、compare、select、branch/jump、hostcall 基本、PHI最小化ブロック引数
      • jit-direct で .o 生成確認: apps/smokes/jit_aot_arith_branch.nyash → Result 13、.o 出力 OK。
      • build_aot.sh は既定で STRICT=0、出力 target/aot_objects/main.o に固定。
    • nyrt: AOT 連携用 dotted 名 alias を Array に追加(nyash.array.{len_h,get_h,set_h,push_h})。
  • 優先TODO次にやること

    1. JIT AOT P2: hostcall 拡張(規約ベースの最小集合)
      • Map: nyash.map.{size_h,get_h,has_h,set_h} の dotted 名を nyrt に追加(既存実装へ forward
      • String: 代表メソッドlen/concat/substring/indexOf 等)で必要なシンボルを dotted 名として追加
      • ObjectBuilder から emit_host_call_typed で呼び出しLower の対応表に従う)
    2. LowerCore: slot/name→hostcall マッピングbyslot を優先、byname は互換フォールバック)
      • Array/Map/String の最小セットlen/get/set/push、size/get/has/set、len/concat など)
    3. 後続(必要時): JIT AOT スモークを追加分岐あり最小、Array/Map の各1本
  • 実行コマンド(確認用)

    • JIT AOTjit-direct + .o:
      • NYASH_DISABLE_PLUGINS=1 NYASH_JIT_EVENTS=1 NYASH_AOT_OBJECT_OUT=target/aot_objects/jit_aot_arith.o ./target/release/nyash --jit-direct apps/smokes/jit_aot_arith_branch.nyash
    • LLVM AOTemit+link:
      • LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) tools/build_llvm.sh apps/tests/ny-llvm-smoke/main.nyash -o app

■ 現在のフォーカスJITオンリー一旦の着地

  1. Core 緑維持(完了)
    • tools/jit_smoke.sh / Roundtrip(A/B) / Bootstrap(c0→c1→c1') / Using E2E = PASS
  2. CI 分離(完了)
    • Core常時: tools/jit_smoke.sh + Roundtrip
    • Plugins任意: NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.shstrict既定OFF、NYASH_PLUGINS_STRICT=1でON
  3. Selfhost E2E完了
    • ny_plugins 有効 + NYASH_USE_NY_COMPILER=1 の自己ホストE2Eをオプションゲートで運用
  4. クリーンアップ(完了)
    • 未使用import/変数の整理、runner責務分割、tools出力体裁の統一

■ ブランチ/構成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)。

■ 再開TODO優先順

  1. std Ny実装の実体化P0/P1
    • string: length/concat/slice/indexOf/equals → P0 完了string_smoke PASS
    • array: len/push/pop/slice を内蔵経路で先行(次着手)
    • map: get/set/len/keys (+values/entries/forEach)
    • jit_smoke に機能検証を常時化Coreは NYASH_DISABLE_PLUGINS=1
  2. NyコンパイラMVPのsubset拡張
    • let/call/return に続き if/ブロック/関数引数まで拡張し、NYASH_USE_NY_COMPILER=1 スモークを充実
  3. Selfhost E2E ゲートの昇格
    • 連続N回グリーン後にCI optional→requiredへ昇格trace/hash基準
  4. Plugins厳格ONの段階移行
    • Core13準拠サンプルへ置換し、NYASH_PLUGINS_STRICT=1 ゲートで順次ONに復帰

【優先追加 — JIT AOTObjectBuilder安定化・拡張】

  • P0: 安定化(完了)
    • switch_to_block なしでの命令発行panic対策emit_const系
    • 終端命令なしVerifierエラー対策emit_return 実装)
    • build_aot.sh の STRICT 緩和デフォルト0 obj 直指定
  • P1: 最小命令カバレッジ(今すぐ実装)
    • i64 binop: add/sub/mul/div/mod を実コード生成
    • compare: eq/ne/lt/le/gt/ge → b1→i64(0/1) へ正規化してpush
    • 分岐/ジャンプ: br_if_top_is_true/jump_to 実装ブロック遷移とCFG整合
    • select: emit_select_i64 実装cond, then, else の順)
  • P2: hostcall 系の型付き発行(必要最小限)
    • array/map/string/integer の代表 extern を ObjectBuilder に実装
    • ny-llvm-smoke 等に相当する JIT AOT smoke 追加
  • P3: CI スモーク
    • tools/jit_smoke.sh に AOT(JIT)最小タスクを追加STRICT=0 で .o 生成確認)

ブロッカー/暫定対応20250905 更新)

  • 影響範囲Backend差

    • JIT(cranelift) → 影響なし。
    • VM(backends=vm) → if/return 無限ループは修正済み(基本ブロック突入時に CF リセット)。
    • 結論: include ハングの根因は VM の制御フロー残存フラグ。修正により解消。
  • 事象A: include ハング → 解消

    • apps/tmp_len_min.nyash/apps/tmp_len_test.nyash 正常完走を確認。
  • 事象B: ArrayBox プラグイン生成エラー → 解消

    • v2 ローダにフォールバック探索(plugin_paths.search_pathsを追加し、workspace の ./target/release/*.so を自動解決。
    • DEBUG 時に birth 戻り code/out_len をロギング。
  • 事象C: std/string_smoke の最終段で未定義値参照 → 解消

    • MIR Builder の if 降ろしで φ を必ず生成then のみ代入・else 未代入時は pre 値と then 値で合流)。
    • string_smoke PASS を確認。

次アクション(デバッグ計画)

  • A1: includeハング最小化再現を固定VM経路優先で調査

    • apps/tmp_len_test.nyash 固定、NYASH_DEBUG=1execute_include_exprensure_static_box_initialized までの経路にログを追加。
    • included_filesinclude_stack の push/pop と RwLock/RwLock の取り回しを確認。ポップ忘れ/二重ロックがないか検査。
    • apps/std/string.nyash 内のメソッドを段階的に無効化して最小原因を特定(現状 length のみでも再現)。
  • A2: VM if/return 無限実行VM限定を優先修正

    • 症状: JITは1回then→Return→終了。VMはthenのprintが際限なく繰り返される。
    • 再現最小: apps/tmp_if_min.nyash
      static box Main {
        main() {
          local x
          x = 3
          if x == 3 {
            print("ok3")
            return 0
          }
          print("bad")
          return 1
        }
      }
      
      • JIT: ./target/release/nyash apps/tmp_if_min.nyash → 1回だけ ok3, Result:0
      • VM: timeout 4s ./target/release/nyash --backend vm apps/tmp_if_min.nyash → ok3 が無限に出続け TIMEOUT
    • MIRダンプNYASH_VM_DUMP_MIR=1)では if 降下は正しく、then/else 各ブロックは ret を含む。
      • 例: bb1 に extern_call log("ok3") の後 ret 0。bb2 に ret 1
    • 観測ログ(NYASH_VM_DEBUG_EXEC=1)では Print/Const が繰り返し実行。Return の終端処理が機能していない疑い。
    • 仮説: VM 実行ループの制御フロー(execute_function)で ControlFlow::Return を受け取った後の関数脱出が何らかの理由で無効化/上書き/再入している。
    • 着手案:
      • execute_function に短期ログ: 現在ブロックID/terminator種別/should_return セット→関数戻りの分岐をeprintlnNYASH_VM_DEBUG_EXEC=1時
      • execute_instructionReturn ディスパッチ時に明示ログval_id/値を出す現状VTトレースも可
      • previous_block/loop_executor/record_transition で自己遷移が起きていないか確認。
      • BasicBlock::add_instruction にて terminator設定/Successorsの更新は正常コード・MIR上はOK。処理後の next_block 決定ロジックを再点検。

ハンドオフ(変更点・補助情報)

  • 追加ファイルstd MVP + smokes
    • apps/std/string.nyash, apps/std/array.nyash
    • apps/smokes/std/string_smoke.nyash, apps/smokes/std/array_smoke.nyash
  • スクリプト/設定の更新
    • tools/jit_smoke.sh: Std smokes に timeout 15s、ArrayBox未提供時は SKIP を出力
    • tools/smoke_plugins.sh: NYASH_PLUGINS_STRICT=1 のON/OFF表示
    • nyash.toml: ny_plugins に std 2件を追加
    • src/runner/modes/vm.rs: NYASH_VM_DUMP_MIR=1 でVM実行前にMIRをダンプ
    • src/mir/builder/stmts.rs: 末尾 return/throw 後に同ブロックへ更に命令を積まないための早期breakを追加安全強化
  • 再現とログ
    • VM再現: timeout 4s ./target/release/nyash --backend vm apps/tmp_if_min.nyash
    • JIT対照: ./target/release/nyash apps/tmp_if_min.nyash
    • MIRダンプ: NYASH_VM_DUMP_MIR=1 --backend vm ...
    • 命令トレース: NYASH_VM_DEBUG_EXEC=1 --backend vm ...
  • プラグイン/ArrayBox注意
    • 既定でプラグイン経由に迂回するため、未ビルドだと ArrayBox 生成に失敗。
    • 回避: NYASH_USE_PLUGIN_BUILTINS=0 または NYASH_PLUGIN_OVERRIDE_TYPES から ArrayBox,MapBoxを除外。もしくはプラグインをビルド。

すぐ着手できるTODOVM側

  • execute_function にブロック遷移/Return検出ログNYASH_VM_DEBUG_EXEC=1時のみ
  • Return発生時に確実に Ok(return_value) で関数を抜けることを確認(should_return/next_block の上書き防止)
  • record_transition/loop_executor の副作用で自己遷移が起きていないか確認
  • 修正後、apps/tmp_if_min.nyash が VM/JIT 両方で一発終了することを確認MIRダンプ上は既に正しい
  • B1: ArrayBox 経路の選択を明示
    • 手元では NYASH_USE_PLUGIN_BUILTINS=0 で内蔵にフォールバックするか、プラグインを cargo build -p nyash-array-plugin --release で用意。
    • CIは当面 SKIP 維持。

実行メモ(暫定)

  • Std smokes手元で回す
    • NYASH_LOAD_NY_PLUGINS=1 NYASH_USE_PLUGIN_BUILTINS=0 ./tools/jit_smoke.sh
    • またはプラグインをビルドしてから NYASH_LOAD_NY_PLUGINS=1 ./tools/jit_smoke.sh

■ 予定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へフォールバック。

■ 直近で完了したこと主要抜粋JIT

  • 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 出力・列挙のみガード付き)

    • NyModules登録/名前空間導出/Windows正規化の仕様確定・回帰スモーク
    • using/namespaceゲート・nyash.link最小・resolverキャッシュ・実行時フック提案付き診断
  • 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)の確認

■ 再開用クイックメモJITのみ

  • ビルド
    • 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
  • スモークJIT/VM
    • Core: NYASH_DISABLE_PLUGINS=1 NYASH_CLI_VERBOSE=1 ./tools/smoke_vm_jit.sh
    • Parser Bridge: ./tools/ny_parser_bridge_smoke.sh
    • Roundtrip: ./tools/ny_roundtrip_smoke.shA/B
    • Plugins: NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.sh(厳格は NYASH_PLUGINS_STRICT=1 時のみON
    • Bootstrap: ./tools/bootstrap_selfhost_smoke.sh
    • Using/Resolver: ./tools/using_e2e_smoke.sh

■ 状態

  • JIT自己ホストMVP: 到達E2E/ブートストラップ/ドキュメント/CI分離まで完了
  • リファクタ: Step1/2/3 完了未使用掃除・runner分割・tools体裁統一
  • 次回は「std実装の実体化」と「Nyコンパイラsubset拡張」から再開
  • 参照
    • 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/LLVM 系は後段当面OFF

  • 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 で列挙のみ(実行しない)
    • 注意: プラグインスクリプトは副作用の少ない初期化/登録処理に限定推奨。
    • Std Ny スモーク実行(任意): NYASH_LOAD_NY_PLUGINS=1 ./tools/jit_smoke.sh

トレース/環境変数(抜粋)

  • 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