Phase 2: TypeOp変換の一本化(Optimizer安全ネット削除)\nPhase 3: 可視化/スナップショット基盤(--mir-verbose-effects, snapshot/compare/ci_check)\nDocs: Phase 1/2 完了マーク・利用方法追記
This commit is contained in:
@ -45,6 +45,8 @@
|
||||
2) Builder適用拡大(短期〜中期)
|
||||
- 言語 `is/as` 導線(最小でも擬似ノード)→ `emit_type_check/emit_cast` へ配線
|
||||
- 弱参照: 既存の `RefGet/RefSet` パスは弱フィールドで `WeakLoad/WeakNew`+Barrier(flag ONで統合命令)
|
||||
- 関数スタイル `isType/asType` の早期loweringを強化(`Literal("T")` と `new StringBox("T")` を確実に検出)
|
||||
- `print(isType(...))` の未定義SSA回避(print直前で必ず `TypeOp` のdstを生成)
|
||||
|
||||
3) VM/Verifierの補強(中期)
|
||||
- `TypeOp(Cast)` の数値キャスト(Int/Float)安全化、誤用時TypeError整備
|
||||
@ -57,6 +59,44 @@
|
||||
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` を使用。
|
||||
|
||||
## ▶ 実行コマンド例
|
||||
|
||||
計測実行:
|
||||
|
||||
@ -45,6 +45,8 @@
|
||||
- AOT WASMネイティブ化
|
||||
- MIR最適化基盤
|
||||
- エスケープ解析実装
|
||||
- MIR/Builder/Optimizer簡略化計画(責務分離・効果正規化・可視化)
|
||||
- [Phase 8.x: MIRパイプライン簡略化計画](phases/phase-8/phase_8_x_mir_pipeline_simplification.md)
|
||||
|
||||
## 📚 関連ドキュメント
|
||||
|
||||
|
||||
@ -0,0 +1,42 @@
|
||||
# Phase 8.x: MIR/Builder/Optimizer 簡略化計画(責務分離・効果正規化・可視化)
|
||||
|
||||
## 🎯 目的
|
||||
- AST→MIR→Optimizer→Backend の多層化で増した複雑さを段階的に解消し、堅牢性と見通しを改善する。
|
||||
- DCEの誤削除や多重防御(重複lowering)を撲滅し、責務を明確化する。
|
||||
|
||||
## ✅ 方針(要約)
|
||||
- **責務分離**: Builder=変換のみ / Optimizer=最適化のみ(変換しない)。
|
||||
- **効果正規化**: `Pure / ReadOnly / SideEffect` の3分類で最適化判定を一元化。
|
||||
- **可視化**: 段階別のMIRダンプと効果サマリ、スナップショットテストを整備。
|
||||
|
||||
## Phase 1: エフェクト見直し(短期)✅ 完了
|
||||
- `EffectMask::primary_category()` を唯一の根拠に `is_pure()` を再定義(実装済)。
|
||||
- DCE/並べ替えは `primary_category` で判定(Pureのみ削除/自由移動、ReadOnlyは限定、SideEffectは不可)。
|
||||
- 単体テスト: 効果判定(PURE|IO は pure ではない)、DCEが副作用命令(print使用のTypeOp等)を削除しないこと(追加済)。
|
||||
- 可視化: `--mir-verbose-effects` で per-instruction 効果カテゴリ表示(追加済)。
|
||||
- CI導線(任意): `NYASH_OPT_DIAG_FAIL=1` で未lowering検出時にfail(診断ゲート・追加済)。
|
||||
|
||||
## Phase 2: 変換の一本化(中期)✅ 完了
|
||||
- **TypeOp loweringをBuilderに集約**(関数/メソッド/print直下/多重StringBox対応は実装済)。
|
||||
- OptimizerのTypeOp安全ネット(実変換)を削除。診断のみ存続(`NYASH_OPT_DIAG_FAIL`連携)。
|
||||
- スナップショット: 代表 `*_is_as_*` のMIR(Builder出力)を固定化(`tools/compare_mir.sh`)。
|
||||
|
||||
## Phase 3: デバッグ支援強化(短期〜中期)
|
||||
- `--dump-ast`(実装済)に加え、`--dump-mir --no-optimize`(Builder出力の生MIR)を追加。
|
||||
- MIRプリンタの詳細表示: 命令行末に `pure/readonly/side` の効果表示(オプション)。
|
||||
- ゴールデンMIR: 代表サンプルのMIRダンプを保存し差分検出(CI/ローカル)。
|
||||
|
||||
## タスク一覧(実装順)
|
||||
1) OptimizerのTypeOp安全ネットを機能フラグでデフォルトOFF(`mir_typeop_safety_net`)
|
||||
2) `MirCompiler` に `--no-optimize` 経由のBuilder直ダンプを実装
|
||||
3) MIRプリンタに効果簡易表示オプション(`--mir-verbose-effects` 等)
|
||||
4) 効果判定の単体テスト / DCE安全テストの追加
|
||||
5) Optimizer診断パス(未lowering検知)追加
|
||||
|
||||
## 期待効果
|
||||
- 変換責務の一本化でバグ源の排除・デバッグ容易化
|
||||
- エフェクト判定の一貫性でDCE/最適化の安全性向上
|
||||
- 可視化/スナップショットにより回帰を早期検知
|
||||
|
||||
---
|
||||
最終更新: 2025-08-24(Phase 1完了: is_pure修正/テスト/効果可視化/診断ゲート)
|
||||
Reference in New Issue
Block a user