Files
hakorune/docs/development/current/CURRENT_TASK.md

327 lines
20 KiB
Markdown
Raw Normal View History

# 🎯 CURRENT TASK - 2025年8月25日状況整理
## ⏱️ 再開ショートカット(今日のフォーカス)
- フォーカス: Phase 9.78h MIR前提整備P2P/Cranelift前の総仕上げ
- 目標: MIR26命令の凍結・SSA/Verifier/Optimizer/VM整合・軽量スナップショット体制を完了
- 参照: `docs/development/roadmap/phases/phase-9/phase_9_78h_mir_pipeline_stabilization.md`
### 直近の実行タスク9.78h
1) Builder移行完了命令フィールド名/効果一致: `function→func`, `arguments→args`
2) Loop SSA復帰Phi挿入・seal・predecessor更新の段階適用
3) TypeOp網羅is/as/isType/asType早期lowering + Optimizer安全ネット強化
4) MIR26統合TypeOp/WeakRef/BarrierとPrinter/Verifier/Optimizer整合
5) VM補強and/or短絡扱いの確定と実装/BoxRef×BoxRef演算
6) 軽量スナップショット + CLI分離テスト + ResultBox移行の仕上げ
### すぐ試せるコマンド
```bash
cargo build --release -j32
nyash --dump-mir --mir-verbose local_tests/typeop_is_as_func_poc.nyash | sed -n '1,160p'
NYASH_OPT_DIAG_FAIL=1 nyash --dump-mir --mir-verbose local_tests/typeop_diag_fail.nyash || echo DIAG BLOCKED
tools/ci_check_golden.sh # 代表ケースのMIR含有チェック
```
### 重要リンク(唯一参照/ゲート)
- 命令セット唯一出典・26命令: `docs/reference/mir/INSTRUCTION_SET.md`
- 9.78h(本フェーズ詳細): `docs/development/roadmap/phases/phase-9/phase_9_78h_mir_pipeline_stabilization.md`
- 9.79P2P本体 前提: 9.78h完了): `docs/development/roadmap/phases/phase-9/phase_9_79_p2pbox_rebuild.md`
- Phase 10Cranelift JIT主経路: `docs/development/roadmap/phases/phase-10/phase_10_cranelift_jit_backend.md`
## 🚨 現在の状況2025-08-25
### ✅ 完了したタスク
1. **✅ MIRビルダーリファクタリング完了🎉**2025-08-25
- mir/builder.rs: 1547行の大規模モジュール → **モジュール分割完了**
- 新構造: `src/mir/builder/` ディレクトリ
- `mod.rs`: 公開API定義
- `core.rs`: MirBuilder本体 + コア機能 (205行)
- `expressions.rs`: 式変換処理 (621行) - 18関数実装済み
- `statements.rs`: 文変換処理 (165行) - 6関数実装済み
- `control_flow.rs`: 制御フロー構築 (194行) - 4関数実装済み
- `box_handlers.rs`: Box関連処理 (73行) - 2関数実装済み
- **ビルド確認**: 新構造でコンパイル正常完了 ✅
- **総移動関数数**: 30関数ヘルパー関数含む
- **行数削減**: 元の1547行から分割により読みやすさ大幅向上
- **コミット完了**:
- Phase 3-5: cc2a5c2 (expressions.rs)
- Phase 6-8: 29af5e1 (statements/control_flow/box_handlers)
2. **✅ VMモジュールのリファクタリング完了**2025-08-25
- execute_instruction関数を29個のハンドラーに分割
- vm_instructions.rsモジュール作成487行
- execute_instruction_old削除691行削減
- vm.rs: 2075行→1382行33%削減)
### 🆕 進捗2025-08-25 夜)
- VM and/or 対応の実装を追加(短絡評価は `as_bool()` 強制で統一、`BoxRef(IntegerBox)` の四則演算にも対応)。
- ゴールデンTypeOp代表2ケースは緑のまま、Optimizer診断未lowering検知も動作確認済み。
- ただし、VM実行時に `And``execute_binop` の短絡ルートに入らず、`execute_binary_op` の汎用経路で `Type error: Unsupported binary operation: And ...` が発生。
- 兆候: `NYASH_VM_DEBUG_ANDOR` のデバッグ出力が出ない=`execute_binop` に入っていない、または別実装ルートを通過している可能性。
- 仮説: 古いVM経路の残存/リンク切替、もしくは実行時に別ビルド/別profileが使用されている。
### 🎯 次の優先タスク
1. **copilot_issues.txtの確認**
- Phase 8.4: AST→MIR Lowering完全実装最優先
- Phase 8.5: MIRダイエット35命令→20命令
- Phase 8.6: VM性能改善0.9倍 → 2倍以上
1.5 **VM実行経路の特定と修正最優先**
- `runner.rs → VM::execute_module → execute_instruction → execute_binop` の各段でデバッグログを追加し、`BinOp(And/Or)` がどこで分岐しているか特定。
- バイナリ一致確認: `strings` によるシグネチャ(デバッグ文字列)含有の照合で実行バイナリを同定。
- 代替経路の洗い出し: `src/` 全体で `execute_binop`/`And`/`Unsupported binary operation` を再走査し、影響箇所を一掃。
- 修正後、`local_tests/and_or_vm.nyash``false/true` の出力を確認。
2. **MIR26命令対応**
- TypeOp/WeakRef/Barrierのプリンタ拡張
- スナップショット整備
- vm-stats差分確認
3. **Builder適用拡大**
- 言語 `is/as` 導線の実装
- 弱参照フィールドのWeakLoad/WeakNew対応
- 関数スタイル `isType/asType` の早期lowering強化
## 🗺️ 計画の粒度(近々/中期/長期)
### 近々12週間
- Loop SSA復帰: `loop_api` 小APIを活用し、Phi挿入・seal・predecessor更新を段階適用。簡易loweringを正しいSSAに置換。
- Builder移行完了: `builder.rs`の機能を`builder_modularized/*`へ移し切り、両者の差分(命令フィールド名・効果)を完全一致。
- TypeOp網羅: `is/as`/`isType/asType`の早期loweringを再点検、Optimizer診断未lowering検出を有効化し回帰を防止。
- 軽量スナップショット: MIRダンプverboseに対する含有チェックを代表ケースTypeOp/extern_call/loop/await/boxcallへ拡張。
### 中期34週間
- WeakRef/Barrier統合: loweringWeakNew/WeakLoad/Barrier導線を整理、統合命令フラグON/OFFでMIR差を固定化。Verifierに整合チェック追加。
- MIR26整合化: Printer/Verifier/Optimizerの26命令前提をそろえ、効果の表記・検証を強化。
- CLI分離テスト: ワークスペース分割 or lib/binaryテスト分離で、`cargo test -p core` のみで回る導線を確立CLI構成変更で止まらない
- ResultBox移行: `box_trait::ResultBox` 参照を `boxes::ResultBox` へ一掃し、レガシー実装を段階的に削除。
### 長期Phase 8.48.6連動)
- AST→MIR Lowering完全化8.4: すべての言語要素を新MIRへ安定lower。未対応分岐をゼロに。
- MIRダイエット8.5: 命令の統一・簡素化TypeOp/WeakRef/Barrierの統合効果を活用し最小集合へ。
- VM性能改善8.6: Hot-pathBoxCall/Array/Map高速化、And/OrのVM未実装の解消、BoxRef演算の抜けを補完。
### Phase 10 着手ゲートCranelift前提条件
- [ ] MIR26整合化完了Printer/Verifier/Optimizerが26命令で一致・効果表記統一
- [ ] Loop SSA復帰Phi/Seal/Pred更新がVerifierで合格
- [ ] TypeOp網羅is/as/isType/asTypeの早期loweringOptimizer診断ONで回帰ゼロ
- [ ] 軽量スナップショット緑TypeOp/extern_call/loop/await/boxcall 代表ケース)
- [ ] P2PBox再設計Phase 9.79完了・E2Eパス
- [ ] CLI分離テスト`cargo test -p core`)が安定実行
### ⚠️ トラブルートVM and/or 追跡用)
- 症状: `--backend vm``And``execute_binop` の短絡パスを経由せず、`execute_binary_op` 汎用パスで `Type error`
- 状況: `MIR --dump-mir` では `bb0: %X = %A And %B` を出力BuilderはOK
- 差分検証: `execute_instruction`/`execute_binop` に挿入したデバッグ出力が未出力→実行経路の相違が濃厚。
- 対応: 実行バイナリの署名チェックとコードパスの網羅的ログ追加でルート確定→修正。
### ⚠️ MIRビルダー引き継ぎポイントChatGPT5さんへ
- **状況**: MIRビルダーのモジュール化完了Phase 1-8コミット済み
- **問題**: MIR命令構造の変更により、expressions.rsでエラー発生
- `Call`命令: `function``func`, `arguments``args`
- `ArrayAccess`, `ArrayLiteral`, `Await`ノードが削除?
- effectsフィールドの有無が命令により異なる
- TypeOpKindのインポートパスエラー
- loop_builder.rsでのプライベートフィールドアクセス問題
- **現在の対応**:
- builder_modularizedディレクトリに一時退避
- 元のbuilder.rsでフルビルド可能な状態に復帰
- ChatGPT5さんのMIR命令変更に合わせた調整が必要
2. **VMの既知の問題**
- 論理演算子and, orがBinOpとして未実装
- エラー: `Type error: Unsupported binary operation: And on Bool(true) and Bool(false)`
- インタープリターでは動作するがVMで動作しない
- **新発見**: BoxRef(IntegerBox) + BoxRef(IntegerBox)のような演算も未対応
- execute_binary_opにBoxRef同士の演算ケースが不足
## ✅ 直近の完了
1. VMモジュールのリファクタリング完了2025-08-25
- execute_instruction関数を29個のハンドラーに分割
- vm_instructions.rsモジュール作成487行
- execute_instruction_old削除691行削減
- vm.rs: 2075行→1382行33%削減)
2. ドキュメント再編成の完了(構造刷新)
2. VM×プラグインのE2E整備FileBox/Net
- FileBox: open/write/read, copyFrom(handle)VM
- Net: GET/POSTVM、404/500Ok(Response)、unreachableErr(ErrorBox)
3. VM命令カウンタ時間計測のCLI化`--vm-stats`, `--vm-stats-json`とJSON出力対応
- サンプル/スクリプト整備tools/run_vm_stats.sh、local_tests/vm_stats_*.nyash
4. MIR if-merge 修正retがphi dstを返す Verifier強化mergeでのphi未使用検知、支配関係チェック導入
5. VMの健全化分岐・比較・Result
- Compare: Void/BoolのEq/Ne定義順序比較はTypeError
- Branch条件: `BoxRef(BoolBox)→bool``BoxRef(VoidBox)→false``Integer≠0→true`
- ResultBox: 新旧両実装への動的ディスパッチ統一isOk/getValue/getError
6. VMビルトイン強化Array/Map/Socket
- ArrayBox/MapBox: 代表メソッドをVM統合ディスパッチで実装push/get/set/size等
- SocketBox: `acceptTimeout(ms)`void/ `recvTimeout(ms)`(空文字)を追加
- E2E追加: `socket_timeout_server.nyash` / `socket_timeout_client.nyash`
7. E2E拡張Net/Socket
- HTTP: 大ボディ取得クライアント `local_tests/http_big_body_client.nyash`
- Socket: 反復タイムアウト検証 `local_tests/socket_repeated_timeouts.nyash`
- インタープリタ: SocketBoxの `acceptTimeout/recvTimeout` を結線
8. VM/MIRの健全化Builder/VM
- Compare拡張: Float/Int-Float混在をサポートEq/Ne/Lt/Le/Gt/Ge
- TypeOp(Check)最小意味論実装Integer/Float/Bool/String/Void/Box名
- ArrayGet/ArraySetVM本実装ArrayBox.get/setへ橋渡し
- Array/Mapをidentity扱いclone_or_shareがshareを選択
- BoxCallにArrayBox fast-pathBoxRefからget/set直呼び
- me参照の安定化fallback時に一度だけConstを発行しvariable_mapに保持
- デバッグ: `NYASH_VM_DEBUG_BOXCALL=1` でBoxCallの受け手/引数/経路/結果型を標準エラーに出力
9. ドキュメント追加・更新
- MIR→VMマッピング分岐条件の動的変換、Void/Bool比較
- VM READMESocketBoxタイムアウト/E2E導線・HTTP Result整理
- 26命令ダイエット: PoCフラグと進捗追記TypeOp/WeakRef/Barrier
10. CI: plugins E2E ジョブLinuxを追加
### 📊 大規模ファイルのリファクタリング候補
1. src/interpreter/objects.rs (1,272行) - オブジェクト処理の分割
2. src/interpreter/plugin_loader.rs (1,217行) - v2があるので削除候補
3. src/interpreter/expressions/calls.rs (1,016行) - 関数呼び出し処理の分割
## 🚧 次にやること(再開方針)
1) MIR26 前進(短期)
- プリンタ拡張: `TypeOp/WeakRef/Barrier``--mir-verbose` に明示表示
- スナップショット整備: 代表ケースで flag ON/OFF のMIR差分固定化
- vm-stats差分: `weak_field_poc.nyash` 等で JSON 取得・比較(キー: TypeOp/WeakRef/Barrier
- 旗: `mir_typeop_poc`TypeCheck/Cast→TypeOp`mir_refbarrier_unify_poc`Weak*/Barrier→統合
2) Builder適用拡大短期〜中期
- 言語 `is/as` 導線(最小でも擬似ノード)→ `emit_type_check/emit_cast` へ配線
- 弱参照: 既存の `RefGet/RefSet` パスは弱フィールドで `WeakLoad/WeakNew`Barrierflag ONで統合命令
- 関数スタイル `isType/asType` の早期loweringを強化`Literal("T")``new StringBox("T")` を確実に検出)
- `print(isType(...))` の未定義SSA回避print直前で必ず `TypeOp` のdstを生成
補足: 近々/中期で並行対応する項目
- Loop SSA復帰Phi挿入/Seal/Pred更新の段階適用、簡易loweringの置換
- Builder移行完了`builder.rs``builder_modularized/*`、命令フィールド名・効果の完全一致)
- CLI分離テスト導線`cargo test -p core` 単独で回る構成)
- ResultBox移行`box_trait::ResultBox``boxes::ResultBox`、レガシー段階削除)
3) VM/Verifierの補強中期
- `TypeOp(Cast)` の数値キャストInt/Float安全化、誤用時TypeError整備
- Verifierに26命令整合Barrier位置、WeakRef整合、支配関係チェックを追加
4) VM×プラグインE2Eの維持短期
- HTTP/Socketの回帰確認Void防御・遅延サーバ軽量化は済
- 必要に応じて `VM_README.md` にTips追記
5) BoxCall高速化性能段階
- `--vm-stats` ホットパス特定後、Fast-path/キャッシュ適用
## 🐛 既知の問題(要フォロー)
- 関数スタイル `isType(value, "Integer")` が一部ケースで `TypeOp` にloweringされず、`print %X` が未定義参照になる事象
- 現状: `asType``typeop cast` に変換されるが、`isType` が欠落するケースあり
- 仮対処: Interpreterに `is/isType/as/asType` のフォールバックを実装済(実行エラー回避)
- 恒久対処(次回対応):
- Builderの早期loweringをFunctionCall分岐で強化`Literal`/`StringBox`両対応、`print(...)` 内でも確実にdst生成
- Optimizerの安全ネットBoxCall/Call→TypeOp`isType` パターンでも確実に発火させる(テーブル駆動の判定)
## ⏸️ セッション再開メモ(次にやること)
- [ ] Builder: `extract_string_literal``StringBox`対応は導入済 → `FunctionCall` 早期loweringの再検証`print(isType(...))` 直下)
- [ ] Optimizer: `Call` 形式(関数呼び出し)でも `isType/asType` を検出して `TypeOp(Check/Cast)` に置換する安全ネットの強化とテスト
- [ ] MIRダンプの確認`local_tests/typeop_is_as_func_poc.nyash``typeop check/cast` が両方出ることを確認
- [ ] スナップショット化:`typeop_is_as_*_poc.nyash` のダンプを固定し回帰検出
## ▶ 補助コマンド(検証系)
```bash
# リビルド
cargo build --release -j32
# 関数スタイルのMIRダンプ確認isType/asType
./target/release/nyash --dump-mir --mir-verbose local_tests/typeop_is_as_func_poc.nyash | sed -n '1,200p'
# メソッドスタイルのMIRダンプ確認is/as
./target/release/nyash --dump-mir --mir-verbose local_tests/typeop_is_as_poc.nyash | sed -n '1,200p'
```
### 🆕 開発時の可視化・診断(最小追加)
- `--mir-verbose-effects`: MIRダンプ行末に効果カテゴリを表示`pure|readonly|side`
- 例: `nyash --dump-mir --mir-verbose --mir-verbose-effects local_tests/typeop_is_as_func_poc.nyash`
- `NYASH_OPT_DIAG_FAIL=1`: Optimizer診断で未lowering`is|isType|as|asType`検知時にエラー終了CI向け
- 例: `NYASH_OPT_DIAG_FAIL=1 nyash --dump-mir --mir-verbose local_tests/typeop_diag_fail.nyash`
- Builder生MIRスナップショット: `tools/snapshot_mir.sh <input.nyash> [output.txt]`
- 例: `tools/snapshot_mir.sh local_tests/typeop_is_as_func_poc.nyash docs/status/golden/typeop_is_as_func_poc.mir.txt`
- ゴールデン比較(ローカル/CI: `tools/ci_check_golden.sh`代表2ケースを比較
- 例: `./tools/ci_check_golden.sh`(差分があれば非ゼロ終了)
補足: ASTの形状確認は `--dump-ast` を使用。
#### 代表スナップショット対象(拡張)
- TypeOp系: `typeop_is_as_poc.nyash`, `typeop_is_as_func_poc.nyash`
- extern_call: `http_get_*.nyash`, `filebox_copy_from_handle.nyash`
- loop/await: `loop_phi_seal_poc.nyash`, `await_http_timeout_poc.nyash`
- boxcall: `array_map_fastpath_poc.nyash`, `boxcall_identity_share_poc.nyash`
## ▶ 実行コマンド例
計測実行:
```bash
tools/run_vm_stats.sh local_tests/vm_stats_http_ok.nyash vm_stats_ok.json
tools/run_vm_stats.sh local_tests/vm_stats_http_err.nyash vm_stats_err.json
tools/run_vm_stats.sh local_tests/vm_stats_http_404.nyash vm_stats_404.json
tools/run_vm_stats.sh local_tests/vm_stats_http_500.nyash vm_stats_500.json
```
VM×プラグインE2E:
```bash
cargo test -q --features plugins e2e_interpreter_plugin_filebox_close_void
cargo test -q --features plugins e2e_vm_plugin_filebox_close_void
```
MIR26 PoC弱参照・Barrier統合:
```bash
# 弱フィールドPoCflag OFF: WeakNew/WeakLoad/BarrierRead/Write
NYASH_VM_STATS=1 NYASH_VM_STATS_JSON=1 ./target/release/nyash --backend vm --vm-stats --vm-stats-json local_tests/weak_field_poc.nyash > vm_stats_weak_default.json
# flag ON: WeakRef/Barrier 統合
cargo build --release --features mir_refbarrier_unify_poc -q
NYASH_VM_STATS=1 NYASH_VM_STATS_JSON=1 ./target/release/nyash --backend vm --vm-stats --vm-stats-json local_tests/weak_field_poc.nyash > vm_stats_weak_unified.json
```
MIRダンププリンタ拡張後の確認:
```bash
./target/release/nyash --dump-mir --mir-verbose local_tests/weak_field_poc.nyash | sed -n '1,200p'
```
MIRダンプ/検証:
```bash
nyash --dump-mir --mir-verbose examples/plugin_box_sample.nyash
nyash --verify examples/plugin_box_sample.nyash
```
## 🔭 26命令ターゲット合意ドラフト
- コア: Const / Copy / Load / Store / BinOp / UnaryOp / Compare / Jump / Branch / Phi / Return / Call / BoxCall / NewBox / ArrayGet / ArraySet / RefNew / RefGet / RefSet / Await / Print / ExternCall(最小) / TypeOp(=TypeCheck/Cast統合) / WeakRef(=WeakNew/WeakLoad統合) / Barrier(=Read/Write統合)
- メタ降格: Debug / Nop / Safepointビルドモードで制御
---
最終更新: 2025年8月23日VM強化・E2E拡張・me参照安定化・TypeOp/WeakRef/Barrier PoC完了次段はプリンタ拡張・スナップショット・is/as導線
## 🔁 再起動後の再開手順(ショート)
```bash
# 1) ビルド
cargo build --release -j32
# 2) plugins E2ELinux
cargo test --features plugins -q -- --nocapture
# 3) VM Stats 代表値の再取得(任意)
tools/run_vm_stats.sh local_tests/vm_stats_http_ok.nyash vm_stats_ok.json
tools/run_vm_stats.sh local_tests/vm_stats_http_err.nyash vm_stats_err.json
# 4) SocketBox タイムアウト確認(任意)
./target/release/nyash local_tests/socket_timeout_server.nyash
./target/release/nyash local_tests/socket_timeout_client.nyash
# 5) 反復タイムアウト確認(任意)
./target/release/nyash local_tests/socket_repeated_timeouts.nyash
# 6) HTTP 大ボディ確認(任意)
./target/release/nyash local_tests/http_big_body_client.nyash
# 7) VM BoxCall デバッグ(任意)
NYASH_VM_DEBUG_BOXCALL=1 ./target/release/nyash --backend vm local_tests/test_vm_array_getset.nyash
```