docs: restore docs/private/roadmap from 7b4908f9 (Phase 20.31)
This commit is contained in:
15
docs/private/roadmap/phases/phase-15.77/INDEX.md
Normal file
15
docs/private/roadmap/phases/phase-15.77/INDEX.md
Normal file
@ -0,0 +1,15 @@
|
||||
# Phase 15.77 — Frozen Toolchain Polish & Windows Plan
|
||||
|
||||
Scope
|
||||
- Finalize Frozen v1 pipeline polish (doctor extended, multi-object linking).
|
||||
- Add Windows linking plan (MinGW/Clang and MSVC/clang-cl), with helper scripts.
|
||||
|
||||
What’s in this repo now
|
||||
- Doctor (extended): `tools/aot/doctor_frozen_v1.sh` — builds main and extra libs (Parser/MirBuilder/VM), links and runs.
|
||||
- Windows helpers: `tools/aot/windows/` — README, MinGW and MSVC link wrappers, stub C.
|
||||
- Guides updated: `docs/guides/frozen-toolchain.md` — Windows notes and examples.
|
||||
|
||||
Next
|
||||
- Stabilize `hako_kernel` feature presets for Windows (MinGW→MSVC parity).
|
||||
- Add a minimal Windows smoke (optional): link and run a tiny EXE using stub + `.o` produced on WSL.
|
||||
- Record success logs (Result: 0) in the guide once parity is achieved.
|
||||
24
docs/private/roadmap/phases/phase-15.77/MILESTONE.md
Normal file
24
docs/private/roadmap/phases/phase-15.77/MILESTONE.md
Normal file
@ -0,0 +1,24 @@
|
||||
# Phase 15.77 — Milestone (Frozen Toolchain Polish & Windows Plan)
|
||||
|
||||
Status: In‑Flight
|
||||
|
||||
Objectives
|
||||
- Replace development stubs with static runtime on Windows (MinGW → MSVC parity)
|
||||
- Finalize doctor & docs (end‑to‑end clarity, copy/paste quicklinks)
|
||||
|
||||
Deliverables (DoD)
|
||||
- Windows static runtime builds green:
|
||||
- MinGW: `libhako_kernel.a` builds; sample link → `Result: 0`
|
||||
- MSVC: `hako_kernel.lib` builds; sample link → `Result: 0`
|
||||
- Guide updated with “Static runtime (Windows) example” copy/paste
|
||||
- Doctor: extended mode shows clear advice on missing allowlist/lib paths
|
||||
|
||||
Risks & Mitigations
|
||||
- Legacy refs in `hako_kernel` may block Windows builds
|
||||
- Mitigate by gating under features, or providing plugin‑based alternatives
|
||||
- Keep dev stubs path as an interim; ensure examples still run
|
||||
|
||||
Next
|
||||
- Harden `hako_kernel` Windows build (gate legacy refs; converge feature presets)
|
||||
- Record success logs (MinGW/MSVC) and embed in the guide
|
||||
|
||||
338
docs/private/roadmap/phases/phase-15.77/README.md
Normal file
338
docs/private/roadmap/phases/phase-15.77/README.md
Normal file
@ -0,0 +1,338 @@
|
||||
# Phase 15.77 - 凍結EXE確定フェーズ
|
||||
|
||||
**期間**: 2025-11-09 - 2025-12-20(6週間)
|
||||
**状態**: 🔜 Phase 15.76完了後開始
|
||||
|
||||
---
|
||||
|
||||
## 🎯 このフェーズで実現すること
|
||||
|
||||
**凍結EXE(hako-frozen-v1.exe)確定 + Rust層最小化**
|
||||
|
||||
1. **凍結EXE作成**: hako-frozen-v1.exe ビルド・タグ付け・配布
|
||||
2. **Rust層最小化**: 99,406行 → 100-200行(VM実行エンジンのみ)
|
||||
3. **単一パーサ体制**: Hakoruneパーサーのみ開発(Rust凍結)
|
||||
4. **安全な試行錯誤**: いつでも凍結EXEに戻れる基盤確立
|
||||
|
||||
---
|
||||
|
||||
## 💡 このフェーズの位置づけ
|
||||
|
||||
### Phase 15.76で確立した「背骨」を使って実際に凍結
|
||||
|
||||
```
|
||||
Phase 15.76(背骨確立)
|
||||
├── extern_c構文実装 ✅
|
||||
├── LLVM Backendプラグイン化 ✅
|
||||
└── AOT導線整備(MIR JSON→.o→EXE)✅
|
||||
|
||||
Phase 15.77(凍結実行)← 今ここ
|
||||
├── 凍結EXE作成・配布
|
||||
├── Rust層最小化実行
|
||||
└── 単一パーサ体制確立
|
||||
|
||||
Phase 15.78〜(脱Rust加速)
|
||||
└── Hakoruneパーサー完全実装
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 成功基準(DoD)
|
||||
|
||||
### 1️⃣ 凍結EXE確定
|
||||
|
||||
#### ビルド・動作確認
|
||||
- [ ] `hako-frozen-v1.exe` ビルド成功(Linux/macOS/Windows)
|
||||
- [ ] 170 PASS維持(quick-selfhost)
|
||||
- [ ] AOT導線動作確認(MIR JSON→.o→EXE)
|
||||
|
||||
#### タグ付け・配布
|
||||
- [ ] Git tag作成(`v1.0.0-frozen`)
|
||||
- [ ] 配布物生成(`hako-frozen-v1-linux-x64.tar.gz`等)
|
||||
- [ ] README/LICENSE同梱
|
||||
- [ ] SHA256チェックサム生成
|
||||
|
||||
#### 配布先
|
||||
```
|
||||
releases/
|
||||
├── v1.0.0-frozen/
|
||||
│ ├── hako-frozen-v1-linux-x64.tar.gz
|
||||
│ ├── hako-frozen-v1-macos-arm64.tar.gz
|
||||
│ ├── hako-frozen-v1-windows-x64.zip
|
||||
│ ├── SHA256SUMS.txt
|
||||
│ └── INSTALL.md
|
||||
```
|
||||
|
||||
### 2️⃣ Rust層最小化
|
||||
|
||||
#### 目標
|
||||
```
|
||||
現状: 99,406行(Phase 15.75開始時)
|
||||
↓
|
||||
削減: 89.5%
|
||||
↓
|
||||
目標: 100-200行(VM実行エンジンのみ)
|
||||
```
|
||||
|
||||
#### 段階的削減計画
|
||||
```rust
|
||||
// Week 1-2: Parser削除(凍結EXE内のみ残す)
|
||||
src/front/parser_layer/ ❌ 削除(凍結EXE経由)
|
||||
src/front/ast/ ❌ 削除(MIR直接生成へ)
|
||||
|
||||
// Week 3-4: MIR Builder削除(Hakorune実装へ)
|
||||
src/backend/mir_builder/ ❌ 削除(Hakorune実装使用)
|
||||
|
||||
// 残すもの(100-200行)
|
||||
src/backend/mir_interpreter/ ✅ 残す(VM実行エンジン)
|
||||
src/runtime/ffi/ ✅ 残す(extern_c基盤)
|
||||
src/main.rs ✅ 残す(エントリーポイント)
|
||||
```
|
||||
|
||||
### 3️⃣ 単一パーサ体制確立
|
||||
|
||||
#### Hakoruneパーサーをデフォルトへ
|
||||
- [ ] `apps/selfhost-compiler/` をデフォルト呼び出し
|
||||
- [ ] Rustパーサーは凍結EXE内のみ(緊急時用)
|
||||
- [ ] スモークテスト全緑(Hakoruneパーサー使用)
|
||||
|
||||
#### 2重メンテ回避
|
||||
```
|
||||
Before(Phase 15.76以前):
|
||||
├── Rustパーサー(開発中)
|
||||
└── Hakoruneパーサー(開発中)← 2重メンテ地獄
|
||||
|
||||
After(Phase 15.77):
|
||||
├── Rustパーサー(凍結、緊急時のみ)
|
||||
└── Hakoruneパーサー(開発中)← 単一開発ライン
|
||||
```
|
||||
|
||||
### 4️⃣ ドキュメント整備
|
||||
|
||||
#### 使用ガイド
|
||||
- [ ] `docs/guides/frozen-toolchain-usage.md` - 凍結EXE使用方法
|
||||
- [ ] `docs/guides/rust-minimization.md` - Rust最小化手順
|
||||
- [ ] `INSTALL.md` - 配布物インストールガイド
|
||||
|
||||
#### 運用マニュアル
|
||||
- [ ] 凍結EXEへの戻り方
|
||||
- [ ] トラブルシューティング
|
||||
- [ ] FAQ(よくある質問)
|
||||
|
||||
---
|
||||
|
||||
## 📊 週次計画(Week 1-6)
|
||||
|
||||
### Week 1(2025-11-09 - 11-15)凍結EXE作成
|
||||
|
||||
**目標**: hako-frozen-v1.exe ビルド・動作確認
|
||||
|
||||
#### タスク
|
||||
- [ ] Phase 15.76の成果物確認(extern_c/AOT導線)
|
||||
- [ ] ビルド設定整備(Cargo.toml, build.rs)
|
||||
- [ ] クロスコンパイル設定(Linux/macOS/Windows)
|
||||
- [ ] 動作確認(quick-selfhost 170 PASS)
|
||||
|
||||
#### 成果物
|
||||
```bash
|
||||
./hako-frozen-v1 --version
|
||||
# Hakorune v1.0.0-frozen (2025-11-15)
|
||||
|
||||
./hako-frozen-v1 program.hako
|
||||
# OK (VM実行)
|
||||
|
||||
./hako-frozen-v1 --backend llvm program.hako
|
||||
# OK (LLVM AOT)
|
||||
```
|
||||
|
||||
### Week 2(2025-11-16 - 11-22)タグ付け・配布物生成
|
||||
|
||||
**目標**: Git tag作成・配布物公開
|
||||
|
||||
#### タスク
|
||||
- [ ] Git tag作成(`v1.0.0-frozen`)
|
||||
- [ ] 配布物生成スクリプト作成
|
||||
- [ ] SHA256チェックサム生成
|
||||
- [ ] INSTALL.md作成
|
||||
|
||||
#### 成果物
|
||||
```
|
||||
releases/v1.0.0-frozen/
|
||||
├── hako-frozen-v1-linux-x64.tar.gz (12MB)
|
||||
├── hako-frozen-v1-macos-arm64.tar.gz (10MB)
|
||||
├── hako-frozen-v1-windows-x64.zip (15MB)
|
||||
├── SHA256SUMS.txt
|
||||
└── INSTALL.md
|
||||
```
|
||||
|
||||
### Week 3(2025-11-23 - 11-29)Rust Parser削除
|
||||
|
||||
**目標**: Parser削除、凍結EXE経由に切り替え
|
||||
|
||||
#### タスク
|
||||
- [ ] `src/front/parser_layer/` 削除準備
|
||||
- [ ] 凍結EXE経由のParser呼び出し実装
|
||||
- [ ] AST→MIR直接生成経路確立
|
||||
- [ ] スモークテスト修正(Parser経路変更)
|
||||
|
||||
#### 削減予想
|
||||
```
|
||||
Before: 99,406行
|
||||
After: ~50,000行(Parser削除、約50%削減)
|
||||
```
|
||||
|
||||
### Week 4(2025-11-30 - 12-06)MIR Builder削除準備
|
||||
|
||||
**目標**: MIR Builder Hakorune実装へ移行開始
|
||||
|
||||
#### タスク
|
||||
- [ ] `apps/selfhost-compiler/mir_builder/` 検証
|
||||
- [ ] Rust MIR Builder削除可能性確認
|
||||
- [ ] ブリッジ層実装(Hakorune→Rust)
|
||||
- [ ] 並行動作確認(Rust/Hakorune両方)
|
||||
|
||||
#### 削減予想
|
||||
```
|
||||
Before: ~50,000行
|
||||
After: ~5,000行(MIR Builder削除、約90%削減)
|
||||
```
|
||||
|
||||
### Week 5(2025-12-07 - 12-13)Hakoruneパーサー移行
|
||||
|
||||
**目標**: Hakoruneパーサーをデフォルトへ
|
||||
|
||||
#### タスク
|
||||
- [ ] `apps/selfhost-compiler/` をデフォルト呼び出し
|
||||
- [ ] Rustパーサーを緊急時用に格下げ
|
||||
- [ ] スモークテスト全緑確認(Hakorune使用)
|
||||
- [ ] パフォーマンス計測(Rust vs Hakorune)
|
||||
|
||||
#### 期待結果
|
||||
```bash
|
||||
# デフォルト: Hakoruneパーサー
|
||||
./hako program.hako # Hakorune経由
|
||||
|
||||
# 緊急時: Rustパーサー(凍結EXE内)
|
||||
./hako --fallback-rust-parser program.hako # Rust経由
|
||||
```
|
||||
|
||||
### Week 6(2025-12-14 - 12-20)ドキュメント・レビュー
|
||||
|
||||
**目標**: ドキュメント整備・統合テスト
|
||||
|
||||
#### タスク
|
||||
- [ ] 凍結EXE使用ガイド作成
|
||||
- [ ] Rust最小化手順書作成
|
||||
- [ ] トラブルシューティングFAQ作成
|
||||
- [ ] 統合テスト(quick-selfhost 全緑)
|
||||
- [ ] ChatGPT/Claudeレビュー
|
||||
|
||||
#### 成果物
|
||||
```
|
||||
docs/guides/
|
||||
├── frozen-toolchain-usage.md # 使用方法
|
||||
├── rust-minimization.md # 最小化手順
|
||||
└── frozen-toolchain-faq.md # FAQ
|
||||
|
||||
docs/private/roadmap/phases/phase-15.77/
|
||||
├── README.md # Phase概要
|
||||
├── MILESTONE.md # ゴールライン
|
||||
├── RUST_MINIMIZATION_PLAN.md # 最小化計画
|
||||
└── COMPLETION_REPORT.md # 完了報告
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ❌ Out of Scope(このフェーズではやらない)
|
||||
|
||||
### 完全なRust削除
|
||||
- VM実行エンジンは残す(100-200行)
|
||||
- 理由: VM安定性・パフォーマンス
|
||||
|
||||
### Hakoruneパーサー完全実装
|
||||
- 段階的移行(並行動作期間あり)
|
||||
- 理由: 安全な移行を優先
|
||||
|
||||
### プロダクション配布
|
||||
- まだ実験段階(v1.0.0-frozen)
|
||||
- 理由: Phase 15.78以降で安定化
|
||||
|
||||
### Windows完全サポート
|
||||
- Linux/macOS優先
|
||||
- 理由: 開発環境がLinux/WSL中心
|
||||
|
||||
---
|
||||
|
||||
## 🚀 次のフェーズ(Phase 15.78〜)
|
||||
|
||||
### Phase 15.78: Hakoruneパーサー完全実装
|
||||
- 全構文サポート(macro/async/await等)
|
||||
- Rustパーサーとの完全パリティ
|
||||
- パフォーマンス最適化
|
||||
|
||||
### Phase 15.79: 完全な脱Rust
|
||||
- VM実行エンジンもHakorune実装へ
|
||||
- Rust層完全削除(0行)
|
||||
- Pure Hakorune達成
|
||||
|
||||
### Phase 15.80: プロダクション化
|
||||
- v2.0.0リリース
|
||||
- 安定性・セキュリティ監査
|
||||
- 公式配布開始
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ リスク & 対策
|
||||
|
||||
### リスク1: 凍結EXEのサイズ
|
||||
**問題**: 静的リンクで15MB超の可能性
|
||||
**対策**: 動的リンク検討、圧縮配布
|
||||
|
||||
### リスク2: クロスコンパイル失敗
|
||||
**問題**: Windows/macOSビルドが難しい
|
||||
**対策**: Linux優先、他環境は次フェーズ
|
||||
|
||||
### リスク3: Rust削除時の不安定化
|
||||
**問題**: 削除作業でテスト失敗増加
|
||||
**対策**: 段階的削除、各段階でテスト確認
|
||||
|
||||
### リスク4: Hakoruneパーサーの未熟
|
||||
**問題**: Rustパーサーと完全パリティ未達
|
||||
**対策**: 並行動作期間を長く取る、Rustフォールバック維持
|
||||
|
||||
---
|
||||
|
||||
## 📚 関連リソース
|
||||
|
||||
### 前フェーズ
|
||||
- [Phase 15.76 - extern_c & Frozen Toolchain](../phase-15.76/)
|
||||
- [Phase 15.75 - 脱Rust大作戦](../phase-15.75/)
|
||||
|
||||
### 論文資料
|
||||
- [Rapid Self-Hosting Paper](../../../../private/papers-active/rapid-selfhost-ai-collaboration/)
|
||||
- [Frozen Toolchain Pattern Evidence](../../../../private/papers-active/rapid-selfhost-ai-collaboration/03_DATA_ANALYSIS.md)
|
||||
|
||||
### 業界標準パターン
|
||||
- **Rust**: stage0(凍結ツールチェーン)
|
||||
- **Go**: Go 1.4 frozen(bootstrap用)
|
||||
- **OCaml**: ocamlc frozen(自己ホスト用)
|
||||
|
||||
---
|
||||
|
||||
## 💬 開発体制
|
||||
|
||||
### 実装担当
|
||||
- **ChatGPT**: Rust削除・Hakorune実装主導
|
||||
- **Claude**: レビュー・ドキュメント整備
|
||||
- **tomoaki**: 戦略判断・方向決定
|
||||
|
||||
### レビュー方針
|
||||
- 各Week終了時にレビュー
|
||||
- 170 PASS維持を最優先
|
||||
- 問題発生時は即座に凍結EXEへロールバック
|
||||
|
||||
---
|
||||
|
||||
**作成日**: 2025-10-14
|
||||
**Phase開始予定**: 2025-11-09(Phase 15.76完了後)
|
||||
**想定期間**: 6週間
|
||||
@ -0,0 +1,550 @@
|
||||
# Rust最小化計画(Phase 15.77)
|
||||
|
||||
## 🎯 目標
|
||||
|
||||
**99,406行 → 100-200行(99.8%削減)**
|
||||
|
||||
Rust層を極限まで薄くし、VM実行エンジン+FFI基盤のみ残す。
|
||||
|
||||
---
|
||||
|
||||
## 📊 削減計画の全体像
|
||||
|
||||
### Phase 15.75開始時(2025-10-05)
|
||||
```
|
||||
総行数: 99,406行
|
||||
|
||||
内訳:
|
||||
├── Parser層 : ~30,000行
|
||||
├── AST層 : ~10,000行
|
||||
├── MIR Builder層 : ~40,000行
|
||||
├── VM層 : ~5,000行
|
||||
├── FFI/Runtime層 : ~2,000行
|
||||
└── その他 : ~12,406行
|
||||
```
|
||||
|
||||
### Phase 15.77完了時(目標)
|
||||
```
|
||||
総行数: 100-200行
|
||||
|
||||
内訳:
|
||||
├── main.rs : ~50行(エントリーポイント)
|
||||
├── VM実行エンジン : ~100行(最小ループ)
|
||||
├── FFI基盤 : ~50行(extern_c実行)
|
||||
└── その他削除不可 : ~0行
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📅 週次削減計画
|
||||
|
||||
### Week 3(2025-11-23 - 11-29)Parser削除
|
||||
|
||||
#### 削除対象(~40,000行)
|
||||
```
|
||||
src/front/parser_layer/
|
||||
├── parser.rs (~5,000行) ❌
|
||||
├── lexer.rs (~3,000行) ❌
|
||||
├── token.rs (~1,000行) ❌
|
||||
└── grammar/ (~8,000行) ❌
|
||||
|
||||
src/front/ast/
|
||||
├── ast_nodes.rs (~4,000行) ❌
|
||||
├── ast_visitor.rs (~2,000行) ❌
|
||||
├── ast_printer.rs (~1,000行) ❌
|
||||
└── ast_validator.rs (~3,000行) ❌
|
||||
|
||||
その他Parser関連:
|
||||
├── src/front/syntax/ (~8,000行) ❌
|
||||
└── src/front/source_map/ (~5,000行) ❌
|
||||
```
|
||||
|
||||
#### 置き換え方法
|
||||
```rust
|
||||
// Before(Rust Parser)
|
||||
fn parse_source(source: &str) -> Result<Ast> {
|
||||
let tokens = lexer::tokenize(source)?;
|
||||
let ast = parser::parse(tokens)?;
|
||||
Ok(ast)
|
||||
}
|
||||
|
||||
// After(凍結EXE経由)
|
||||
fn parse_source_frozen(source: &str) -> Result<Mir> {
|
||||
// hako-frozen-v1を呼び出し
|
||||
let mir_json = Command::new("hako-frozen-v1")
|
||||
.arg("--emit-mir-json")
|
||||
.arg("-")
|
||||
.stdin(Stdio::piped())
|
||||
.stdout(Stdio::piped())
|
||||
.spawn()?
|
||||
.wait_with_output()?;
|
||||
|
||||
let mir = serde_json::from_slice(&mir_json.stdout)?;
|
||||
Ok(mir)
|
||||
}
|
||||
```
|
||||
|
||||
#### スモークテスト修正
|
||||
```bash
|
||||
# Before
|
||||
./hako program.hako # Rust Parser使用
|
||||
|
||||
# After
|
||||
./hako program.hako # 凍結EXE経由でParser実行
|
||||
```
|
||||
|
||||
#### 期待削減
|
||||
- **削減**: ~40,000行
|
||||
- **残り**: ~59,000行(59.4%削減)
|
||||
|
||||
---
|
||||
|
||||
### Week 4(2025-11-30 - 12-06)MIR Builder削除準備
|
||||
|
||||
#### 検証対象(~40,000行)
|
||||
```
|
||||
src/backend/mir_builder/
|
||||
├── builder.rs (~8,000行) 検証
|
||||
├── expression.rs (~10,000行) 検証
|
||||
├── statement.rs (~8,000行) 検証
|
||||
├── control_flow.rs (~6,000行) 検証
|
||||
└── type_inference.rs (~8,000行) 検証
|
||||
```
|
||||
|
||||
#### 並行動作確認
|
||||
```rust
|
||||
// Rust MIR Builder
|
||||
fn build_mir_rust(ast: &Ast) -> Result<Mir> {
|
||||
let mut builder = MirBuilder::new();
|
||||
builder.visit_ast(ast)?;
|
||||
Ok(builder.finish())
|
||||
}
|
||||
|
||||
// Hakorune MIR Builder
|
||||
fn build_mir_hakorune(ast_json: &str) -> Result<Mir> {
|
||||
let mir_json = Command::new("hako")
|
||||
.arg("apps/selfhost-compiler/mir_builder.hako")
|
||||
.arg("--input")
|
||||
.arg(ast_json)
|
||||
.output()?;
|
||||
|
||||
let mir = serde_json::from_slice(&mir_json.stdout)?;
|
||||
Ok(mir)
|
||||
}
|
||||
|
||||
// 両方動作確認
|
||||
#[test]
|
||||
fn test_mir_builder_parity() {
|
||||
let source = "local x = 42; return x;";
|
||||
let ast = parse_source(source).unwrap();
|
||||
|
||||
let mir_rust = build_mir_rust(&ast).unwrap();
|
||||
let mir_hako = build_mir_hakorune(&ast_to_json(&ast)).unwrap();
|
||||
|
||||
assert_eq!(mir_rust, mir_hako); // パリティ確認
|
||||
}
|
||||
```
|
||||
|
||||
#### Week 4では削除しない
|
||||
- 理由: パリティ確認・安全性検証
|
||||
- 削除: Week 5で実行
|
||||
|
||||
---
|
||||
|
||||
### Week 5(2025-12-07 - 12-13)MIR Builder削除実行
|
||||
|
||||
#### 削除実行(~40,000行)
|
||||
```bash
|
||||
# MIR Builder完全削除
|
||||
rm -rf src/backend/mir_builder/
|
||||
|
||||
# Hakorune実装をデフォルトへ
|
||||
# src/main.rs
|
||||
fn build_mir(source: &str) -> Result<Mir> {
|
||||
// Hakorune MIR Builder使用
|
||||
build_mir_hakorune(source)
|
||||
}
|
||||
```
|
||||
|
||||
#### スモークテスト確認
|
||||
```bash
|
||||
# 全テスト実行(Hakorune MIR Builder使用)
|
||||
bash tools/smokes/v2/run.sh --profile quick-selfhost
|
||||
|
||||
# 期待結果
|
||||
# Total: 185
|
||||
# Passed: 170
|
||||
# Failed: 15
|
||||
```
|
||||
|
||||
#### 期待削減
|
||||
- **削減**: ~40,000行
|
||||
- **残り**: ~19,000行(80.9%削減)
|
||||
|
||||
---
|
||||
|
||||
### Week 6(2025-12-14 - 12-20)雑多なコード削除
|
||||
|
||||
#### 削除対象(~18,800行)
|
||||
```
|
||||
未使用依存削除:
|
||||
├── serde_derive ❌(AST/MIR生成不要)
|
||||
├── syn ❌(Parser不要)
|
||||
├── quote ❌(コード生成不要)
|
||||
└── proc-macro2 ❌(マクロ不要)
|
||||
|
||||
デッドコード削除:
|
||||
├── src/utils/ (~2,000行) ❌
|
||||
├── src/diagnostics/ (~3,000行) ❌(凍結EXE側)
|
||||
├── src/optimizer/ (~5,000行) ❌(LLVM側)
|
||||
└── src/codegen/ (~8,000行) ❌(LLVM側)
|
||||
|
||||
テスト削除:
|
||||
├── tests/parser/ (~500行) ❌
|
||||
├── tests/mir_builder/ (~300行) ❌
|
||||
└── 残すテスト: tests/vm/ tests/ffi/ のみ
|
||||
```
|
||||
|
||||
#### Cargo.toml整理
|
||||
```toml
|
||||
# Before(多数の依存)
|
||||
[dependencies]
|
||||
serde = "1.0"
|
||||
serde_derive = "1.0"
|
||||
serde_json = "1.0"
|
||||
syn = "2.0"
|
||||
quote = "1.0"
|
||||
proc-macro2 = "1.0"
|
||||
clap = "4.0"
|
||||
# ... 30個以上
|
||||
|
||||
# After(最小限)
|
||||
[dependencies]
|
||||
serde = "1.0" # MIR JSONデシリアライズ
|
||||
serde_json = "1.0" # MIR JSON読み込み
|
||||
libloading = "0.8" # FFI動的ロード
|
||||
# 合計3個
|
||||
```
|
||||
|
||||
#### 期待削減
|
||||
- **削減**: ~18,800行
|
||||
- **残り**: ~200行(99.8%削減)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 最終構成(目標100-200行)
|
||||
|
||||
### ファイル構成
|
||||
```
|
||||
src/
|
||||
├── main.rs (~50行) ✅
|
||||
├── vm/
|
||||
│ └── executor.rs (~100行) ✅
|
||||
├── ffi/
|
||||
│ └── extern_c.rs (~50行) ✅
|
||||
└── lib.rs (~10行) ✅
|
||||
|
||||
Cargo.toml (~30行) ✅
|
||||
build.rs (~20行) ✅ (FFIビルド用)
|
||||
|
||||
合計: ~260行(少しオーバー、調整必要)
|
||||
```
|
||||
|
||||
### src/main.rs(~50行)
|
||||
```rust
|
||||
use std::process::Command;
|
||||
use serde_json;
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
|
||||
// Step 1: 凍結EXE経由でMIR取得
|
||||
let mir_json = Command::new("hako-frozen-v1")
|
||||
.arg("--emit-mir-json")
|
||||
.arg(&args[1])
|
||||
.output()?
|
||||
.stdout;
|
||||
|
||||
// Step 2: MIRデシリアライズ
|
||||
let mir: Mir = serde_json::from_slice(&mir_json)?;
|
||||
|
||||
// Step 3: VM実行
|
||||
let result = vm::execute(mir)?;
|
||||
|
||||
println!("{}", result);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// MIR構造体(最小限)
|
||||
#[derive(serde::Deserialize)]
|
||||
struct Mir {
|
||||
functions: Vec<Function>,
|
||||
entry: String,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
struct Function {
|
||||
name: String,
|
||||
blocks: Vec<BasicBlock>,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
struct BasicBlock {
|
||||
instructions: Vec<Instruction>,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
enum Instruction {
|
||||
Const { dst: u32, value: Value },
|
||||
BinOp { dst: u32, lhs: u32, rhs: u32, op: BinOp },
|
||||
Call { dst: u32, callee: String, args: Vec<u32> },
|
||||
ExternC { dst: u32, symbol: String, args: Vec<u32> },
|
||||
Ret { value: u32 },
|
||||
// ... 16命令のみ
|
||||
}
|
||||
```
|
||||
|
||||
### src/vm/executor.rs(~100行)
|
||||
```rust
|
||||
use crate::Mir;
|
||||
use std::collections::HashMap;
|
||||
|
||||
pub fn execute(mir: Mir) -> Result<Value, String> {
|
||||
let mut vm = VM::new(mir);
|
||||
vm.run()
|
||||
}
|
||||
|
||||
struct VM {
|
||||
mir: Mir,
|
||||
registers: Vec<Value>,
|
||||
current_block: usize,
|
||||
current_instruction: usize,
|
||||
}
|
||||
|
||||
impl VM {
|
||||
fn new(mir: Mir) -> Self {
|
||||
Self {
|
||||
mir,
|
||||
registers: vec![Value::Null; 256],
|
||||
current_block: 0,
|
||||
current_instruction: 0,
|
||||
}
|
||||
}
|
||||
|
||||
fn run(&mut self) -> Result<Value, String> {
|
||||
loop {
|
||||
let func = &self.mir.functions[0]; // エントリー関数
|
||||
let block = &func.blocks[self.current_block];
|
||||
let inst = &block.instructions[self.current_instruction];
|
||||
|
||||
match inst {
|
||||
Instruction::Const { dst, value } => {
|
||||
self.registers[*dst as usize] = value.clone();
|
||||
}
|
||||
Instruction::BinOp { dst, lhs, rhs, op } => {
|
||||
let lhs = &self.registers[*lhs as usize];
|
||||
let rhs = &self.registers[*rhs as usize];
|
||||
self.registers[*dst as usize] = binop(lhs, rhs, *op);
|
||||
}
|
||||
Instruction::ExternC { dst, symbol, args } => {
|
||||
let result = crate::ffi::call_extern(symbol, args, &self.registers)?;
|
||||
self.registers[*dst as usize] = result;
|
||||
}
|
||||
Instruction::Ret { value } => {
|
||||
return Ok(self.registers[*value as usize].clone());
|
||||
}
|
||||
// ... 他の命令
|
||||
}
|
||||
|
||||
self.current_instruction += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn binop(lhs: &Value, rhs: &Value, op: BinOp) -> Value {
|
||||
match (lhs, rhs, op) {
|
||||
(Value::Int(a), Value::Int(b), BinOp::Add) => Value::Int(a + b),
|
||||
(Value::Int(a), Value::Int(b), BinOp::Sub) => Value::Int(a - b),
|
||||
// ... 基本演算のみ
|
||||
_ => panic!("unsupported binop"),
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### src/ffi/extern_c.rs(~50行)
|
||||
```rust
|
||||
use libloading::{Library, Symbol};
|
||||
use std::collections::HashMap;
|
||||
|
||||
static mut ALLOWLIST: Vec<String> = Vec::new();
|
||||
|
||||
pub fn call_extern(
|
||||
symbol: &str,
|
||||
args: &[u32],
|
||||
registers: &[Value],
|
||||
) -> Result<Value, String> {
|
||||
// Step 1: 許可チェック
|
||||
unsafe {
|
||||
if !ALLOWLIST.contains(&symbol.to_string()) {
|
||||
return Err(format!("ExternCDenied: {}", symbol));
|
||||
}
|
||||
}
|
||||
|
||||
// Step 2: ライブラリロード
|
||||
let lib = Library::new("libc.so.6")
|
||||
.map_err(|e| format!("Failed to load library: {}", e))?;
|
||||
|
||||
// Step 3: シンボル取得
|
||||
unsafe {
|
||||
let func: Symbol<extern "C" fn() -> i64> = lib.get(symbol.as_bytes())
|
||||
.map_err(|e| format!("Symbol not found: {}", e))?;
|
||||
|
||||
// Step 4: 実行(引数0個のみ簡略化)
|
||||
let result = func();
|
||||
Ok(Value::Int(result))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn init_allowlist() {
|
||||
unsafe {
|
||||
ALLOWLIST = vec![
|
||||
"getpid".to_string(),
|
||||
"strlen".to_string(),
|
||||
"system".to_string(),
|
||||
];
|
||||
|
||||
// ENV変数から追加
|
||||
if let Ok(list) = std::env::var("HAKO_FFI_ALLOW_LIST") {
|
||||
for symbol in list.split(',') {
|
||||
ALLOWLIST.push(symbol.to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 各週の検証ポイント
|
||||
|
||||
### Week 3: Parser削除後
|
||||
```bash
|
||||
# 動作確認
|
||||
./hako local_tests/hello.nyash
|
||||
# Expected: Hello, World!
|
||||
|
||||
# スモークテスト
|
||||
bash tools/smokes/v2/run.sh --profile quick-selfhost
|
||||
# Expected: 170 PASS / 15 FAIL
|
||||
|
||||
# 行数確認
|
||||
tokei src/
|
||||
# Expected: ~59,000行
|
||||
```
|
||||
|
||||
### Week 4: MIR Builder削除準備
|
||||
```bash
|
||||
# パリティテスト
|
||||
cargo test test_mir_builder_parity
|
||||
# Expected: ok
|
||||
|
||||
# 並行動作確認
|
||||
HAKO_USE_RUST_MIR_BUILDER=1 ./hako test.hako # Rust
|
||||
HAKO_USE_RUST_MIR_BUILDER=0 ./hako test.hako # Hakorune
|
||||
# Expected: 両方OK
|
||||
```
|
||||
|
||||
### Week 5: MIR Builder削除後
|
||||
```bash
|
||||
# スモークテスト(Hakoruneのみ)
|
||||
bash tools/smokes/v2/run.sh --profile quick-selfhost
|
||||
# Expected: 170 PASS / 15 FAIL
|
||||
|
||||
# 行数確認
|
||||
tokei src/
|
||||
# Expected: ~19,000行
|
||||
```
|
||||
|
||||
### Week 6: 最終調整後
|
||||
```bash
|
||||
# 最終動作確認
|
||||
./hako local_tests/hello.nyash
|
||||
./hako --backend llvm local_tests/arithmetic.nyash
|
||||
|
||||
# 最終スモークテスト
|
||||
bash tools/smokes/v2/run.sh --profile quick-selfhost
|
||||
# Expected: 170 PASS / 15 FAIL
|
||||
|
||||
# 最終行数確認
|
||||
tokei src/
|
||||
# Expected: ~200行
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ ロールバック手順
|
||||
|
||||
### 各週でロールバック可能
|
||||
```bash
|
||||
# Week 3で問題発生 → Week 2に戻る
|
||||
git revert HEAD~10 # Week 3のコミット取り消し
|
||||
cargo build --release
|
||||
bash tools/smokes/v2/run.sh --profile quick-selfhost
|
||||
|
||||
# Week 5で問題発生 → Week 4に戻る
|
||||
git revert HEAD~20 # Week 5のコミット取り消し
|
||||
# ... 同様
|
||||
```
|
||||
|
||||
### 凍結EXEへの完全ロールバック
|
||||
```bash
|
||||
# 最悪の場合: 凍結EXE使用に戻る
|
||||
cp hako-frozen-v1 ./hako
|
||||
./hako program.hako # 凍結EXE経由で安定動作
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 削減行数の追跡
|
||||
|
||||
### Git commit messageテンプレート
|
||||
```
|
||||
Phase 15.77: Week X - [作業内容]
|
||||
|
||||
削減行数: ~XX,XXX行
|
||||
残り行数: ~XX,XXX行
|
||||
削減率: XX.X%
|
||||
|
||||
動作確認:
|
||||
- スモークテスト: 170 PASS / 15 FAIL
|
||||
- AOT導線: OK
|
||||
|
||||
関連: #issue-number
|
||||
```
|
||||
|
||||
### 週次レポート
|
||||
```markdown
|
||||
## Week X削減レポート
|
||||
|
||||
### 削減内容
|
||||
- [削除したディレクトリ/ファイル]
|
||||
|
||||
### 削減行数
|
||||
- 削減: ~XX,XXX行
|
||||
- 残り: ~XX,XXX行
|
||||
- 削減率: XX.X%
|
||||
|
||||
### 動作確認
|
||||
- [ ] スモークテスト: 170 PASS維持
|
||||
- [ ] AOT導線動作
|
||||
- [ ] 凍結EXEロールバック確認
|
||||
|
||||
### 問題点
|
||||
- [なし/あれば記載]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**作成日**: 2025-10-14
|
||||
**Phase**: 15.77(Week 3-6)
|
||||
**目標**: 99,406行 → 100-200行(99.8%削減)
|
||||
Reference in New Issue
Block a user