# Paper 11: コンパイラは世界を知らない：PluginInvoke一元化と"フォールバック廃止"の実践

Status: Planning  
Target: Systems/Engineering Conference (OSDI/SOSP/ASPLOS)  
Lead Author: Nyash Team  

## 📋 論文概要

### タイトル
**The Compiler Knows Nothing: PluginInvoke Unification and the Practice of "No Fallback" Policy**

### 中心的主張
- コンパイラからドメイン知識を完全排除し、全てをPluginInvokeに一元化
- フォールバック全廃により複雑性爆発を回避し、保守性を最大化
- 対応表1枚（mir→vm→jit）で全ての拡張を管理可能に

### 主要貢献
1. **設計原則**：「コンパイラは世界を知らない」哲学の体系化
2. **実装手法**：フォールバック廃止による複雑性制御
3. **運用知見**：プラグインエコシステムの実践的構築法

## 🔧 実証データ計画

### フォールバック削減の定量化
```
削減前（Phase 9）:
- 型名分岐: 47箇所
- 特殊処理: 23箇所
- フォールバック: 15箇所

削減後（Phase 10.11）:
- 型名分岐: 0箇所
- 特殊処理: 0箇所
- フォールバック: 0箇所
```

### 保守性メトリクス
```
コード変更影響範囲：
- 新Box追加時の変更行数: 0行（プラグインのみ）
- 新機能追加時の変更行数: 0行（プラグインのみ）
- コンパイラ本体の安定性: 100%（変更不要）
```

### プラグイン統合実績
```
統合成功例：
- Python統合: 2日（eval/import/getattr/call）
- ファイルI/O: 1日
- ネットワーク: 1日
- 数学関数: 0.5日
```

## 📊 実践的証明

### 型名分岐の回避例（Before/After）

**Before（アンチパターン）**:
```rust
match box_type {
    "StringBox" => self.emit_string_length(),
    "ArrayBox" => self.emit_array_length(),
    "FileBox" => self.emit_file_size(),
    // 新しいBoxごとに分岐追加... 😱
}
```

**After（PluginInvoke一元化）**:
```rust
self.emit_plugin_invoke(type_id, method_id, args)
// 新しいBox追加時もコード変更不要！ 🎉
```

### CI/CDによる品質保証

```yaml
禁止パターンCI:
- 型名文字列による分岐
- ビルトイン特殊処理
- フォールバック実装

必須テスト:
- trace_hash等価性（VM/JIT/AOT）
- プラグイン境界テスト
- ABI互換性チェック
```

## 🏗️ アーキテクチャ設計

### 対応表による一元管理
```
MIR → VM → JIT/AOT マッピング:
┌─────────────┬────────────────┬─────────────────┐
│ MIR命令     │ VM実装         │ JIT/AOT実装     │
├─────────────┼────────────────┼─────────────────┤
│ PluginInvoke│ plugin_invoke()│ emit_plugin_call│
└─────────────┴────────────────┴─────────────────┘
（1行で全てを表現）
```

### ABI v0の設計
```
最小限のFFI契約:
- invoke(type_id, method_id, args) → TLV
- 引数: TLVエンコード
- 戻り値: TLVエンコード
- エラー: Result<TLV, String>
```

## 📝 論文構成（予定）

### 1. Introduction（2ページ）
- 問題：言語実装の複雑性爆発
- 解決：ドメイン知識のプラグイン分離
- 影響：保守性と拡張性の両立

### 2. Design Philosophy（3ページ）
- 「コンパイラは世界を知らない」原則
- フォールバック廃止の必要性
- プラグイン境界の設計

### 3. Implementation（4ページ）
- PluginInvoke一元化の実装
- 型名分岐の除去プロセス
- CI/CDによる品質維持

### 4. Case Studies（3ページ）
- Python統合（複雑な例）
- FileBox（I/O例）
- NetworkBox（非同期例）

### 5. Evaluation（3ページ）
- 保守性の定量評価
- 性能オーバーヘッド分析
- 開発効率の改善

### 6. Lessons Learned（2ページ）
- 成功要因の分析
- 失敗と回避策
- ベストプラクティス

### 7. Related Work（2ページ）
- プラグインアーキテクチャ
- 言語拡張機構
- モジュラーコンパイラ

### 8. Conclusion（1ページ）

## 🎯 執筆スケジュール

- Week 1: 実装データ収集・整理
- Week 2: Philosophy + Implementation執筆
- Week 3: Case Studies執筆
- Week 4: Evaluation + Lessons執筆
- Week 5: 推敲・コード例整備

## 💡 期待される影響

### 学術的影響
- コンパイラ設計の新しいパラダイム
- 複雑性管理の体系的手法
- プラグインエコシステムの理論

### 実務的影響
- 言語実装のベストプラクティス集
- 保守可能な言語の作り方
- 拡張可能なアーキテクチャ設計

## 🔥 実例：LLVM統合の地獄からCranelift採用へ（2025-09-01追記）

### LLVM統合で直面した問題
```
問題1: バージョン地獄
- llvm-sys v180.0.0 → LLVM 18.0.x要求
- 実際のLLVM: 18.1.3（WSL）、18.1.6（vcpkg）
- 環境変数LLVM_SYS_180_STRICT_VERSIONING=0も効果なし

問題2: Windows環境の複雑性
- 環境変数が伝わらない（WSL→cmd.exe境界）
- 文字化けによるバッチファイル実行失敗
- vcpkgでのLLVMビルドに数時間...

問題3: ユーザー体験の悪夢
- LLVMインストールだけで1日
- バージョン確認で混乱
- 環境変数設定で挫折
```

### Cranelift採用という解決策
```
利点:
- Rust製で統合が簡単（Cargo.tomlに追加のみ）
- バイナリサイズ: LLVM 100MB+ → Cranelift 5-10MB
- ビルド時間: 数時間 → 数分
- 環境依存: 複雑 → ゼロ

ユーザー体験の改善:
Before: LLVM地獄（環境構築で1日以上）
After: cargo install nyash（5分で完了）
```

### 戦略的転換：LLVMからCraneliftへ（2025-09-01）

**経緯**：
1. LLVM統合を試みる → バージョン地獄、ビルド困難、巨大サイズ
2. ユーザー体験の危機を認識 → 「これではユーザーが使えない」
3. **既存のCranelift実装に立ち返る** → Phase 10.7で既に実装済み！

```bash
# LLVM: 100MB+、環境構築地獄、ビルド数時間
# ↓ 戦略的転換
# Cranelift: 5-10MB、Rust native、ビルド数分

cargo build --release --features cranelift-jit -j24
./target/release/nyash --backend cranelift apps/tests/mir-const-add/main.nyash
# 結果: "Cranelift JIT execution completed (skeleton)!"
```

### 教訓：コンパイラは環境も知らない
- 外部依存（LLVM）= 制御不能な複雑性
- 「大きい・難しい」に気づいたら既存の軽量案を再評価
- Cranelift重視への転換 = 正しい判断

## 📚 参考文献（予定）
- The Cathedral and the Bazaar (ESR)
- Design Patterns (GoF)
- Clean Architecture (Robert C. Martin)
- LLVM: A Compilation Framework for Lifelong Program Analysis
- The Art of Unix Programming