Files
hakorune/docs/development/current/CURRENT_TASK.md
Moe Charm 3d8ba3f3ec fix(jit): NewBoxのJIT安全化とDebugBox Phase 1実装
- NewBoxのJIT扱いを安全化(src/jit/lower/core.rs)
  - NYASH_USE_PLUGIN_BUILTINS=1 && args.is_empty() かつ StringBox/IntegerBox のみJIT許可
  - ArrayBox/MapBox等のプラグインBoxまたは引数ありはunsupportedとしてカウント
  - unsupported>0の関数はJIT対象外となりVM実行にフォールバック(Segfault回避)

- DebugBox Phase 1実装(JITトレース機能)
  - tracePluginCalls(bool)でJITシムトレースON/OFF
  - getJitEvents()で直近のJITイベント取得
  - src/jit/shim_trace.rs追加でトレース基盤実装

- Printのサポート
  - PrintはJIT非対応に戻しVM経路で確実に出力(出力消失解消)

- テストとサンプル追加
  - examples/jit_plugin_invoke_param_array.nyash: 最小JITスモークテスト
  - examples/py_result_*.nyash: Python plugin結果チェーン処理デモ

- PyRuntimeBox拡張
  - str()メソッドでPyObjectのstring表現を取得可能に
  - エラーハンドリング改善とResultチェーンサポート

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-29 13:46:18 +09:00

