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

368 lines
22 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年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` に挿入したデバッグ出力が未出力→実行経路の相違が濃厚。
- 対応: 実行バイナリの署名チェックとコードパスの網羅的ログ追加でルート確定→修正。
### ✅ 小タスク完了2025-08-25 深夜)
- Verifier: Barrierの軽い文脈診断を追加`NYASH_VERIFY_BARRIER_STRICT=1`で有効)。
- ResultBox移行TODOを追加`docs/development/current/RESULTBOX_MIGRATION_TODO.md`)。
- VM: 旧`box_trait::ResultBox`扱いのデプリケーション警告を最小抑制(完全移行までの暫定)。
### ▶ リファクタリング開始(控えめ)
- 方針: 肥大化防止のため`src/backend/vm.rs`を2分割のみ実施。
- `vm_values.rs`: `execute_binary_op`/`execute_unary_op`/`execute_compare_op` を移動。
- `vm_boxcall.rs`: `call_box_method` を移動(`call_unified_method`は現状のまま)。
- 影響最小・挙動非変更で、可読性と責務分離を先行する。
## 🧭 リファクタリングゴールAI一目見て分かる導線
### 目的/原則
- 明確責務: 各モジュールが1行で説明できる目的・責務を持つ
- 入口統一: VM/MIRの読む順番が固定され、迷わない
- ファイル肥大防止: 1000行超は段階分割まずVMホットパス
- ドキュメント導線: quick-referenceで最短経路を提示
- 振る舞い不変: すべてのゴールデン/CIが緑
### マイルストーン(受入基準)
- M1: VM導線完成達成
- vm.rs → vm_instructions.rs → vm_values.rs / vm_boxcall.rs / vm_stats.rs / vm_phi.rs
- code-mapdocs/quick-reference/code-map.mdで入口と責務を明記
- 受入: build OK / golden 緑 / 実行変化なし
- M2: モジュールヘッダ(着手)
- Purpose/Responsibilities/Key APIs/Typical Callers を各VMモジュール先頭に追記
- 受入: 各モジュール先頭4行程度の要約とcode-mapの整合
- M3: 1000行級の導線整備設計メモ
- interpreter/plugin_loader.rs: v2主導の導線明文化削除は後
- interpreter/objects.rs: 可視性/フィールド/ライフサイクルの分割指針をTODO化
- M4: レガシー移行(土台)
- RESULTBOX_MIGRATION_TODOの維持、VMは新旧両対応のまま
### 実行順(小さく確実に)
1) M2ヘッダ追加VM系
2) M3 plugin_loader 導線の明文化(コメント/TODO/コードマップ)
3) M3 objects.rs 分割設計メモ
4) 用語の統一・code-map追従
5) golden + 重要E2Eを確認
### ⚠️ 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
```