From e0be01c12ed47cd25146cb00a69ea3be127c94fb Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Sat, 22 Nov 2025 07:48:03 +0900 Subject: [PATCH] =?UTF-8?q?feat(phi):=20Phase=2026-E-3=20-=20PhiBuilderOps?= =?UTF-8?q?=E5=A7=94=E8=AD=B2=E5=AE=9F=E8=A3=85=EF=BC=88has-a=E8=A8=AD?= =?UTF-8?q?=E8=A8=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 26-E Phase 3 完了: ChatGPT+Claude 合意による委譲設計実装 **設計合意 (ChatGPT + Claude consensus):** - PhiBuilderOps = 低レベル「PHI命令発行」道具箱 - LoopFormOps = 高レベル「ループ構造構築」作業場 - 関係: has-a(委譲) ではなく is-a(継承) - LoopBuilder は両方のインターフェースを個別実装で提供 **実装内容:** 1. LoopFormOps trait 設計コメント更新 - 継承ではなく委譲の設計rationale明記 - 段階的統合方針: If側→Loop側→将来統合 2. LoopBuilder に PhiBuilderOps 委譲実装 (64行) - 委譲パターン: LoopFormOps 既存実装を再利用 - HashSet → Vec 変換 + ソート(決定性保証) - emit_phi: block 引数差を吸収(current_block 設定) - 自己呼び出し回避: ::method 明示 **技術的成果:** - 重複コードゼロ: 既存 LoopFormOps 実装に完全委譲 - 決定性保証: pred_vec.sort_by_key(|bb| bb.0) で決定的順序 - シグネチャ差分吸収: PhiBuilderOps/LoopFormOps の違いを吸収 - 破壊的変更なし: 既存コード保護 **委譲実装の利点:** 1. 抽象化レベル分離: 低レベル(PHI発行)と高レベル(ループ構築) 2. 既存コード保護: LoopFormOps 実装は変更なし 3. 段階的統合: If側から先に PhiBuilderOps 安定化 4. テスト容易性: PhiBuilderOps/LoopFormOps それぞれでテスト可能 **関連ファイル:** - src/mir/phi_core/loopform_builder.rs (設計コメント更新) - src/mir/loop_builder.rs (PhiBuilderOps委譲実装, +64行) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/mir/loop_builder.rs | 63 ++++++++++++++++++++++++++++ src/mir/phi_core/loopform_builder.rs | 17 ++++++++ 2 files changed, 80 insertions(+) diff --git a/src/mir/loop_builder.rs b/src/mir/loop_builder.rs index c8e2a504..1bbfb892 100644 --- a/src/mir/loop_builder.rs +++ b/src/mir/loop_builder.rs @@ -1388,3 +1388,66 @@ impl<'a> LoopFormOps for LoopBuilder<'a> { LoopBuilder::get_variable_at_block(self, name, block) } } + +// Phase 26-E-3: PhiBuilderOps 委譲実装(has-a設計) +// +// **Design Rationale:** +// - PhiBuilderOps = 低レベル「PHI命令発行」道具箱 +// - LoopFormOps = 高レベル「ループ構造構築」作業場 +// - 関係: has-a(委譲) - LoopBuilder は両方のインターフェースを提供 +// +// **実装方針:** +// - LoopFormOps の既存実装に委譲(重複なし) +// - HashSet → Vec 変換 + ソート(決定性保証) +// - emit_phi: block 引数差を吸収(current_block 設定) +impl<'a> crate::mir::phi_core::phi_builder_box::PhiBuilderOps for LoopBuilder<'a> { + fn new_value(&mut self) -> ValueId { + // 委譲: LoopFormOps の既存実装を使用 + ::new_value(self) + } + + fn emit_phi( + &mut self, + block: BasicBlockId, + dst: ValueId, + inputs: Vec<(BasicBlockId, ValueId)>, + ) -> Result<(), String> { + // PhiBuilderOps: block 引数あり + // LoopFormOps: block 引数なし(current_block 使用) + // 差を吸収: current_block を設定してから LoopFormOps::emit_phi を呼ぶ + ::set_current_block(self, block)?; + ::emit_phi(self, dst, inputs) + } + + fn update_var(&mut self, name: String, value: ValueId) { + // 委譲: LoopFormOps の既存実装を使用 + ::update_var(self, name, value) + } + + fn get_block_predecessors(&self, block: BasicBlockId) -> Vec { + // LoopFormOps: HashSet 返却 + // PhiBuilderOps: Vec 返却 + // 変換: HashSet → Vec + ソート(決定性保証) + let pred_set = ::get_block_predecessors(self, block); + let mut pred_vec: Vec = pred_set.into_iter().collect(); + pred_vec.sort_by_key(|bb| bb.0); // bb.0 = BasicBlockId の内部値 + pred_vec + } + + fn emit_void(&mut self) -> ValueId { + // void 定数を発行 + let void_id = ::new_value(self); + let _ = self.emit_const(void_id, ConstValue::Void); + void_id + } + + fn set_current_block(&mut self, block: BasicBlockId) -> Result<(), String> { + // 委譲: LoopFormOps の既存実装を使用 + ::set_current_block(self, block) + } + + fn block_exists(&self, block: BasicBlockId) -> bool { + // 委譲: LoopFormOps の既存実装を使用 + ::block_exists(self, block) + } +} diff --git a/src/mir/phi_core/loopform_builder.rs b/src/mir/phi_core/loopform_builder.rs index a31cf7dd..4b927159 100644 --- a/src/mir/phi_core/loopform_builder.rs +++ b/src/mir/phi_core/loopform_builder.rs @@ -695,6 +695,23 @@ impl LoopFormBuilder { /// This trait abstracts the underlying MIR builder operations, /// allowing LoopFormBuilder to work with both Rust MIR builder /// and selfhost compiler's JSON-based approach. +/// Phase 26-E-3: LoopFormOps と PhiBuilderOps の関係(委譲設計) +/// +/// **Design Rationale (ChatGPT + Claude consensus, 2025-11-22):** +/// - PhiBuilderOps = 低レベル「PHI命令発行」道具箱 +/// - LoopFormOps = 高レベル「ループ構造構築」作業場 +/// - 関係: **has-a(委譲)** ではなく is-a(継承) +/// +/// **実装方針:** +/// - LoopFormOps trait: そのまま(継承なし) +/// - PhiBuilderOps 実装: 必要な型に個別実装 +/// - `impl<'a> PhiBuilderOps for LoopBuilder<'a>` で委譲 +/// - HashSet → Vec 変換 + ソートで決定性保証 +/// +/// **段階的統合:** +/// 1. If側: PhiBuilderBox 経由(既に完了) +/// 2. Loop側: LoopFormOps + ExitPhiBuilder/HeaderPhiBuilder(現状維持) +/// 3. 将来: 必要に応じて LoopBuilder に PhiBuilderOps 実装追加 pub trait LoopFormOps { /// Allocate a new ValueId fn new_value(&mut self) -> ValueId;