207 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🎯 CURRENT TASK - 2025-08-29Phase 10.1 革新的転換)
Phase 10.10 は完了DoD確認済。**重大な発見**プラグインシステムを活用したJIT→EXE実現の道を発見
## 🚀 革新的発見プラグインBox統一化
### 核心的洞察
- 既存のプラグインシステムBID-FFIがすでに**完全なC ABI**を持っている
- すべてのBoxをプラグイン化すれば、JIT→EXEが自然に実現可能
- "Everything is Box" → "Everything is Plugin" への進化
## ⏱️ 今日のサマリArray/Map プラグイン経路の安定化→10.2へ)
- 実装: Array/Map のプラグインBID-FFI v1を作成し、nyash.toml に統合
- Lower: `NYASH_USE_PLUGIN_BUILTINS=1` で Array(len/get/push/set), Map(size/get/has/set) を `emit_plugin_invoke(..)` に配線
- サンプル: array/map デモを追加し VM 実行で正常動作確認
- 次: 10.2Craneliftの実呼び出しに着手
## 現在地Done / Doing / Next
- ✅ DonePhase 10.10
- GC Switchable RuntimeGcConfigBox/ Unified DebugDebugConfigBox
- JitPolicyBoxallowlist/presets/ HostCallのRO運用events連携
- CIスモーク導入runtime/compile-events/ 代表サンプル整備
- 🔧 DoingPhase 10.1 新計画)
- NewBox→birthのJIT loweringString/Integer、handleベース
- AOT最小EXE: libnyrt.aシム + ny_main ドライバ + build_aot.sh 整備
- リファクタリング作業は継続core_hostcall.rs完了
- ⏭️ NextPhase 10.1 実装)
- Week1: 主要ビルトインBoxの移行RO中心
- Week2: 静的同梱基盤の設計type_id→nyplug_*_invoke ディスパッチ)
- Week3: ベンチ/観測性整備JIT fallback理由の粒度
- Week4: AOT配布体験の改善nyash.toml/soの探索・ガイド
## リファクタリング計画(機能差分なし)
1) core_hostcall 分割イベントloweremit_host_call周辺
- 追加: `src/jit/lower/core_hostcall.rs`
- `mod.rs`/`core.rs` のモジュール参照を更新
- 確認: `cargo check``bash tools/smoke_phase_10_10.sh`
2) core_ops 分割(算術/比較/分岐)
- 追加: `src/jit/lower/core_ops.rs`
- CLIF配線やb1正規化カウンタは移動のみ
- 確認: `cargo check` → 代表JITデモ2本を手動確認
3) 仕上げ
- 1ファイル ~1000行以内目安を満たすこと
- ドキュメント差分は最小本CURRENT_TASKのみ更新
### DoDRefactor
- `cargo check` が成功し、`tools/smoke_phase_10_10.sh` がGreen
- ログ/イベント出力がリファクタ前と一致(体感差分なし)
- `core.rs`/`builder.rs` の行数削減(目安 < 1000
## Phase 10.1 新計画プラグインBox統一化
- 参照: `docs/development/roadmap/phases/phase-10.1/` 新計画
- 詳細: `docs/ideas/new-features/2025-08-28-jit-exe-via-plugin-unification.md`
- Week1概要
- ArrayBoxプラグイン実装とテスト
- JITPlugin呼び出しパス確立
- パフォーマンス測定と最適化
## Phase 10.5旧10.1Python統合
- 参照: `docs/development/roadmap/phases/phase-10.5/` 移動済み
- ChatGPT5の当初計画を後段フェーズへ
### 進捗10.5a→10.5b 最小実装)
- 新規: `plugins/nyash-python-plugin/` 追加ABI v1動的 `libpython3.x` ローダ
- Box: `PyRuntimeBox(type_id=40)`, `PyObjectBox(type_id=41)` `nyash.toml` に登録
- 実装: `birth/fini`Runtime, `eval/import`Handle返却, `getattr`Handle返却, `call`int/string/bool/handle対応 `callKw`kwargs対応key:stringと値のペア , `str`String返却
- 設計ドキュメント: `docs/development/roadmap/phases/phase-10.5/10.5a-ABI-DESIGN.md`
### ビルド/テスト結果2025-08-29
- Pythonプラグインビルド成功警告ありだが動作問題なし
- 本体ビルド成功Cranelift JIT有効
- プラグインロード成功`libnyash_python_plugin.so` 初期化OK
- `PyRuntimeBox.birth()` 正常実行instance_id=1
- VM側委譲: `PluginBoxV2` メソッドを `PluginHost.invoke_instance_method` に委譲BoxCallでも実体plugin_invoke実行
- E2Eデモ: `py.import("math").getattr("sqrt").call(9).str()` がVM経路で実行`examples/py_math_sqrt_demo.nyash`
- R系API: `evalR/importR/getattrR/callR/callKwR` がResultOk/Errで安定エラーメッセージの保持確認済
- 自動デコードオプトイン: `NYASH_PY_AUTODECODE=1` eval/getattr/call/callKw の数値/文字列/bytesがTLVで直接返る
- kwargs対応: `callKw` 実装TLVで key:string value のペア)、`examples/py_kw_round_demo.nyash` を追加builtins.intで検証
### JIT強化10.2 連携の下ごしらえ)
- 追加: i64シムの戻りdecode拡張I32/I64/Bool/F64[暫定]
- 追加: f64専用シム `nyash_plugin_invoke3_f64` `emit_plugin_invoke` 切替ENV=`NYASH_JIT_PLUGIN_F64`
- 目的: Python含むプラグインのROで数値/Bool/f64選択)」戻りをJIT/AOT経路で受ける足場を整備
- 追加: シムトレースENV=`NYASH_JIT_SHIM_TRACE=1`)とカナリー検査(出力バッファのオーバーラン検出)
- 追加: レシーバ自動解決フォールバックa0<0時はVM引数を走査してPluginBoxV2を特定
### 方針決定Built-inとの関係
- いまはビルトインBoxを削除しない余計な変更を避けプラグイン優先の運用で干渉を止める
- テストCIをプラグイン経路に寄せ十分に安定してから段階的に外す
### 次アクション(小さく通す)
1) DebugBoxPhase 1: JITシムイベント取得getJitEvents/プラグイン呼び出し履歴トレースtracePluginCalls
2) JIT typedシムの拡張: f64の自動選択Lowerer型ヒント)→ Handle/String返却シムの導入ハンドルID/文字列返却
3) AOTスモーク: Python数値戻りの .o 生成をもう1本追加f64/Bool/i64いずれか
4) ガイド: R系APIとNYASH_PY_AUTODECODEの使い分けJITシムトレースの使い方を追記
## すぐ試せるコマンド(現状維持の確認)
```bash
# BuildCranelift込み推奨
cargo build --release -j32 --features cranelift-jit
# Smoke10.10の代表確認)
bash tools/smoke_phase_10_10.sh
# HostCallHH直実行・read-only方針
NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 NYASH_JIT_HOSTCALL=1 NYASH_JIT_EVENTS=1 \
./target/release/nyash --backend vm examples/jit_map_get_param_hh.nyash
NYASH_JIT_THRESHOLD=1 NYASH_JIT_HOSTCALL=1 \
./target/release/nyash --backend vm examples/jit_policy_whitelist_demo.nyash
# GC countingVMパス
./target/release/nyash --backend vm examples/gc_counting_demo.nyash
# compileイベントのみ必要時
NYASH_JIT_EVENTS_COMPILE=1 NYASH_JIT_HOSTCALL=1 NYASH_JIT_EVENTS_PATH=events.jsonl \
./target/release/nyash --backend vm examples/jit_map_get_param_hh.nyash
# Plugin demosArray/Map
(cd plugins/nyash-array-plugin && cargo build --release)
(cd plugins/nyash-map-plugin && cargo build --release)
NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/array_plugin_demo.nyash
NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/array_plugin_set_demo.nyash
NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/map_plugin_ro_demo.nyash
# Python plugin demoPhase 10.5
(cd plugins/nyash-python-plugin && cargo build --release)
NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_eval_demo.nyash
# 追加デバッグTLVダンプ
NYASH_DEBUG_PLUGIN=1 NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_eval_demo.nyash
# math.sqrtデモimport→getattr→call→str
NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_math_sqrt_demo.nyash
# kwargsデモbuiltins.int
NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_kw_round_demo.nyash
# 自動デコードevalの数値/文字列が直接返る)
NYASH_PY_AUTODECODE=1 NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_eval_autodecode_demo.nyash
# JITf64戻りのシム選択: type_id:method_id を指定)
# 例: PyObjectBox.callR(=12) を f64 扱いにする(実験用)
NYASH_JIT_PLUGIN_F64="41:12" NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_math_sqrt_demo.nyash
# kwargsデモbuiltins.int
NYASH_CLI_VERBOSE=1 ./target/release/nyash --backend vm examples/py_kw_round_demo.nyash
## AOT最小EXENew!
```bash
# 1) .o生成Cranelift必須
NYASH_AOT_OBJECT_OUT=target/aot_objects \
NYASH_USE_PLUGIN_BUILTINS=1 NYASH_JIT_EXEC=1 NYASH_JIT_THRESHOLD=1 \
./target/release/nyash --backend vm examples/aot_min_string_len.nyash
# 2) libnyrtビルド + リンク + 実行Linux例
(cd crates/nyrt && cargo build --release)
cc target/aot_objects/main.o -L crates/nyrt/target/release \
-Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o app
./app
# 3) ワンコマンド
bash tools/build_aot.sh examples/aot_min_string_len.nyash -o app
```
## ⏭️ NextPhase 10.2: JIT実呼び出しの実体化
- 目的: Craneliftの `emit_plugin_invoke` を実装しJITでも実体のプラグインAPIを呼ぶ
- 方針:
- シム関数 `extern "C" nyash_plugin_invoke3_i64(type_id, method_id, argc, a0, a1, a2) -> i64` を実装
- a0: 受け手param index負なら未解決
- args: i64 TLV にエンコードして plugin invoke_fn へ橋渡し
- 戻り: TLVi64/Boolの最初の値を i64 に正規化
- CraneliftBuilder: `emit_plugin_invoke` で上記シムを importcall常に6引数
- 対象: Array(len/get/push/set), Map(size/get/has/set) i64 12引数経路
```
### 10.2 追加: AOT接続.o出力
- 新規: `NYASH_AOT_OBJECT_OUT=/path/to/dir-or-file` を指定すると、JITでコンパイル成功した関数ごとに Cranelift ObjectModule で `.o` を生成します。
- ディレクトリを指定した場合: `/<dir>/<func>.o` に書き出し
- ファイルを指定した場合: そのパスに上書き
- 現状の到達性: JITロワラーで未対応命令が含まれる関数はスキップされるため、完全カバレッジ化が進むにつれて `.o` 出力関数が増えます。
- 未解決シンボル: `nyash_plugin_invoke3_i64`(暫定シム)。次フェーズで `libnyrt.a` に実装を移し、`nyrt_*`/`nyplug_*` 記号と共に解決します。
### 10.2b: JITカバレッジの最小拡張ブロッカー解消
- 課題: 関数内に未対応命令が1つでもあると関数全体をJITスキップ現在の保守的ポリシー。`new StringBox()` 等が主因で、plugin_invoke のテストや `.o` 出力まで到達しづらい。
- 対応方針(優先度順)
1) NewBox→birth の lowering 追加(プラグイン birth を `emit_plugin_invoke(type_id, 0, argc=1レシーバ扱い)` に変換)
2) Print/Debug の no-op/hostcall化スキップ回避
3) 既定スキップポリシーは維持しつつ、`NYASH_AOT_ALLOW_UNSUPPORTED=1` で .o 出力だけは許容(検証用途)
- DoD:
- `examples/aot_min_string_len.nyash` がJITコンパイルされ `.o` が出力されるCranelift有効ビルド時
- String/Integer の RO メソッドで plugin_invoke がイベントに現れる
### 現状の診断(共有事項)
- JITは「未対応 > 0」で関数全体をスキップする保守的設計決め打ち。plugin_invoke 自体は実装済みだが、関数がJIT対象にならないと動かせない。
- プラグインはVM経路で完全動作しており、JIT側の命令サポート不足がAOT検証のボトルネック。
## 参考リンク
- Phase 10.1(新): `docs/development/roadmap/phases/phase-10.1/README.md` - プラグインBox統一化
- Phase 10.5旧10.1: `docs/development/roadmap/phases/phase-10.5/README.md` - Python統合
- Phase 10.10: `docs/development/roadmap/phases/phase-10/phase_10_10/README.md`
- プラグインAPI: `src/bid/plugin_api.rs`
- MIR命令セット: `docs/reference/mir/INSTRUCTION_SET.md`
## Checkpoint再起動用メモ
- 状態確認: `git status` / `git log --oneline -3` / `cargo check`
- スモーク: `bash tools/smoke_phase_10_10.sh`
- 次の一手: core_hostcall → core_ops の順に分割、毎回ビルド/スモークで確認