Files
hakorune/docs/development/roadmap/phases/phase-22/codex-discussion.md

122 lines
4.4 KiB
Markdown
Raw Normal View History

# Codexとの議論: 技術的深掘り分析
## 質問内容
NyashセルフホスティングでC++薄ラッパーNyash実装の技術的実現可能性と課題について。
## Codexの詳細技術分析
### 🎯 Executive Summary (実現可能性評価)
**✅ 実現可能** - この革新的アプローチは技術的に実現可能で、特に以下の点で優れている:
- **ビルド時間短縮**: 現在の5-7分から大幅短縮可能
- **責務分離**: Nyash側にコンパイラ本体、C/C++側は最小橋渡し
- **行数圧縮**: 80k→20k行の目標に大きく貢献
### 📊 主要な技術分析
#### 1. 実現可能性と課題
**✅ 可能な理由:**
- MIR→IR生成をNyash側で制御し、C/C++側は最小限Context/Module/Target/Emitに絞る戦略は健全
- LLVMのC API準拠ラッパーまたはC ABIで包んだC++ラッパー、両方とも選択可能
**⚠️ 主要課題:**
- **API面積の最小化**: 命令単位で関数を増やすと30をすぐ超える
- **バッチ命令発行**: エンコードを工夫して「バッチ命令発行」に寄せる必要
- **所有権/寿命管理**: Context→Module→Builder→Valueの順にライフタイム規律をFFI越しに強制
**現実性評価:**
- **Nyash 100-200行**: テキストIR経由なら視野に入るBuilder直叩きは難しい
- **C/C++ 20-30関数**: バッチエンコード設計なら収まる個別命令APIは50-80超える
#### 2. FFI境界設計の重要ポイント
**🔒 安全設計:**
- **C ABI固定**: C++型は渡さず、`extern "C"`でC関数のみ公開
- **ハンドル管理**: 生ポインタの代わりに「u32ハンドルID」内部テーブル方式を推奨
- **メモリ管理**: 明示的な`*_free`関数群で確実な破棄
**⚡ パフォーマンス最適化:**
- **バッチ化**: `builder_build_batch(module, func_handle, buf, len)`で境界コスト削減
- **エラー処理**: 統一的なステータス返却+`get_last_error()`パターン
#### 3. デバッグ体験
**🔍 最小デバッグセット:**
- `module_to_string()`: IRダンプ出力
- `verify_module()`: 詳細検証エラー
- バッチ命令トレース: `NYASH_LLVM_TRACE=1`でデコード結果ログ
**📍 再現性:**
- 決定的なハンドル割り振り
- 失敗時の詳細エラー情報(最後の成功命令インデックス含む)
#### 4. 80k→20k行圧縮への貢献度
**🎯 高い削減効果期待:**
- Rust/inkwellの大量ジェネリック/型ラップ/ユーティリティを置き換え
- 数千行単位でRust側コード削減可能
- Cラッパー: 500-1,200行規模
- Nyash側: 0.5-2k行程度
### 🚀 推奨実装戦略(段階的アプローチ)
#### Phase 0: テキストIR経由のMVP
```cpp
// 最小Cラッパー10関数未満
ctx_create/ctx_free
module_create/module_from_ir/module_free
verify/target_init/target_machine_create
write_object
```
```nyash
// Nyash側: MIR→LLVM IRテキスト生成
box LLVMTextGenerator {
generateFunction(mirFunc) {
// 基本ブロック・算術・分岐・呼出し・戻りの最小実装
}
}
```
**利点**: 短期で成果、関数数最小
**欠点**: IR文字列コスト、エラー位置対応粗い
#### Phase 1: バッチBuilder化
```cpp
// バイナリエンコード方式
build_batch(module, func_handle, encoded_ops, len)
add_function/append_block/position
```
**利点**: 機能追加しても関数数増えず、境界コスト低い
### 💡 最小API設計案20-30関数以内
**基本操作:**
- `ctx_create/ctx_free`
- `module_create/module_free`
- `set_triple/set_datalayout`
- `verify_module`, `module_to_string`
**ターゲット/出力:**
- `target_init_native_all`
- `target_machine_create/target_machine_free`
- `write_object(module, tm, path)`
**構築(バッチ化):**
- `build_batch` - 核心となるバッチ命令発行API
### 🎉 結論
この革新的アプローチは**技術的に実現可能**で、特に以下の組み合わせが効果的:
1. **段階的実装**: テキストIR→バッチBuilder→最適化の順
2. **Everything is Box哲学**: LLVMContextBox/LLVMModuleBoxでの統一設計
3. **最小FFI境界**: バッチ化による関数数抑制
4. **80k→20k圧縮**: 大幅な行数削減への直接貢献
この設計により、Nyashセルフホスティングの革命的な軽量化と高速化が実現できる見込みです。