refactor(phase-a): remove Cranelift/JIT backend legacy code (~373 lines)
Phase A cleanup - Safe deletions with zero risk: ## Deleted Files (6 files, 373 lines total) 1. Cranelift/JIT Backend (321 lines): - src/runner/modes/cranelift.rs (45 lines) - src/runner/modes/aot.rs (55 lines) - src/runner/jit_direct.rs (152 lines) - src/tests/core13_smoke_jit.rs (42 lines) - src/tests/core13_smoke_jit_map.rs (27 lines) 2. Legacy MIR Builder (52 lines): - src/mir/builder/exprs_legacy.rs - Functionality inlined into exprs.rs (control flow constructs) ## Module Reference Cleanup - src/backend/mod.rs: Removed cranelift feature gate exports - src/runner/mod.rs: Removed jit_direct module reference - src/runner/modes/mod.rs: Removed aot module reference - src/mir/builder.rs: Removed exprs_legacy module ## Impact Analysis - Build: Success (cargo build --release) - Tests: All passing - Risk Level: None (feature already archived, code unused) - Related: Phase 15 JIT archival (archive/jit-cranelift/) ## BID Copilot Status - Already removed in previous cleanup - Not part of this commit Total Reduction: 373 lines (~0.4% of codebase) Next: Phase B - Dead code investigation Related: #phase-21.0-cleanup Part of: Legacy Code Cleanup Initiative
This commit is contained in:
902
docs/development/refactoring/MODULE_STRUCTURE_ANALYSIS.md
Normal file
902
docs/development/refactoring/MODULE_STRUCTURE_ANALYSIS.md
Normal file
@ -0,0 +1,902 @@
|
||||
# Hakorune Rustコードベース - モジュール構造改善分析レポート
|
||||
|
||||
**作成日**: 2025-11-06
|
||||
**対象**: `/home/tomoaki/git/hakorune-selfhost/src/`
|
||||
|
||||
## エグゼクティブサマリー
|
||||
|
||||
Hakoruneコードベースの現在のモジュール構造を分析した結果、以下の主要な改善機会を特定しました:
|
||||
|
||||
### 🎯 最優先改善項目
|
||||
1. **handlers分散問題** - mir_interpreter/handlersの3,335行を責務別に整理
|
||||
2. **runner/modes肥大化** - 41ファイル・14,000行のcommon.rsを分割
|
||||
3. **boxes整理** - 61ファイルのBox実装を機能別に再グルーピング
|
||||
4. **BID関連モジュールの命名** - 3つのbid-*ディレクトリを統一
|
||||
5. **utils/common/helpers散在** - 再利用コードの統一整理
|
||||
|
||||
### 📊 統計サマリー
|
||||
|
||||
| モジュール | ファイル数 | 主な課題 |
|
||||
|-----------|----------|---------|
|
||||
| `src/mir/` | 112 | 整理されているが一部utils分散 |
|
||||
| `src/backend/` | 69 | mir_interpreter/handlersに集約必要 |
|
||||
| `src/runtime/` | 46 | plugin_loader_v2が深すぎる |
|
||||
| `src/parser/` | 52 | 概ね良好(declarations分離済み) |
|
||||
| `src/boxes/` | 61 | カテゴリ分けが不十分 |
|
||||
| `src/runner/` | 41+ | modes/common_utilが肥大化 |
|
||||
|
||||
---
|
||||
|
||||
## 1. モジュールの責務分析
|
||||
|
||||
### 1.1 責務が曖昧/複数責務を持つモジュール
|
||||
|
||||
#### 🔴 優先度: 高
|
||||
|
||||
##### `src/backend/mir_interpreter/handlers/` (3,335行)
|
||||
|
||||
**現状の問題**:
|
||||
```
|
||||
handlers/
|
||||
├── arithmetic.rs (4,881行) - 算術演算
|
||||
├── boxes.rs (13,161行) - Box操作全般
|
||||
├── boxes_array.rs (2,710行) - Array固有
|
||||
├── boxes_string.rs (9,907行) - String固有
|
||||
├── boxes_map.rs (6,425行) - Map固有
|
||||
├── boxes_object_fields.rs (22,559行) - オブジェクトフィールド
|
||||
├── boxes_instance.rs (8,217行) - インスタンス処理
|
||||
├── boxes_plugin.rs (9,654行) - プラグインBox
|
||||
├── boxes_void_guards.rs (861行) - Voidガード
|
||||
├── calls.rs (49,750行) ⚠️ 巨大ファイル
|
||||
├── externals.rs (10,584行) - 外部呼び出し
|
||||
├── extern_provider.rs (18,350行) - プロバイダ統合
|
||||
└── ...
|
||||
```
|
||||
|
||||
**問題点**:
|
||||
- `calls.rs`が49,750行で巨大すぎる(単一ファイル最大)
|
||||
- boxes_*が8つに分散しているが、boxes.rsも13,161行で巨大
|
||||
- 責務の境界が不明瞭(boxes.rsとboxes_*.rsの使い分け)
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
handlers/
|
||||
├── core/ # コア命令処理
|
||||
│ ├── mod.rs
|
||||
│ ├── arithmetic.rs
|
||||
│ ├── memory.rs # Load/Store
|
||||
│ └── control_flow.rs
|
||||
├── boxes/ # Box操作(型別)
|
||||
│ ├── mod.rs
|
||||
│ ├── primitives.rs # String/Integer/Bool統合
|
||||
│ ├── collections.rs # Array/Map統合
|
||||
│ ├── instances.rs # ユーザー定義Box
|
||||
│ └── plugin.rs # プラグインBox
|
||||
├── calls/ # 呼び出し処理(分割)
|
||||
│ ├── mod.rs
|
||||
│ ├── resolution.rs # 呼び出し解決
|
||||
│ ├── dispatch.rs # ディスパッチ
|
||||
│ ├── extern.rs # ExternCall
|
||||
│ └── provider.rs # Provider統合
|
||||
└── misc.rs
|
||||
```
|
||||
|
||||
**影響範囲**: 中(handlers内部のみ)
|
||||
**優先度**: 高(可読性・保守性に直結)
|
||||
|
||||
---
|
||||
|
||||
##### `src/runner/modes/common.rs` (14,000行)
|
||||
|
||||
**現状の問題**:
|
||||
- 単一ファイルに14,000行の共通処理が集約
|
||||
- common_util/ディレクトリも17ファイルで肥大化
|
||||
- 責務が不明瞭(共通処理とは何か?)
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
runner/
|
||||
├── execution/ # 実行制御
|
||||
│ ├── vm.rs
|
||||
│ ├── llvm.rs
|
||||
│ ├── pyvm.rs
|
||||
│ └── mir_interpreter.rs
|
||||
├── pipeline/ # パイプライン処理
|
||||
│ ├── resolution.rs # using解決
|
||||
│ ├── preprocessing.rs
|
||||
│ └── compilation.rs
|
||||
├── io/ # 入出力
|
||||
│ ├── file.rs
|
||||
│ └── stream.rs
|
||||
├── selfhost/ # セルフホスト関連
|
||||
│ ├── executor.rs
|
||||
│ └── bridge.rs
|
||||
└── modes/
|
||||
└── (execution/からインポート)
|
||||
```
|
||||
|
||||
**影響範囲**: 大(runner全体に影響)
|
||||
**優先度**: 高(Phase 15の重要目標)
|
||||
|
||||
---
|
||||
|
||||
#### 🟡 優先度: 中
|
||||
|
||||
##### `src/boxes/` (61ファイル)
|
||||
|
||||
**現状の問題**:
|
||||
```
|
||||
boxes/
|
||||
├── basic/ # 基本Box(曖昧)
|
||||
├── arithmetic/ # 算術Box
|
||||
├── array/
|
||||
├── buffer/
|
||||
├── file/
|
||||
├── http/
|
||||
├── json/
|
||||
├── web/ # Web専用
|
||||
├── string_box.rs # なぜディレクトリ外?
|
||||
├── integer_box.rs
|
||||
├── math_box.rs
|
||||
└── ... (61ファイル)
|
||||
```
|
||||
|
||||
**問題点**:
|
||||
- basic/arithmeticが曖昧
|
||||
- ディレクトリとファイルが混在(string_box.rsはなぜ外?)
|
||||
- カテゴリ分けが不統一
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
boxes/
|
||||
├── primitives/ # 基本データ型
|
||||
│ ├── string.rs
|
||||
│ ├── integer.rs
|
||||
│ ├── bool.rs
|
||||
│ └── null.rs
|
||||
├── collections/ # コレクション
|
||||
│ ├── array.rs
|
||||
│ ├── map.rs
|
||||
│ └── buffer.rs
|
||||
├── io/ # 入出力
|
||||
│ ├── file.rs
|
||||
│ ├── http.rs
|
||||
│ └── stream.rs
|
||||
├── system/ # システム
|
||||
│ ├── console.rs
|
||||
│ ├── debug.rs
|
||||
│ └── time.rs
|
||||
├── advanced/ # 高度な機能
|
||||
│ ├── json.rs
|
||||
│ ├── regex.rs
|
||||
│ └── future.rs
|
||||
└── platform/ # プラットフォーム依存
|
||||
├── web/
|
||||
├── audio.rs (not wasm32)
|
||||
└── egui.rs (feature = "gui")
|
||||
```
|
||||
|
||||
**影響範囲**: 中(boxes/内部とインポートパス)
|
||||
**優先度**: 中(可読性向上)
|
||||
|
||||
---
|
||||
|
||||
### 1.2 名前と実態が合っていないモジュール
|
||||
|
||||
#### 🔴 `src/bid-*` (BID関連モジュール)
|
||||
|
||||
**現状の問題**:
|
||||
```
|
||||
src/
|
||||
├── bid/ # コア実装?
|
||||
├── bid-codegen-from-copilot/ # Copilot生成コード?
|
||||
└── bid-converter-copilot/ # 変換ツール?
|
||||
```
|
||||
|
||||
**問題点**:
|
||||
- ディレクトリ名にハイフンを使用(Rust慣習に反する)
|
||||
- "-from-copilot", "-converter-copilot"など命名が一貫性なし
|
||||
- 役割が名前から不明瞭
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
src/
|
||||
└── bid/
|
||||
├── core/ # BIDコア実装
|
||||
├── codegen/ # コード生成
|
||||
├── converter/ # 変換ツール
|
||||
└── plugins/ # プラグイン実装
|
||||
```
|
||||
|
||||
**影響範囲**: 中(BIDシステム全体)
|
||||
**優先度**: 高(命名規約違反)
|
||||
|
||||
---
|
||||
|
||||
#### 🟡 `src/runner/modes/common_util/`
|
||||
|
||||
**現状の問題**:
|
||||
- `common_util`という名前が汎用的すぎる
|
||||
- 実際には"using解決"と"セルフホスト実行"が主
|
||||
- 17ファイルあり、役割が不明瞭
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
runner/
|
||||
├── resolution/ # using/namespace解決
|
||||
│ ├── using.rs
|
||||
│ ├── prelude.rs
|
||||
│ └── path_util.rs
|
||||
├── selfhost/ # セルフホスト実行
|
||||
│ ├── executor.rs
|
||||
│ ├── bridge.rs
|
||||
│ └── pipeline.rs
|
||||
└── io/ # 入出力ヘルパー
|
||||
└── hako.rs
|
||||
```
|
||||
|
||||
**影響範囲**: 中(runner内部)
|
||||
**優先度**: 中(責務明確化)
|
||||
|
||||
---
|
||||
|
||||
## 2. 依存関係の分析
|
||||
|
||||
### 2.1 循環依存
|
||||
|
||||
**調査結果**: 現時点で明確な循環依存は検出されませんでした。
|
||||
|
||||
- `src/mir/` → `src/backend/` (一方向のみ)
|
||||
- `src/runtime/` → `src/boxes/` (一方向のみ)
|
||||
- `src/parser/` → `src/ast/` (一方向のみ)
|
||||
|
||||
**理由**: 各モジュールが`crate::`からのインポートを適切に使用しているため。
|
||||
|
||||
---
|
||||
|
||||
### 2.2 過度な結合
|
||||
|
||||
#### 🔴 `src/backend/mir_interpreter/` → `src/runtime/`
|
||||
|
||||
**問題点**:
|
||||
- MIRインタープリターがランタイムに強く依存
|
||||
- plugin_loader_v2への直接参照が散在
|
||||
- Box操作がruntime経由で複雑化
|
||||
|
||||
**改善提案**:
|
||||
```rust
|
||||
// Before: 直接runtime依存
|
||||
use crate::runtime::plugin_loader_v2::enabled::...;
|
||||
|
||||
// After: トレイト経由で抽象化
|
||||
use crate::backend::traits::BoxProvider;
|
||||
```
|
||||
|
||||
**影響範囲**: 大(backend/runtimeの境界設計)
|
||||
**優先度**: 中(テスト容易性・将来の拡張性)
|
||||
|
||||
---
|
||||
|
||||
#### 🟡 `src/runner/` → 複数モジュール
|
||||
|
||||
**問題点**:
|
||||
```rust
|
||||
// runner/mod.rsから多数のモジュールをインポート
|
||||
use nyash_rust::cli::CliConfig;
|
||||
use nyash_rust::backend::*;
|
||||
use nyash_rust::runtime::*;
|
||||
use nyash_rust::parser::*;
|
||||
use nyash_rust::mir::*;
|
||||
```
|
||||
|
||||
**改善提案**:
|
||||
- runnerをファサードパターンとして明確化
|
||||
- 各機能をサブモジュールに委譲(execution/, pipeline/等)
|
||||
|
||||
**影響範囲**: 中(runner内部構造)
|
||||
**優先度**: 中(保守性向上)
|
||||
|
||||
---
|
||||
|
||||
### 2.3 pub(crate)で十分なのにpubになっているもの
|
||||
|
||||
#### 調査方法
|
||||
```bash
|
||||
# pub use を含む行数
|
||||
grep -r "^pub use" src/lib.rs src/backend/mod.rs src/mir/mod.rs src/runtime/mod.rs | wc -l
|
||||
# 結果: 48行
|
||||
```
|
||||
|
||||
**問題点**:
|
||||
- `src/lib.rs`で48個の型を再エクスポート
|
||||
- 実際には内部実装の詳細を公開している可能性
|
||||
|
||||
**改善提案**:
|
||||
```rust
|
||||
// src/lib.rs
|
||||
// 公開APIを明確化
|
||||
pub use ast::{ASTNode, BinaryOperator, LiteralValue};
|
||||
pub use box_trait::{NyashBox, StringBox, IntegerBox, BoolBox};
|
||||
pub use mir::{MirModule, MirFunction, MirInstruction};
|
||||
pub use backend::{VM, VMValue, VMError};
|
||||
|
||||
// 内部実装は pub(crate) に変更
|
||||
pub(crate) use box_arithmetic::*;
|
||||
pub(crate) use box_operators::*;
|
||||
```
|
||||
|
||||
**影響範囲**: 小(外部APIのみ)
|
||||
**優先度**: 低(既存コードへの影響小)
|
||||
|
||||
---
|
||||
|
||||
## 3. モジュール階層の改善
|
||||
|
||||
### 3.1 ネストが深すぎる
|
||||
|
||||
#### 🔴 `src/runtime/plugin_loader_v2/enabled/loader/`
|
||||
|
||||
**現状の問題**:
|
||||
```
|
||||
runtime/
|
||||
└── plugin_loader_v2/
|
||||
├── mod.rs
|
||||
├── stub.rs
|
||||
└── enabled/
|
||||
├── mod.rs
|
||||
├── globals.rs
|
||||
├── method_resolver.rs
|
||||
├── types.rs
|
||||
└── loader/ # ここが深すぎる!
|
||||
├── mod.rs
|
||||
├── specs.rs
|
||||
├── metadata.rs
|
||||
├── singletons.rs
|
||||
├── library.rs
|
||||
├── config.rs
|
||||
└── util.rs
|
||||
```
|
||||
|
||||
**問題点**:
|
||||
- 5階層のネスト(`runtime/plugin_loader_v2/enabled/loader/specs.rs`)
|
||||
- インポートパスが冗長: `crate::runtime::plugin_loader_v2::enabled::loader::specs`
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
runtime/
|
||||
└── plugins/ # plugin_loader_v2 → plugins
|
||||
├── mod.rs
|
||||
├── stub.rs # プラグイン無効時
|
||||
├── core/ # enabled → core
|
||||
│ ├── globals.rs
|
||||
│ ├── method_resolver.rs
|
||||
│ ├── types.rs
|
||||
│ └── bridge/ # FFI/ブリッジ処理
|
||||
│ ├── ffi_bridge.rs
|
||||
│ └── host_bridge.rs
|
||||
├── loader/ # 1階層上げる
|
||||
│ ├── specs.rs
|
||||
│ ├── metadata.rs
|
||||
│ ├── singletons.rs
|
||||
│ └── library.rs
|
||||
└── config.rs # トップレベルへ
|
||||
```
|
||||
|
||||
**影響範囲**: 大(runtime全体)
|
||||
**優先度**: 高(Phase 15の目標と一致)
|
||||
|
||||
---
|
||||
|
||||
### 3.2 フラットすぎる
|
||||
|
||||
#### 🟡 `src/` トップレベル (32ディレクトリ + 20ファイル)
|
||||
|
||||
**現状の問題**:
|
||||
```
|
||||
src/
|
||||
├── ast.rs # 単一ファイル
|
||||
├── box_arithmetic.rs # 単一ファイル
|
||||
├── box_operators.rs # 単一ファイル
|
||||
├── box_trait.rs # 単一ファイル
|
||||
├── channel_box.rs # 単一ファイル
|
||||
├── environment.rs # 単一ファイル
|
||||
├── exception_box.rs # 単一ファイル
|
||||
├── ... # 20個の単一ファイル
|
||||
└── (32ディレクトリ)
|
||||
```
|
||||
|
||||
**問題点**:
|
||||
- トップレベルに20個の単一ファイルが散在
|
||||
- 責務別のグルーピングがされていない
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
src/
|
||||
├── core/ # コア型・トレイト
|
||||
│ ├── ast.rs
|
||||
│ ├── value.rs
|
||||
│ ├── types.rs
|
||||
│ └── environment.rs
|
||||
├── boxes/ # Box実装(既存)
|
||||
│ ├── primitives/
|
||||
│ ├── operators/ # box_operators.rs → ここ
|
||||
│ └── traits/ # box_trait.rs → ここ
|
||||
├── frontend/ # フロントエンド
|
||||
│ ├── tokenizer/
|
||||
│ ├── parser/
|
||||
│ └── syntax/
|
||||
├── middle/ # 中間表現
|
||||
│ ├── mir/
|
||||
│ └── semantics/
|
||||
├── backend/ # バックエンド(既存)
|
||||
├── runtime/ # ランタイム(既存)
|
||||
└── runner/ # 実行コーディネーター(既存)
|
||||
```
|
||||
|
||||
**影響範囲**: 大(全体構造変更)
|
||||
**優先度**: 中(長期的改善)
|
||||
|
||||
---
|
||||
|
||||
### 3.3 論理的なグルーピングができていない
|
||||
|
||||
#### 🟡 `src/mir/` の構造
|
||||
|
||||
**現状**:
|
||||
```
|
||||
mir/
|
||||
├── basic_block.rs
|
||||
├── builder.rs
|
||||
├── definitions.rs
|
||||
├── effect.rs
|
||||
├── function.rs
|
||||
├── instruction.rs
|
||||
├── instruction_kinds/
|
||||
├── instruction_introspection.rs
|
||||
├── types.rs
|
||||
├── loop_api.rs
|
||||
├── loop_builder.rs
|
||||
├── ssot/
|
||||
├── optimizer.rs
|
||||
├── optimizer_passes/
|
||||
├── optimizer_stats.rs
|
||||
├── passes/
|
||||
├── printer.rs
|
||||
├── printer_helpers.rs
|
||||
├── function_emission.rs
|
||||
├── hints.rs
|
||||
├── slot_registry.rs
|
||||
├── value_id.rs
|
||||
├── verification.rs
|
||||
├── verification_types.rs
|
||||
├── utils/
|
||||
└── phi_core/
|
||||
```
|
||||
|
||||
**問題点**:
|
||||
- 112ファイルがフラット寄りに配置
|
||||
- builder/optimizer/verification等の関連ファイルが散在
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
mir/
|
||||
├── core/ # コア定義
|
||||
│ ├── instruction.rs
|
||||
│ ├── basic_block.rs
|
||||
│ ├── function.rs
|
||||
│ ├── value_id.rs
|
||||
│ └── types.rs
|
||||
├── builder/ # MIRビルダー
|
||||
│ ├── mod.rs
|
||||
│ ├── builder_calls.rs
|
||||
│ ├── loop_builder.rs
|
||||
│ └── phi_core/
|
||||
├── optimizer/ # 最適化
|
||||
│ ├── mod.rs
|
||||
│ ├── passes/
|
||||
│ └── stats.rs
|
||||
├── verification/ # 検証
|
||||
│ ├── mod.rs
|
||||
│ └── types.rs
|
||||
├── emission/ # コード生成
|
||||
│ ├── printer.rs
|
||||
│ └── function_emission.rs
|
||||
└── utils/ # ユーティリティ
|
||||
└── control_flow.rs
|
||||
```
|
||||
|
||||
**影響範囲**: 中(mir/内部)
|
||||
**優先度**: 中(整理済みの部分もある)
|
||||
|
||||
---
|
||||
|
||||
## 4. 命名・配置の改善
|
||||
|
||||
### 4.1 わかりにくい名前
|
||||
|
||||
#### 🔴 `src/llvm_py/` (Pythonコード)
|
||||
|
||||
**問題点**:
|
||||
- Rustプロジェクトに`llvm_py/`という名前は混乱を招く
|
||||
- Pythonコードが`src/`直下にあるのは非標準
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
# Option 1: scriptsへ移動
|
||||
scripts/
|
||||
└── llvm/
|
||||
├── llvm_builder.py
|
||||
└── (その他Pythonファイル)
|
||||
|
||||
# Option 2: 別リポジトリ/サブプロジェクト化
|
||||
nyash-llvm-backend/
|
||||
└── (Pythonプロジェクト)
|
||||
```
|
||||
|
||||
**影響範囲**: 中(ビルドスクリプト・実行経路)
|
||||
**優先度**: 中(Phase 15でLLVMハーネス整理時に対応)
|
||||
|
||||
---
|
||||
|
||||
#### 🟡 `src/runner_plugin_init.rs`
|
||||
|
||||
**問題点**:
|
||||
- トップレベルに配置されているが、runner/専用のコード
|
||||
- 命名が汎用的すぎる(何のinitか不明)
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
src/runner/
|
||||
└── plugins.rs # または plugin_init.rs
|
||||
```
|
||||
|
||||
**影響範囲**: 小(runner内部のみ)
|
||||
**優先度**: 低(機能的には問題なし)
|
||||
|
||||
---
|
||||
|
||||
### 4.2 配置が不適切なモジュール
|
||||
|
||||
#### 🟡 `src/scope_tracker.rs`
|
||||
|
||||
**現状**: トップレベルに配置
|
||||
|
||||
**問題点**:
|
||||
- VMバックエンド専用のコード(コメント: "Box lifecycle tracking for VM")
|
||||
- backend/mir_interpreter/と密結合
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
src/backend/mir_interpreter/
|
||||
└── scope_tracker.rs
|
||||
```
|
||||
|
||||
**影響範囲**: 小(backend内部のみ)
|
||||
**優先度**: 低(機能的には問題なし)
|
||||
|
||||
---
|
||||
|
||||
#### 🟡 `src/abi/nyrt_shim.rs`
|
||||
|
||||
**現状**: abi/配下だが、実際にはC-ABI PoC用のシム
|
||||
|
||||
**改善提案**:
|
||||
```
|
||||
src/backend/
|
||||
└── abi/
|
||||
└── nyrt_shim.rs
|
||||
```
|
||||
|
||||
または
|
||||
|
||||
```
|
||||
src/runtime/
|
||||
└── abi/
|
||||
└── nyrt_shim.rs
|
||||
```
|
||||
|
||||
**影響範囲**: 小(ABI関連のみ)
|
||||
**優先度**: 低(現状でも明確)
|
||||
|
||||
---
|
||||
|
||||
### 4.3 utils/commonの肥大化
|
||||
|
||||
#### 🔴 utils/common/helpersの散在
|
||||
|
||||
**現状**:
|
||||
```
|
||||
src/
|
||||
├── box_operators/helpers.rs
|
||||
├── backend/mir_interpreter/helpers.rs
|
||||
├── parser/common.rs
|
||||
├── parser/statements/helpers.rs
|
||||
├── parser/declarations/box_def/members/common.rs
|
||||
├── mir/utils/
|
||||
├── mir/phi_core/common.rs
|
||||
└── runner/modes/common.rs (14,000行!)
|
||||
```
|
||||
|
||||
**問題点**:
|
||||
- helpers/common/utilsが各モジュールに散在
|
||||
- 命名が汎用的で役割不明
|
||||
|
||||
**改善提案**:
|
||||
|
||||
**原則**:
|
||||
- `helpers.rs` → 具体的な名前(例: `arithmetic_helpers.rs`)
|
||||
- `common.rs` → 責務別に分割(例: `shared_types.rs`, `constants.rs`)
|
||||
- `utils/` → 明確な責務(例: `control_flow.rs`, `string_utils.rs`)
|
||||
|
||||
**具体例**:
|
||||
```
|
||||
# Before
|
||||
parser/common.rs
|
||||
|
||||
# After
|
||||
parser/
|
||||
├── shared_types.rs # 共有型定義
|
||||
├── constants.rs # パーサー定数
|
||||
└── cursor_helpers.rs # TokenCursor操作
|
||||
```
|
||||
|
||||
**影響範囲**: 中(各モジュール内部)
|
||||
**優先度**: 中(可読性向上)
|
||||
|
||||
---
|
||||
|
||||
## 5. 改善提案の優先度付け
|
||||
|
||||
### 🔥 優先度: 緊急(Phase 15目標と直結)
|
||||
|
||||
1. **`runner/modes/common.rs`分割** (14,000行)
|
||||
- Phase 15のセルフホスティング整理に必須
|
||||
- 影響範囲: 大
|
||||
- 見積もり: 3-5日
|
||||
|
||||
2. **`backend/mir_interpreter/handlers/calls.rs`分割** (49,750行)
|
||||
- 最大ファイルの分割は可読性に直結
|
||||
- 影響範囲: 中
|
||||
- 見積もり: 2-3日
|
||||
|
||||
3. **`runtime/plugin_loader_v2/`階層整理**
|
||||
- ネストが深すぎる問題の解消
|
||||
- 影響範囲: 大
|
||||
- 見積もり: 2-3日
|
||||
|
||||
---
|
||||
|
||||
### ⚡ 優先度: 高(可読性・保守性向上)
|
||||
|
||||
4. **BID関連モジュール命名統一**
|
||||
- `bid-*` → `bid/`配下へ統合
|
||||
- 影響範囲: 中
|
||||
- 見積もり: 1-2日
|
||||
|
||||
5. **`boxes/`カテゴリ再編**
|
||||
- 61ファイルを責務別にグルーピング
|
||||
- 影響範囲: 中
|
||||
- 見積もり: 2-3日
|
||||
|
||||
6. **`runner/modes/common_util/`再構成**
|
||||
- using解決・セルフホスト実行を明確に分離
|
||||
- 影響範囲: 中
|
||||
- 見積もり: 1-2日
|
||||
|
||||
---
|
||||
|
||||
### 🔵 優先度: 中(長期的改善)
|
||||
|
||||
7. **`mir/`モジュールのグルーピング強化**
|
||||
- builder/optimizer/verification等を明確化
|
||||
- 影響範囲: 中
|
||||
- 見積もり: 2-3日
|
||||
|
||||
8. **helpers/common/utils命名統一**
|
||||
- 汎用名から具体的な名前へ
|
||||
- 影響範囲: 小〜中
|
||||
- 見積もり: 1-2日
|
||||
|
||||
9. **トップレベルファイルの整理**
|
||||
- 20個の単一ファイルをcore/等に移動
|
||||
- 影響範囲: 大(全体構造)
|
||||
- 見積もり: 3-5日
|
||||
|
||||
---
|
||||
|
||||
### 🟢 優先度: 低(Nice to have)
|
||||
|
||||
10. **`llvm_py/`の配置再検討**
|
||||
- scripts/またはサブプロジェクト化
|
||||
- 影響範囲: 中
|
||||
- 見積もり: 1日
|
||||
|
||||
11. **pub/pub(crate)の最適化**
|
||||
- 公開APIの明確化
|
||||
- 影響範囲: 小
|
||||
- 見積もり: 1日
|
||||
|
||||
12. **`scope_tracker.rs`等の配置最適化**
|
||||
- 専用モジュールへ移動
|
||||
- 影響範囲: 小
|
||||
- 見積もり: 0.5日
|
||||
|
||||
---
|
||||
|
||||
## 6. リファクタリングの影響範囲マトリックス
|
||||
|
||||
| 改善項目 | コンパイル影響 | テスト影響 | ドキュメント影響 | 外部API影響 |
|
||||
|---------|------------|----------|--------------|-----------|
|
||||
| handlers分割 | 小 | 小 | 小 | なし |
|
||||
| runner/modes分割 | 中 | 中 | 中 | なし |
|
||||
| plugin_loader階層 | 大 | 中 | 大 | 小 |
|
||||
| BID命名統一 | 中 | 小 | 小 | なし |
|
||||
| boxes再編 | 中 | 小 | 中 | 小 |
|
||||
| mir/グルーピング | 中 | 小 | 中 | なし |
|
||||
| トップレベル整理 | 大 | 中 | 大 | 中 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 理想的なモジュール構造案
|
||||
|
||||
### 7.1 最終目標構造
|
||||
|
||||
```
|
||||
src/
|
||||
├── core/ # コア型・トレイト・環境
|
||||
│ ├── ast.rs
|
||||
│ ├── value.rs
|
||||
│ ├── types.rs
|
||||
│ └── environment.rs
|
||||
│
|
||||
├── frontend/ # フロントエンド
|
||||
│ ├── tokenizer/
|
||||
│ ├── parser/
|
||||
│ │ ├── expressions/
|
||||
│ │ ├── statements/
|
||||
│ │ └── declarations/
|
||||
│ ├── syntax/ # 構文糖
|
||||
│ └── macro/ # マクロシステム
|
||||
│
|
||||
├── middle/ # 中間表現
|
||||
│ ├── mir/
|
||||
│ │ ├── core/ # 命令・関数・ブロック
|
||||
│ │ ├── builder/ # MIRビルダー
|
||||
│ │ ├── optimizer/ # 最適化
|
||||
│ │ ├── verification/ # 検証
|
||||
│ │ └── emission/ # コード生成
|
||||
│ └── semantics/ # 意味解析
|
||||
│
|
||||
├── backend/ # バックエンド
|
||||
│ ├── vm/ # Rust VM
|
||||
│ │ ├── core/
|
||||
│ │ ├── handlers/ # 命令ハンドラ
|
||||
│ │ └── scope_tracker.rs
|
||||
│ ├── llvm/ # LLVM(Rust側)
|
||||
│ ├── wasm/ # WASM
|
||||
│ └── abi/ # C-ABI
|
||||
│
|
||||
├── runtime/ # ランタイムシステム
|
||||
│ ├── plugins/ # プラグインシステム
|
||||
│ │ ├── core/
|
||||
│ │ ├── loader/
|
||||
│ │ └── config.rs
|
||||
│ ├── gc/ # GCシステム
|
||||
│ ├── scheduler/ # スケジューラ
|
||||
│ └── registry/ # Box/型レジストリ
|
||||
│
|
||||
├── boxes/ # Box実装
|
||||
│ ├── primitives/ # String/Integer/Bool
|
||||
│ ├── collections/ # Array/Map/Buffer
|
||||
│ ├── io/ # File/HTTP/Stream
|
||||
│ ├── system/ # Console/Debug/Time
|
||||
│ ├── advanced/ # JSON/Regex/Future
|
||||
│ └── platform/ # Web/Audio/GUI
|
||||
│
|
||||
├── runner/ # 実行コーディネーター
|
||||
│ ├── execution/ # 実行モード
|
||||
│ ├── pipeline/ # パイプライン処理
|
||||
│ ├── resolution/ # using/namespace解決
|
||||
│ ├── selfhost/ # セルフホスト実行
|
||||
│ └── io/ # 入出力
|
||||
│
|
||||
├── cli/ # CLIシステム
|
||||
├── config/ # 設定システム
|
||||
├── debug/ # デバッグ支援
|
||||
├── using/ # using resolver
|
||||
├── host_providers/ # ホストプロバイダ
|
||||
│
|
||||
├── lib.rs # ライブラリエントリーポイント
|
||||
└── main.rs # 実行可能ファイルエントリーポイント
|
||||
|
||||
scripts/ # ビルドスクリプト(Rustの外)
|
||||
└── llvm/
|
||||
└── (Pythonコード)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 段階的移行戦略
|
||||
|
||||
### Phase 1: 緊急対応(1-2週間)
|
||||
1. `handlers/calls.rs`分割(49,750行)
|
||||
2. `runner/modes/common.rs`分割(14,000行)
|
||||
3. `runtime/plugin_loader_v2/`階層整理
|
||||
|
||||
### Phase 2: 高優先度(2-3週間)
|
||||
4. BID関連モジュール統一
|
||||
5. `boxes/`カテゴリ再編
|
||||
6. `runner/modes/common_util/`再構成
|
||||
|
||||
### Phase 3: 中優先度(3-4週間)
|
||||
7. `mir/`グルーピング強化
|
||||
8. helpers/common/utils命名統一
|
||||
9. `llvm_py/`配置再検討
|
||||
|
||||
### Phase 4: 長期改善(時期未定)
|
||||
10. トップレベルファイル整理(全体構造変更)
|
||||
11. pub/pub(crate)最適化
|
||||
12. 細かい配置最適化
|
||||
|
||||
---
|
||||
|
||||
## 9. 成功メトリクス
|
||||
|
||||
### 定量的指標
|
||||
- [ ] 1,000行超のファイル数: **現在20+** → **目標: 5以下**
|
||||
- [ ] 平均ファイル行数: **現在500-1000** → **目標: 300以下**
|
||||
- [ ] モジュール階層深度: **最大5階層** → **目標: 3階層以下**
|
||||
- [ ] utils/common/helpersファイル数: **現在15+** → **目標: 5以下**
|
||||
|
||||
### 定性的指標
|
||||
- [ ] 新規開発者が30分以内にモジュール構造を理解できる
|
||||
- [ ] 単一ファイル内で完結する変更が80%以上
|
||||
- [ ] テストの局所性が向上(モジュール単位でテスト可能)
|
||||
- [ ] ドキュメントの保守コスト削減
|
||||
|
||||
---
|
||||
|
||||
## 10. リスク管理
|
||||
|
||||
### 高リスク項目
|
||||
- **トップレベル構造変更**: 全体に影響、慎重な移行が必要
|
||||
- **plugin_loader階層変更**: 多くのインポートパスが変更
|
||||
|
||||
### リスク軽減策
|
||||
- 段階的移行(Phase 1→4)
|
||||
- 各Phaseでコンパイル・テスト確認
|
||||
- deprecation警告期間の設定(pub use経由で旧パス維持)
|
||||
- ドキュメント同時更新
|
||||
|
||||
---
|
||||
|
||||
## 11. 参考資料
|
||||
|
||||
### Rustのモジュール設計ベストプラクティス
|
||||
- [The Rust Programming Language - Modules](https://doc.rust-lang.org/book/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html)
|
||||
- [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/)
|
||||
|
||||
### 類似プロジェクトの構造
|
||||
- **rustc**: frontend/middle/backend分離
|
||||
- **cargo**: src/cargo/{core,ops,sources,util}
|
||||
- **tokio**: tokio/{runtime,task,sync,io}
|
||||
|
||||
---
|
||||
|
||||
## 12. まとめ
|
||||
|
||||
Hakoruneコードベースは概ね良好に整理されていますが、以下の3点が主要な改善機会です:
|
||||
|
||||
1. **巨大ファイルの分割** - calls.rs (49,750行)、common.rs (14,000行)
|
||||
2. **階層の最適化** - plugin_loader_v2の深すぎるネスト
|
||||
3. **命名・配置の統一** - BID関連、helpers/common/utils
|
||||
|
||||
Phase 15のセルフホスティング目標と連携し、段階的に改善を進めることで、
|
||||
**可読性・保守性・拡張性**の大幅な向上が期待できます。
|
||||
|
||||
---
|
||||
|
||||
**次のアクション**:
|
||||
1. このレポートをチームでレビュー
|
||||
2. Phase 1の3項目を優先実施
|
||||
3. 各Phase完了後に成功メトリクスを測定
|
||||
598
docs/development/refactoring/PHASE1_IMPLEMENTATION_GUIDE.md
Normal file
598
docs/development/refactoring/PHASE1_IMPLEMENTATION_GUIDE.md
Normal file
@ -0,0 +1,598 @@
|
||||
# Phase 1実装ガイド - 緊急対応項目
|
||||
|
||||
**対象期間**: 1-2週間
|
||||
**目標**: 最も影響の大きい3つの巨大ファイル/モジュールを整理
|
||||
|
||||
---
|
||||
|
||||
## 1. handlers/calls.rs分割(49,750行)
|
||||
|
||||
### 1.1 現状分析
|
||||
|
||||
**ファイルパス**: `src/backend/mir_interpreter/handlers/calls.rs`
|
||||
**行数**: 49,750行(プロジェクト最大)
|
||||
|
||||
### 1.2 責務の分類
|
||||
|
||||
calls.rsを詳細調査し、以下のカテゴリに分類:
|
||||
|
||||
```bash
|
||||
# 調査コマンド
|
||||
cd /home/tomoaki/git/hakorune-selfhost
|
||||
rg "^pub\(super\) fn|^fn " src/backend/mir_interpreter/handlers/calls.rs | head -50
|
||||
```
|
||||
|
||||
**予想される責務**:
|
||||
1. 関数呼び出し解決 (resolution)
|
||||
2. 呼び出しディスパッチ (dispatch)
|
||||
3. 引数処理 (argument handling)
|
||||
4. 戻り値処理 (return value handling)
|
||||
5. エラーハンドリング (error handling)
|
||||
|
||||
### 1.3 分割戦略
|
||||
|
||||
#### ステップ1: 分析・マッピング(1日)
|
||||
|
||||
```bash
|
||||
# 関数一覧を抽出
|
||||
rg "^pub\(super\) fn|^fn " src/backend/mir_interpreter/handlers/calls.rs \
|
||||
> /tmp/calls_functions.txt
|
||||
|
||||
# 依存関係を分析
|
||||
rg "self\." src/backend/mir_interpreter/handlers/calls.rs \
|
||||
| sort | uniq > /tmp/calls_dependencies.txt
|
||||
```
|
||||
|
||||
**作業内容**:
|
||||
- [ ] 全関数の責務を分類
|
||||
- [ ] 関数間の依存関係を可視化
|
||||
- [ ] 共有される型・定数を特定
|
||||
|
||||
#### ステップ2: ディレクトリ構造作成(0.5日)
|
||||
|
||||
```
|
||||
handlers/
|
||||
└── calls/
|
||||
├── mod.rs # 公開インターフェース
|
||||
├── resolution.rs # 呼び出し解決
|
||||
├── dispatch.rs # ディスパッチロジック
|
||||
├── arguments.rs # 引数処理
|
||||
├── returns.rs # 戻り値処理
|
||||
├── errors.rs # エラーハンドリング
|
||||
└── shared.rs # 共有型・定数
|
||||
```
|
||||
|
||||
**実装**:
|
||||
```bash
|
||||
cd /home/tomoaki/git/hakorune-selfhost
|
||||
mkdir -p src/backend/mir_interpreter/handlers/calls
|
||||
```
|
||||
|
||||
#### ステップ3: 段階的移動(2日)
|
||||
|
||||
**移動順序**(依存の少ない順):
|
||||
1. `shared.rs` - 共有型・定数
|
||||
2. `errors.rs` - エラー型
|
||||
3. `arguments.rs` - 引数処理
|
||||
4. `returns.rs` - 戻り値処理
|
||||
5. `resolution.rs` - 解決ロジック
|
||||
6. `dispatch.rs` - メインディスパッチ
|
||||
7. `mod.rs` - 統合
|
||||
|
||||
**各ファイルのテンプレート**:
|
||||
```rust
|
||||
// src/backend/mir_interpreter/handlers/calls/resolution.rs
|
||||
use super::shared::*;
|
||||
use super::errors::*;
|
||||
use crate::backend::mir_interpreter::MirInterpreter;
|
||||
use crate::backend::vm_types::VMError;
|
||||
|
||||
impl MirInterpreter {
|
||||
/// 呼び出しターゲットを解決
|
||||
pub(in crate::backend::mir_interpreter) fn resolve_call_target(
|
||||
&self,
|
||||
func_name: &str,
|
||||
) -> Result<CallTarget, VMError> {
|
||||
// ... 実装
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### ステップ4: 統合・テスト(0.5日)
|
||||
|
||||
**mod.rsの作成**:
|
||||
```rust
|
||||
// src/backend/mir_interpreter/handlers/calls/mod.rs
|
||||
mod shared;
|
||||
mod errors;
|
||||
mod arguments;
|
||||
mod returns;
|
||||
mod resolution;
|
||||
mod dispatch;
|
||||
|
||||
// 必要に応じて再エクスポート
|
||||
pub(super) use resolution::*;
|
||||
pub(super) use dispatch::*;
|
||||
// ...
|
||||
```
|
||||
|
||||
**handlers/mod.rsの更新**:
|
||||
```rust
|
||||
// src/backend/mir_interpreter/handlers/mod.rs
|
||||
mod calls; // calls.rs → calls/mod.rs
|
||||
|
||||
impl MirInterpreter {
|
||||
pub(super) fn execute_instruction(&mut self, inst: &MirInstruction) -> Result<(), VMError> {
|
||||
match inst {
|
||||
MirInstruction::Call { ... } => self.handle_call(...)?,
|
||||
// ...
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### ステップ5: 検証(0.5日)
|
||||
|
||||
```bash
|
||||
# コンパイル確認
|
||||
cargo build --release
|
||||
|
||||
# テスト実行
|
||||
cargo test --package nyash_rust --lib backend::mir_interpreter
|
||||
|
||||
# スモークテスト
|
||||
./tools/smokes/v2/run.sh --profile quick --filter "call_*"
|
||||
```
|
||||
|
||||
### 1.4 成功基準
|
||||
|
||||
- [ ] calls.rsが6つのファイルに分割(各5,000-10,000行以下)
|
||||
- [ ] コンパイルエラーなし
|
||||
- [ ] 既存テストが全てパス
|
||||
- [ ] スモークテストが全てパス
|
||||
|
||||
---
|
||||
|
||||
## 2. runner/modes/common.rs分割(14,000行)
|
||||
|
||||
### 2.1 現状分析
|
||||
|
||||
**ファイルパス**: `src/runner/modes/common.rs`
|
||||
**行数**: 14,000行
|
||||
**問題**: 「共通処理」という曖昧な責務
|
||||
|
||||
### 2.2 責務の分類
|
||||
|
||||
```bash
|
||||
# 関数一覧抽出
|
||||
rg "^pub fn|^fn " src/runner/modes/common.rs > /tmp/common_functions.txt
|
||||
|
||||
# インポート分析
|
||||
rg "^use " src/runner/modes/common.rs | sort | uniq > /tmp/common_imports.txt
|
||||
```
|
||||
|
||||
**予想される責務**:
|
||||
1. ファイルI/O処理
|
||||
2. MIRコンパイル・実行
|
||||
3. using/namespace解決
|
||||
4. 環境変数処理
|
||||
5. エラーハンドリング
|
||||
|
||||
### 2.3 分割戦略
|
||||
|
||||
#### ステップ1: 責務マッピング(1日)
|
||||
|
||||
**分析スクリプト**:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# analyze_common.sh
|
||||
file="src/runner/modes/common.rs"
|
||||
|
||||
echo "=== 関数分析 ==="
|
||||
rg "^pub fn|^fn " "$file" | awk '{print $2}' | sed 's/(.*//' | sort
|
||||
|
||||
echo "=== use文分析 ==="
|
||||
rg "^use " "$file" | awk '{print $2}' | sort | uniq -c | sort -rn | head -20
|
||||
|
||||
echo "=== MIRに関連する関数 ==="
|
||||
rg "fn.*mir" "$file" -i
|
||||
|
||||
echo "=== 実行に関連する関数 ==="
|
||||
rg "fn.*execute|fn.*run" "$file" -i
|
||||
|
||||
echo "=== 解決に関連する関数 ==="
|
||||
rg "fn.*resolve" "$file" -i
|
||||
```
|
||||
|
||||
#### ステップ2: 新構造の設計(0.5日)
|
||||
|
||||
```
|
||||
runner/
|
||||
├── execution/ # 実行関連(common.rsから移動)
|
||||
│ ├── mod.rs
|
||||
│ ├── vm.rs # VM実行
|
||||
│ ├── llvm.rs # LLVM実行
|
||||
│ ├── pyvm.rs # PyVM実行
|
||||
│ └── prepare.rs # 実行準備
|
||||
├── pipeline/ # パイプライン処理
|
||||
│ ├── mod.rs
|
||||
│ ├── compilation.rs # MIRコンパイル
|
||||
│ ├── preprocessing.rs
|
||||
│ └── postprocessing.rs
|
||||
├── resolution/ # using/namespace解決
|
||||
│ ├── mod.rs
|
||||
│ ├── using.rs
|
||||
│ ├── namespace.rs
|
||||
│ └── prelude.rs
|
||||
└── modes/ # 既存(execution/等からインポート)
|
||||
├── mod.rs
|
||||
├── vm.rs # execution::vm を呼ぶだけ
|
||||
├── llvm.rs
|
||||
└── pyvm.rs
|
||||
```
|
||||
|
||||
#### ステップ3: 段階的移動(2日)
|
||||
|
||||
**移動順序**:
|
||||
1. **Phase A**: resolution/ に using解決関連を移動
|
||||
2. **Phase B**: pipeline/ に MIRコンパイル関連を移動
|
||||
3. **Phase C**: execution/ に実行関連を移動
|
||||
4. **Phase D**: modes/ を薄いラッパーに変更
|
||||
|
||||
**Phase A実装例**:
|
||||
```rust
|
||||
// src/runner/resolution/using.rs
|
||||
use crate::runner::modes::common_util::resolve::using_resolution::*;
|
||||
use std::path::Path;
|
||||
|
||||
/// using target を解決
|
||||
pub fn resolve_using_target(
|
||||
target: &str,
|
||||
context: Option<&Path>,
|
||||
) -> Result<String, String> {
|
||||
// ... common.rsから移動した実装
|
||||
}
|
||||
```
|
||||
|
||||
**Phase D実装例**:
|
||||
```rust
|
||||
// src/runner/modes/vm.rs
|
||||
use crate::runner::execution;
|
||||
use crate::runner::pipeline;
|
||||
use crate::cli::CliGroups;
|
||||
|
||||
pub fn execute_vm_mode(groups: &CliGroups, filename: &str) -> i32 {
|
||||
// 薄いラッパー - 実際の処理は execution/pipeline/ に委譲
|
||||
let module = match pipeline::compile_file(filename) {
|
||||
Ok(m) => m,
|
||||
Err(e) => {
|
||||
eprintln!("❌ Compilation error: {}", e);
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
execution::run_vm(&module, groups)
|
||||
}
|
||||
```
|
||||
|
||||
#### ステップ4: common.rsの削除(0.5日)
|
||||
|
||||
```bash
|
||||
# 移動後、common.rsが空になったことを確認
|
||||
wc -l src/runner/modes/common.rs # 目標: 50行以下
|
||||
|
||||
# 削除または最小限のre-export
|
||||
```
|
||||
|
||||
**最小限のcommon.rs**:
|
||||
```rust
|
||||
// src/runner/modes/common.rs
|
||||
// 後方互換性のための re-export のみ
|
||||
#[deprecated(note = "Use crate::runner::execution instead")]
|
||||
pub use crate::runner::execution::*;
|
||||
|
||||
#[deprecated(note = "Use crate::runner::pipeline instead")]
|
||||
pub use crate::runner::pipeline::*;
|
||||
```
|
||||
|
||||
#### ステップ5: テスト・検証(0.5日)
|
||||
|
||||
```bash
|
||||
# コンパイル確認
|
||||
cargo build --release
|
||||
|
||||
# 統合テスト
|
||||
cargo test --package nyash_rust --lib runner
|
||||
|
||||
# E2Eテスト
|
||||
./tools/smokes/v2/run.sh --profile quick
|
||||
./tools/smokes/v2/run.sh --profile integration
|
||||
```
|
||||
|
||||
### 2.4 成功基準
|
||||
|
||||
- [ ] common.rsが1,000行以下(理想: 100行以下のre-export)
|
||||
- [ ] 新構造(execution/pipeline/resolution/)が明確
|
||||
- [ ] 全テストがパス
|
||||
- [ ] deprecation警告が適切に表示される
|
||||
|
||||
---
|
||||
|
||||
## 3. runtime/plugin_loader_v2/階層整理
|
||||
|
||||
### 3.1 現状分析
|
||||
|
||||
**現在の構造**:
|
||||
```
|
||||
runtime/
|
||||
└── plugin_loader_v2/
|
||||
├── mod.rs
|
||||
├── stub.rs
|
||||
└── enabled/
|
||||
├── mod.rs
|
||||
├── globals.rs
|
||||
├── method_resolver.rs
|
||||
├── types.rs
|
||||
├── extern_functions.rs
|
||||
├── ffi_bridge.rs
|
||||
├── host_bridge.rs
|
||||
├── instance_manager.rs
|
||||
├── errors.rs
|
||||
└── loader/ # 5階層目!
|
||||
├── mod.rs
|
||||
├── specs.rs
|
||||
├── metadata.rs
|
||||
├── singletons.rs
|
||||
├── library.rs
|
||||
├── config.rs
|
||||
└── util.rs
|
||||
```
|
||||
|
||||
**問題点**:
|
||||
- 最深5階層(`runtime/plugin_loader_v2/enabled/loader/specs.rs`)
|
||||
- `enabled/`という曖昧な名前
|
||||
- `loader/`が1階層深い
|
||||
|
||||
### 3.2 新構造の設計
|
||||
|
||||
```
|
||||
runtime/
|
||||
└── plugins/ # plugin_loader_v2 → plugins
|
||||
├── mod.rs
|
||||
├── stub.rs # プラグイン無効時
|
||||
├── core/ # enabled → core
|
||||
│ ├── mod.rs
|
||||
│ ├── types.rs
|
||||
│ ├── globals.rs
|
||||
│ ├── method_resolver.rs
|
||||
│ └── instance_manager.rs
|
||||
├── loader/ # 1階層上げる
|
||||
│ ├── mod.rs
|
||||
│ ├── specs.rs
|
||||
│ ├── metadata.rs
|
||||
│ ├── singletons.rs
|
||||
│ └── library.rs
|
||||
├── bridge/ # FFI/ブリッジ処理
|
||||
│ ├── mod.rs
|
||||
│ ├── ffi.rs # ffi_bridge.rs → ffi.rs
|
||||
│ ├── host.rs # host_bridge.rs → host.rs
|
||||
│ └── extern_functions.rs
|
||||
├── config.rs # loader/config.rs → トップレベル
|
||||
└── errors.rs # トップレベルへ
|
||||
```
|
||||
|
||||
**改善点**:
|
||||
- 最深4階層(`runtime/plugins/loader/specs.rs`)
|
||||
- 明確な責務分離(core/loader/bridge)
|
||||
- 短いインポートパス
|
||||
|
||||
### 3.3 移行戦略
|
||||
|
||||
#### ステップ1: 新ディレクトリ作成(0.5日)
|
||||
|
||||
```bash
|
||||
cd /home/tomoaki/git/hakorune-selfhost
|
||||
mkdir -p src/runtime/plugins/{core,loader,bridge}
|
||||
```
|
||||
|
||||
#### ステップ2: ファイル移動(1日)
|
||||
|
||||
**移動計画**:
|
||||
```bash
|
||||
# Phase A: 独立ファイル
|
||||
mv src/runtime/plugin_loader_v2/stub.rs src/runtime/plugins/
|
||||
mv src/runtime/plugin_loader_v2/enabled/errors.rs src/runtime/plugins/
|
||||
mv src/runtime/plugin_loader_v2/enabled/loader/config.rs src/runtime/plugins/
|
||||
|
||||
# Phase B: core/
|
||||
mv src/runtime/plugin_loader_v2/enabled/{types,globals,method_resolver,instance_manager}.rs \
|
||||
src/runtime/plugins/core/
|
||||
|
||||
# Phase C: bridge/
|
||||
mv src/runtime/plugin_loader_v2/enabled/ffi_bridge.rs src/runtime/plugins/bridge/ffi.rs
|
||||
mv src/runtime/plugin_loader_v2/enabled/host_bridge.rs src/runtime/plugins/bridge/host.rs
|
||||
mv src/runtime/plugin_loader_v2/enabled/extern_functions.rs src/runtime/plugins/bridge/
|
||||
|
||||
# Phase D: loader/
|
||||
mv src/runtime/plugin_loader_v2/enabled/loader/*.rs src/runtime/plugins/loader/
|
||||
```
|
||||
|
||||
#### ステップ3: モジュール宣言更新(0.5日)
|
||||
|
||||
**plugins/mod.rs**:
|
||||
```rust
|
||||
// src/runtime/plugins/mod.rs
|
||||
#[cfg(not(feature = "disable-plugins"))]
|
||||
pub mod core;
|
||||
#[cfg(not(feature = "disable-plugins"))]
|
||||
pub mod loader;
|
||||
#[cfg(not(feature = "disable-plugins"))]
|
||||
pub mod bridge;
|
||||
|
||||
#[cfg(feature = "disable-plugins")]
|
||||
pub mod stub;
|
||||
|
||||
pub mod config;
|
||||
pub mod errors;
|
||||
|
||||
// 後方互換性のための re-export
|
||||
#[cfg(not(feature = "disable-plugins"))]
|
||||
pub use core::{PluginBoxType, MethodHandle};
|
||||
#[cfg(not(feature = "disable-plugins"))]
|
||||
pub use loader::PluginLoaderV2;
|
||||
```
|
||||
|
||||
**runtime/mod.rs**:
|
||||
```rust
|
||||
// src/runtime/mod.rs
|
||||
pub mod plugins; // plugin_loader_v2 → plugins
|
||||
|
||||
// 後方互換性
|
||||
#[deprecated(note = "Use crate::runtime::plugins instead")]
|
||||
pub use plugins as plugin_loader_v2;
|
||||
```
|
||||
|
||||
#### ステップ4: インポート更新(1日)
|
||||
|
||||
**検索・置換**:
|
||||
```bash
|
||||
# 全ファイルでインポートパスを更新
|
||||
find src -name "*.rs" -type f -exec sed -i \
|
||||
's/crate::runtime::plugin_loader_v2/crate::runtime::plugins/g' {} \;
|
||||
|
||||
find src -name "*.rs" -type f -exec sed -i \
|
||||
's/crate::runtime::plugin_loader_v2::enabled/crate::runtime::plugins::core/g' {} \;
|
||||
```
|
||||
|
||||
**手動確認箇所**:
|
||||
- `src/runner/plugins.rs`
|
||||
- `src/backend/mir_interpreter/handlers/boxes_plugin.rs`
|
||||
- `src/runtime/unified_registry.rs`
|
||||
|
||||
#### ステップ5: テスト・検証(0.5日)
|
||||
|
||||
```bash
|
||||
# コンパイル確認(プラグイン有効)
|
||||
cargo build --release
|
||||
|
||||
# コンパイル確認(プラグイン無効)
|
||||
cargo build --release --features disable-plugins
|
||||
|
||||
# プラグインテスト
|
||||
cargo test --package nyash_rust --lib runtime::plugins
|
||||
|
||||
# E2Eテスト
|
||||
NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.sh
|
||||
```
|
||||
|
||||
#### ステップ6: 旧ディレクトリ削除(0.5日)
|
||||
|
||||
```bash
|
||||
# 移行完了後
|
||||
rm -rf src/runtime/plugin_loader_v2
|
||||
|
||||
# Git確認
|
||||
git status
|
||||
git diff --stat
|
||||
```
|
||||
|
||||
### 3.4 成功基準
|
||||
|
||||
- [ ] 最深階層が4階層以下
|
||||
- [ ] `plugin_loader_v2` → `plugins` に完全移行
|
||||
- [ ] 全テストがパス
|
||||
- [ ] deprecation警告が適切に機能
|
||||
|
||||
---
|
||||
|
||||
## 4. Phase 1全体のチェックリスト
|
||||
|
||||
### 準備(開始前)
|
||||
|
||||
- [ ] Gitブランチ作成: `refactor/phase1-module-structure`
|
||||
- [ ] ベースラインテスト実行・記録
|
||||
- [ ] バックアップ取得
|
||||
|
||||
### 実装(1-2週間)
|
||||
|
||||
#### Week 1
|
||||
- [ ] Day 1-2: calls.rs分析・分割計画
|
||||
- [ ] Day 3-4: calls.rs移動・統合
|
||||
- [ ] Day 5: calls.rs検証・テスト
|
||||
|
||||
#### Week 2
|
||||
- [ ] Day 1-2: common.rs分析・分割計画
|
||||
- [ ] Day 3-4: common.rs移動・統合
|
||||
- [ ] Day 5: common.rs検証
|
||||
|
||||
#### Week 2 (並行可能)
|
||||
- [ ] Day 1-2: plugin_loader_v2移行計画
|
||||
- [ ] Day 3-4: plugin_loader_v2移動・統合
|
||||
- [ ] Day 5: plugin_loader_v2検証
|
||||
|
||||
### 検証(完了後)
|
||||
|
||||
- [ ] 全コンパイルエラー解消
|
||||
- [ ] 全ユニットテストパス
|
||||
- [ ] スモークテストパス(quick/integration)
|
||||
- [ ] ドキュメント更新
|
||||
- [ ] PRレビュー・マージ
|
||||
|
||||
---
|
||||
|
||||
## 5. ロールバック計画
|
||||
|
||||
### トラブル発生時の対応
|
||||
|
||||
**軽微な問題**(コンパイルエラー等):
|
||||
```bash
|
||||
# 部分的に戻す
|
||||
git checkout HEAD -- src/backend/mir_interpreter/handlers/calls/
|
||||
```
|
||||
|
||||
**重大な問題**(実行時エラー・テスト失敗):
|
||||
```bash
|
||||
# ブランチ全体を破棄
|
||||
git checkout main
|
||||
git branch -D refactor/phase1-module-structure
|
||||
```
|
||||
|
||||
**再実行の判断基準**:
|
||||
- 問題の原因が明確で、修正に1日以内
|
||||
- それ以外はロールバックして再計画
|
||||
|
||||
---
|
||||
|
||||
## 6. コミュニケーション
|
||||
|
||||
### チーム共有
|
||||
|
||||
**開始時**:
|
||||
- [ ] CURRENT_TASK.mdに記載
|
||||
- [ ] チームに通知(Issue/PR作成)
|
||||
|
||||
**進捗報告**(毎日):
|
||||
- [ ] 完了した作業
|
||||
- [ ] 発見した問題
|
||||
- [ ] 翌日の予定
|
||||
|
||||
**完了時**:
|
||||
- [ ] PR作成
|
||||
- [ ] レビュー依頼
|
||||
- [ ] ドキュメント更新を含める
|
||||
|
||||
---
|
||||
|
||||
## 7. 次のステップ
|
||||
|
||||
Phase 1完了後、Phase 2(高優先度項目)に進む:
|
||||
- BID関連モジュール統一
|
||||
- boxes/カテゴリ再編
|
||||
- runner/modes/common_util/再構成
|
||||
|
||||
**Phase 2実装ガイド**: `PHASE2_IMPLEMENTATION_GUIDE.md`(別途作成)
|
||||
|
||||
---
|
||||
|
||||
**このガイドに従って、Phase 1の3項目を確実に完了させましょう!**
|
||||
196
docs/development/refactoring/QUICK_REFERENCE.md
Normal file
196
docs/development/refactoring/QUICK_REFERENCE.md
Normal file
@ -0,0 +1,196 @@
|
||||
# モジュール構造改善 - クイックリファレンス
|
||||
|
||||
**最終更新**: 2025-11-06
|
||||
|
||||
## 📋 3つのドキュメント
|
||||
|
||||
| ドキュメント | 用途 | 対象読者 |
|
||||
|------------|------|---------|
|
||||
| **MODULE_STRUCTURE_ANALYSIS.md** | 全体分析・戦略 | チームリーダー・アーキテクト |
|
||||
| **PHASE1_IMPLEMENTATION_GUIDE.md** | Phase 1実装手順 | 開発者 |
|
||||
| **このファイル** | クイックリファレンス | 全員 |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 緊急対応(Phase 1)- 1-2週間
|
||||
|
||||
### 対象ファイル
|
||||
|
||||
| ファイル | 現在行数 | 目標 | 優先度 |
|
||||
|---------|---------|------|--------|
|
||||
| `handlers/calls.rs` | 49,750 | 6ファイルに分割 | 🔥最高 |
|
||||
| `runner/modes/common.rs` | 14,000 | 1,000行以下 | 🔥最高 |
|
||||
| `runtime/plugin_loader_v2/` | 5階層 | 4階層に削減 | 🔥最高 |
|
||||
|
||||
### クイック実装手順
|
||||
|
||||
#### 1. calls.rs分割
|
||||
```bash
|
||||
# 1. ディレクトリ作成
|
||||
mkdir -p src/backend/mir_interpreter/handlers/calls
|
||||
|
||||
# 2. 責務別に分割
|
||||
# - resolution.rs (呼び出し解決)
|
||||
# - dispatch.rs (ディスパッチ)
|
||||
# - arguments.rs (引数処理)
|
||||
# - returns.rs (戻り値処理)
|
||||
# - errors.rs (エラー)
|
||||
# - shared.rs (共有型)
|
||||
|
||||
# 3. テスト
|
||||
cargo build --release && cargo test
|
||||
```
|
||||
|
||||
#### 2. common.rs分割
|
||||
```bash
|
||||
# 1. 新構造作成
|
||||
mkdir -p src/runner/{execution,pipeline,resolution}
|
||||
|
||||
# 2. 責務別に移動
|
||||
# execution/ - VM/LLVM/PyVM実行
|
||||
# pipeline/ - MIRコンパイル・前処理
|
||||
# resolution/ - using/namespace解決
|
||||
|
||||
# 3. modesを薄いラッパーに
|
||||
# modes/*.rs → execution/*.rs を呼ぶだけ
|
||||
|
||||
# 4. テスト
|
||||
./tools/smokes/v2/run.sh --profile quick
|
||||
```
|
||||
|
||||
#### 3. plugin_loader_v2階層整理
|
||||
```bash
|
||||
# 1. 新構造作成
|
||||
mkdir -p src/runtime/plugins/{core,loader,bridge}
|
||||
|
||||
# 2. ファイル移動
|
||||
# enabled/ → core/
|
||||
# enabled/loader/ → loader/
|
||||
# enabled/*_bridge.rs → bridge/
|
||||
|
||||
# 3. runtime/mod.rs更新
|
||||
# pub mod plugins;
|
||||
|
||||
# 4. テスト
|
||||
NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 統計サマリー
|
||||
|
||||
### 現状
|
||||
- **総ファイル数**: 500+
|
||||
- **最大ファイル**: calls.rs (49,750行)
|
||||
- **平均ファイル**: 500-1000行
|
||||
- **最深階層**: 5階層
|
||||
|
||||
### 目標(Phase 1完了後)
|
||||
- **1,000行超ファイル**: 20+ → 10以下
|
||||
- **最大ファイル**: 10,000行以下
|
||||
- **平均ファイル**: 300-500行
|
||||
- **最深階層**: 4階層以下
|
||||
|
||||
---
|
||||
|
||||
## 🚨 重要な注意点
|
||||
|
||||
### やってはいけないこと
|
||||
1. ❌ 一度に全ての変更を行う(段階的に!)
|
||||
2. ❌ テストをスキップする(毎回確認!)
|
||||
3. ❌ 後方互換性を無視する(deprecation使用)
|
||||
4. ❌ ドキュメント更新を忘れる
|
||||
|
||||
### 必ずやること
|
||||
1. ✅ Gitブランチを作成してから作業
|
||||
2. ✅ 各ステップでコンパイル確認
|
||||
3. ✅ 全テストが通ることを確認
|
||||
4. ✅ 進捗をチームに共有
|
||||
|
||||
---
|
||||
|
||||
## 🔧 便利なコマンド
|
||||
|
||||
### ファイル分析
|
||||
```bash
|
||||
# ファイル行数ランキング
|
||||
find src -name "*.rs" -exec wc -l {} \; | sort -rn | head -20
|
||||
|
||||
# 特定モジュールの行数
|
||||
wc -l src/backend/mir_interpreter/handlers/*.rs | sort -rn
|
||||
|
||||
# 関数一覧抽出
|
||||
rg "^pub fn|^fn " src/path/to/file.rs
|
||||
```
|
||||
|
||||
### 依存関係分析
|
||||
```bash
|
||||
# インポート分析
|
||||
rg "^use crate::" src/module/ | sort | uniq -c | sort -rn
|
||||
|
||||
# 特定モジュールへの依存を検索
|
||||
rg "use crate::runtime::plugin_loader_v2" src/
|
||||
```
|
||||
|
||||
### テスト実行
|
||||
```bash
|
||||
# フルビルド
|
||||
cargo build --release
|
||||
|
||||
# 特定モジュールのテスト
|
||||
cargo test --package nyash_rust --lib backend::mir_interpreter
|
||||
|
||||
# スモークテスト(VM)
|
||||
./tools/smokes/v2/run.sh --profile quick
|
||||
|
||||
# スモークテスト(LLVM統合)
|
||||
./tools/smokes/v2/run.sh --profile integration
|
||||
|
||||
# プラグインテスト
|
||||
NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 追加リソース
|
||||
|
||||
### Rustのベストプラクティス
|
||||
- [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/)
|
||||
- [Rust Book - Modules](https://doc.rust-lang.org/book/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html)
|
||||
|
||||
### プロジェクト内ドキュメント
|
||||
- `/docs/development/architecture/` - アーキテクチャ設計
|
||||
- `/docs/development/roadmap/` - ロードマップ
|
||||
- `/CURRENT_TASK.md` - 現在のタスク
|
||||
|
||||
---
|
||||
|
||||
## 🎯 次のアクション
|
||||
|
||||
### 今すぐやること
|
||||
1. [ ] MODULE_STRUCTURE_ANALYSIS.mdを読む
|
||||
2. [ ] PHASE1_IMPLEMENTATION_GUIDE.mdを読む
|
||||
3. [ ] Gitブランチを作成
|
||||
4. [ ] calls.rs分析を開始
|
||||
|
||||
### 1週間後
|
||||
1. [ ] calls.rs分割完了
|
||||
2. [ ] common.rs分析・分割開始
|
||||
|
||||
### 2週間後
|
||||
1. [ ] Phase 1全項目完了
|
||||
2. [ ] PR作成・レビュー
|
||||
3. [ ] Phase 2計画開始
|
||||
|
||||
---
|
||||
|
||||
## 📞 サポート
|
||||
|
||||
質問・相談は以下へ:
|
||||
- **Issue**: GitHub Issueで質問
|
||||
- **PR**: レビューリクエスト
|
||||
- **CURRENT_TASK.md**: 進捗報告
|
||||
|
||||
---
|
||||
|
||||
**頑張って!段階的に、確実に進めよう!** 🚀
|
||||
Reference in New Issue
Block a user