📚 Phase 12.5 最適化戦略 & Phase 15 セルフホスティング計画

Phase 12.5: MIR15最適化戦略 - コンパイラ丸投げ作戦
- optimization-strategy.txt: 詳細戦略(MIR側は軽量、コンパイラに丸投げ)
- implementation-examples.md: 具体的な実装例
- debug-safety-comparison.md: 現在のDebugBox vs ChatGPT5提案の比較分析

Phase 15: Nyashセルフホスティング - 究極の目標
- self-hosting-plan.txt: 内蔵Craneliftによる実現計画
- technical-details.md: CompilerBox設計とブートストラップ手順
- README.md: セルフホスティングのビジョン

重要な知見:
- LLVM統合完了済み(Phase 11)だが依存が重すぎる
- Craneliftが現実的な選択肢(3-5MB vs LLVM 50-100MB)
- 「コンパイラもBox、すべてがBox」の夢へ

MASTERロードマップ更新済み
This commit is contained in:
Moe Charm
2025-09-02 05:11:10 +09:00
parent c9366d5c54
commit da96bcb906
37 changed files with 2454 additions and 58 deletions

View File

@ -21,7 +21,11 @@ Purpose: Claude×Copilot×ChatGPT協調開発の総合ロードマップ
| 9.75g-0 | ✅完了 | BID-FFI Plugin System | [Phase-9.75g-0-BID-FFI-Developer-Guide.md](phase-9/Phase-9.75g-0-BID-FFI-Developer-Guide.md) |
| 9.8 | 📅予定 | BIDレジストリ + 自動コード生成 | [phase_9_8_bid_registry_and_codegen.md](phase-9/phase_9_8_bid_registry_and_codegen.md) |
| 10 | 📅予定 | Cranelift JIT主経路 | [phase_10_cranelift_jit_backend.md](phase-10/phase_10_cranelift_jit_backend.md) |
| 11+ | 🔮将来 | LLVM AOT研究段階 | 後段検討 |
| 11 | ✅完了 | LLVM統合・AOT実装依存重い | [phase-11/](phase-11/) |
| 11.8 | 📅予定 | MIR整理Core-15→Core-13 | [phase-11.8_mir_cleanup/](phase-11.8_mir_cleanup/) |
| 12 | 🔄進行中 | MIR Core-15確定・プラグイン統一 | [phase-12/](phase-12/) |
| 12.5 | 📅予定 | MIR15最適化戦略 | [phase-12.5/](phase-12.5/) |
| 15 | 🌟将来 | セルフホスティングNyashコンパイラ | [phase-15/](phase-15/) |
---
@ -128,6 +132,65 @@ nyash bid gen --target llvm bid.yaml # AOT用declare生成LLVM実装時
---
### 🔧 Phase 11: LLVM統合・AOT実装完了 - 依存重い)
**Summary**:
- ✅ LLVM IRへの変換実装完了
- ✅ AOTAhead-of-Timeコンパイル動作確認
- ✅ ネイティブ実行ファイル生成成功
**得られた知見**:
- **依存関係が重い**: LLVM自体のビルド時間・サイズが巨大
- **動作は確認**: 技術的には成功、実用性に課題
- **Cranelift回帰**: 軽量な代替として再評価
---
### 📐 Phase 11.8: MIR整理Core-15→Core-13
**Summary**:
- ArrayGet/ArraySet → BoxCall統合
- PluginInvoke → BoxCall統合
- 最終的にCore-13を目指す
**詳細**: [phase-11.8_mir_cleanup/](phase-11.8_mir_cleanup/)
---
### 🎯 Phase 12: MIR Core-15確定・プラグイン統一進行中
**Summary**:
- MIR Core-1514の最終確定
- プラグインシステムの3層統一
- Nyash ABI設計
**3層プラグインシステム**:
1. Nyashスクリプトプラグイン.nyash
2. C ABIプラグイン高速・安定
3. Nyash ABIプラグイン将来拡張
---
### ⚡ Phase 12.5: MIR15最適化戦略 - コンパイラ丸投げ作戦
**Summary**:
- 「CPUコンパイラに丸投げできるところは丸投げ」
- MIR15の美しさ15命令を保ちながら実用的性能達成
- 自前最適化は最小限、成熟したコンパイラ技術を活用
**最適化境界線**:
- **MIR側**: カノニカル化・軽量最適化のみ
- **コンパイラ側**: ループ最適化・SIMD・レジスタ割当等
**ヒントシステム**:
- 命令は増やさずメタデータでヒント付与
- pure/readonly/noalias/likely等の属性
- Cコンパイラ/Cranelift/LLVMへ機械的マップ
**詳細**: [phase-12.5/](phase-12.5/)
---
## 🧠 AI大会議から得られた技術的知見
### Gemini先生の助言

View File

@ -0,0 +1,38 @@
# Phase 12.5: MIR15最適化戦略 - コンパイラ丸投げ作戦
## 📋 概要
Phase 12でMIR15が確定し、Phase 11でLLVM統合が完了した後の最適化フェーズ。
「CPUコンパイラに丸投げできるところは丸投げ」という哲学で、MIR15の美しさを保ちながら実用的な性能を達成する。
## 🎯 フェーズの目的
1. **MIR15の純粋性維持**: 15命令を増やさない
2. **実用的な性能達成**: 既存言語の70%以上
3. **開発効率最大化**: 車輪の再発明を避ける
4. **将来性確保**: コンパイラの進化を自動享受
## 📊 主要成果物
- [ ] MIRMetadataシステムヒント付与
- [ ] 5つの軽量最適化パス
- [ ] バックエンド別ヒントマッピング
- [ ] 性能評価レポート
## 🔗 関連ドキュメント
- [最適化戦略詳細](optimization-strategy.txt)
- [Phase 11: LLVM統合](../phase-11/)
- [Phase 12: MIR確定](../phase-12/)
## 💡 キーインサイト
> 「MIRは"整える"だけ、速さはCPUに任せる」
複雑な最適化は30年の歴史を持つCコンパイラ/LLVM/Craneliftに任せ、
Nyashは意味を保存するカニカル化と最適化ヒントの付与に専念する。
## 📅 実施時期
Phase 11LLVM統合完了後、Phase 13実アプリ開発前に実施。
約1ヶ月の開発期間を想定。

View File

@ -0,0 +1,160 @@
# DebugBox比較分析現在実装 vs ChatGPT5提案
## 📊 機能比較表
| カテゴリ | 現在のDebugBox | ChatGPT5提案 | 評価 |
|---------|--------------|------------|------|
| **基本追跡** | ✅ trackBox/watch | ✅ ハンドル表(id,gen,type,size) | 提案の方が詳細 |
| **メモリ分析** | ✅ memoryReport型別カウント | ✅ + allocサイト追跡 | 提案の方が深い |
| **リーク検出** | ❌ なし | ✅ 終了時ダンプ + CI失敗 | 提案が圧倒的 |
| **UAF検出** | ❌ なし | ✅ 世代カウンタ + カナリア | 提案が圧倒的 |
| **GC統合** | ❌ 独立動作 | ✅ gc=stress(k)モード | 提案が統合的 |
| **非同期対応** | ❌ なし | ✅ Safepoint可視化 | 提案が先進的 |
| **TaskGroup監査** | ❌ なし | ✅ LIFO順序保証 | 提案が構造化 |
| **パフォーマンス** | ⚠️ 常にオン | ✅ リリースで0コスト | 提案が実用的 |
## 🎯 現在のDebugBox機能
### 強み
1. **使いやすいAPI**
- trackBox/watch でシンプルに追跡
- dumpAll/memoryReport で情報取得
- saveToFile で永続化
2. **高レベル機能**
- ブレークポイント設定
- 関数呼び出しトレース
- コールスタック表示
### 弱点
1. **安全性検証なし**
- リーク検出機能なし
- Use-After-Free検出なし
- 世代管理なし
2. **GCとの分離**
- GCと独立して動作
- 統合的なメモリ分析不可
3. **性能影響**
- 常に有効(無効化機能なし)
- リリースビルドでもコスト発生
## 🚀 ChatGPT5提案の革新点
### 1. **リーク検出(最重要)**
```rust
// 終了時に自動実行
fn dump_leaks_at_exit() {
for (handle, info) in &HANDLE_TABLE {
if !info.freed {
eprintln!("LEAK: {} {} bytes at {:x}",
info.type_name, info.size, info.alloc_site);
}
}
if env::var("NYASH_FAIL_ON_LEAK").is_ok() {
process::exit(1); // CI失敗
}
}
```
### 2. **世代管理によるUAF検出**
```rust
struct HandleInfo {
id: u64,
generation: u32, // free時にインクリメント
freed: bool,
canary: u32, // 0xDEADBEEF
}
// アクセス時チェック
if handle.gen != info.generation || info.canary != 0xDEADBEEF {
panic!("Use-After-Free detected!");
}
```
### 3. **GCストレステスト**
```rust
// k回のalloc毎に強制GC
if ALLOC_COUNT % GC_STRESS_INTERVAL == 0 {
force_gc_collection();
}
```
### 4. **Safepoint可視化**
```rust
// MIR生成時に自動挿入
before_await() {
emit_trace("GC_Safepoint(await_enter)");
}
after_await() {
emit_trace("GC_Safepoint(await_exit)");
}
```
## 💡 統合提案DebugBox拡張
### Phase 1: 既存機能維持 + 安全性追加
```nyash
box DebugBox {
// 既存機能はそのまま
trackBox(box, name) { ... }
memoryReport() { ... }
// 新機能追加
enableLeakDetection() { ... }
setGCStressMode(interval) { ... }
dumpLeaks() { ... }
checkInvariants() { ... }
}
```
### Phase 2: StatsBox新設
```nyash
box StatsBox {
// 低レベル統計専用
leak_summary()
dump_alloc_sites(n)
snapshot()
diff(snapshot1, snapshot2)
watch_handle(handle)
}
```
### Phase 3: GCBox拡張
```nyash
box GCBox {
// GC制御
force_collect()
set_mode(mode) // "off", "sync", "stress"
get_stats()
set_stress_interval(k)
}
```
## 📈 実装優先順位
### 🔥 今すぐ実装すべきPhase 12.5.1
1. **リーク検出** - 終了時ダンプ + `NYASH_FAIL_ON_LEAK`
2. **世代管理** - Handleにgenerationフィールド追加
3. **GCストレスモード** - `gc=stress(k)`オプション
### 📅 次に実装Phase 12.5.2
1. **Allocサイト追跡** - 軽量版(ハッシュのみ)
2. **Safepoint可視化** - trace出力
3. **StatsBox** - 統計情報API
### 🌟 将来実装Phase 13以降
1. **TaskGroup監査** - 構造化並行性の完全保証
2. **Box監査フック** - invariantsチェック
3. **差分スナップショット** - 高度なプロファイリング
## 🎯 結論
ChatGPT5の提案は「**簡単ライフサイクル × 自己責任 × 見える化**」という哲学を完璧に体現している。現在のDebugBoxを拡張し、新たにStatsBox/GCBoxと連携することで、以下を実現
1. **開発時**: 徹底的な安全性チェック
2. **リリース時**: ゼロコスト(環境変数で制御)
3. **CI/CD**: 自動的な品質保証
「Everything is Box」を保ちながら、**死ぬほど安全**を実現する素晴らしい設計!

View File

@ -0,0 +1,218 @@
# Phase 12.5: 実装例集
## 1. MIRMetadataの具体例
### StringBox.lengthのヒント付与
```rust
// Beforeヒントなし
BoxCall {
target: ValueId(0),
method: "length",
args: vec![],
}
// Afterヒント付き
BoxCall {
target: ValueId(0),
method: "length",
args: vec![],
metadata: MIRMetadata {
pure: true, // 同じ文字列→同じ長さ
readonly: true, // 文字列を変更しない
nothrow: true, // 例外を投げない
noalias: true, // 結果は新しい整数
..Default::default()
},
}
```
### ループの最適化ヒント
```nyash
// Nyashコード
for i in 0..1000 {
array.push(i * 2)
}
```
```rust
// MIRでのヒント
Branch {
cond: ValueId(5), // i < 1000
then_block: BlockId(2),
else_block: BlockId(3),
metadata: MIRMetadata {
likely: Some(true), // ループ継続が高確率
loop_count: Some(1000), // ループ回数ヒント
..Default::default()
},
}
```
## 2. Cエミッタでの変換例
### 純粋関数の最適化
```c
// MIR: BoxCall(StringBox, "length") with {pure: true}
// ↓
// C出力:
static inline int64_t __attribute__((pure))
ny_string_length(NyashHandle h) {
NyashString* s = ny_handle_to_string(h);
return s->length;
}
```
### 分岐予測の最適化
```c
// MIR: Branch with {likely: Some(false)}
// ↓
// C出力:
if (__builtin_expect(!!(error_condition), 0)) {
// エラー処理(めったに実行されない)
ny_handle_error();
} else {
// 通常処理(ほぼ常に実行)
continue;
}
```
## 3. 最適化パスの実装例
### 定数畳み込みConstFoldingPass
```rust
impl OptPass for ConstFoldingPass {
fn run(&self, mir: &mut MIR) -> bool {
let mut changed = false;
for block in &mut mir.blocks {
for inst in &mut block.instructions {
match inst {
// Const(3) + Const(5) → Const(8)
BinOp { op: Add, left, right, result } => {
if let (Some(a), Some(b)) = (
self.get_const_value(*left),
self.get_const_value(*right)
) {
*inst = Const {
value: Value::Integer(a + b),
result: *result
};
changed = true;
}
}
_ => {}
}
}
}
changed
}
}
```
### デッドコード除去DeadCodeElimPass
```rust
impl OptPass for DeadCodeElimPass {
fn run(&self, mir: &mut MIR) -> bool {
// 1. 使用されている値を収集
let used = self.collect_used_values(mir);
// 2. 未使用の命令を削除
let mut changed = false;
for block in &mut mir.blocks {
block.instructions.retain(|inst| {
if let Some(result) = inst.get_result() {
if !used.contains(&result) && !inst.has_side_effects() {
changed = true;
return false; // 削除
}
}
true
});
}
changed
}
}
```
## 4. バックエンド別の出力例
### zig cc向けUbuntu/macOS
```bash
# MIRからCへ変換
nyash --emit-c program.nyash -o program.c
# 最適化コンパイル
zig cc -O3 -flto -march=native \
-fno-plt \
-fomit-frame-pointer \
program.c nyrt.c \
-o program
```
### MSVC向けWindows
```batch
REM リンク時最適化を有効化
cl /O2 /GL /MD program.c nyrt.c /Fe:program.exe ^
/link /LTCG /OPT:REF /OPT:ICF
```
### プロファイルガイド最適化PGO
```bash
# Step 1: プロファイル収集
zig cc -O3 -fprofile-generate program.c -o program_prof
./program_prof < typical_input.txt
# Step 2: プロファイルを使用して再コンパイル
zig cc -O3 -fprofile-use program.c -o program_opt
```
## 5. 性能測定の例
```nyash
// benchmark.nyash
static box Benchmark {
main() {
local start, end, result
// ウォームアップ
me.fibonacci(20)
// 測定開始
start = Time.now()
result = me.fibonacci(40)
end = Time.now()
print("Fibonacci(40) = " + result)
print("Time: " + (end - start) + "ms")
}
@[pure, nothrow] // 最適化ヒント
fibonacci(n) {
if n <= 1 {
return n
}
return me.fibonacci(n - 1) + me.fibonacci(n - 2)
}
}
```
## 6. 最適化レベルごとの比較
| レベル | MIR最適化 | Cコンパイラ | 想定性能 | 用途 |
|--------|-----------|-------------|----------|------|
| 0 | なし | -O0 | 10% | デバッグ |
| 1 | 基本 | -O2 | 50% | 開発 |
| 2 | 全て | -O3 -flto | 70% | リリース |
| 3 | 全て+PGO | -O3 -flto -fprofile-use | 85% | 高性能 |
| 4 | 全て | LLVM -O3 | 90%+ | 特殊用途 |
*性能は理論上の最大性能を100%とした場合の目安

View File

@ -0,0 +1,208 @@
================================================================================
Phase 12.5: MIR15最適化戦略 - コンパイラ丸投げ作戦
================================================================================
【基本哲学】
「CPUコンパイラに丸投げできるところは丸投げ」
MIR15の美しさ15命令を保ちながら、実用的な性能を達成する戦略。
自前で複雑な最適化を実装するのではなく、既存の成熟したコンパイラ技術を活用。
================================================================================
1. 最適化の境界線
================================================================================
■ MIR15側でやること軽量・意味保存のみ
├─ 定数畳み込みConst Folding
│ └─ Const(3) + Const(5) → Const(8)
├─ デッドコード除去DCE
│ └─ 未使用のStore、到達不能コード除去
├─ 分岐単純化Branch Folding
│ └─ if true → Jump、if false → 削除
├─ CFG整理
│ └─ 空ブロック除去、ブロック併合
└─ 軽量インライン化
└─ 小さい関数のみ10命令以下、再帰なし
■ MIR15側でやらないことコンパイラに丸投げ
├─ ループ最適化
│ └─ アンローリング、LICM、ベクトル化 → Cコンパイラ/LLVM
├─ レジスタ割り当て
│ └─ 完全にバックエンドに任せる
├─ 命令選択・スケジューリング
│ └─ CPU依存の最適化は触らない
└─ SIMD/並列化
└─ 高度な最適化は成熟したツールに
================================================================================
2. ヒントシステム(命令を増やさずに最適化を強化)
================================================================================
■ MIRMetadataの設計
struct MIRMetadata {
// 関数特性
pure: bool, // 副作用なし(同じ引数→同じ結果)
readonly: bool, // グローバル状態を読まない
noalias: bool, // ポインタエイリアスなし
nothrow: bool, // 例外を投げない
// 制御フロー
likely: Option<bool>, // 分岐予測ヒント
cold: bool, // めったに実行されない
// ループ特性
loop_count: Option<u32>, // ループ回数ヒント
vectorizable: bool, // ベクトル化可能
}
■ 適用例
BoxCall("StringBox", "length") → {pure: true, readonly: true, nothrow: true}
BoxCall("ConsoleBox", "log") → {pure: false, readonly: false}
Branch(cond, then, else) → {likely: Some(true)} // thenが高確率
================================================================================
3. バックエンド別マッピング
================================================================================
■ Cエミッタzig cc / clang / MSVC
├─ pure → __attribute__((pure))
├─ readonly → __attribute__((const))
├─ noalias → restrict
├─ likely → __builtin_expect
└─ cold → __attribute__((cold))
■ Cranelift
├─ ヒントをCranelift IRのフラグに変換
└─ 特にループとメモリアクセスのヒントが効果的
■ LLVM実装済み・依存重いため非推奨
├─ 完全なメタデータサポート
├─ !llvm.loop.vectorize.enable
├─ !prof 分岐確率
├─ noalias, readonly等の属性
└─ ※Phase 11で実装完了、動作確認済み
================================================================================
4. 段階的最適化レベル
================================================================================
Level 0: 開発モード
- MIR最適化なし
- デバッグ情報完全保持
- nyash program.nyash
Level 1: 基本最適化(デフォルト)
- MIRカニカル化のみ
- Cエミッタ → gcc -O2
- nyash --release program.nyash
Level 2: 高速化
- MIR全最適化パス
- Cエミッタ → zig cc -O3 -flto
- nyash --release --opt program.nyash
Level 3: プロファイルガイドPGO
- 実行プロファイル収集
- ホットパス特定
- nyash --release --pgo program.nyash
Level 4: 特殊用途
- SIMD必要 → LLVM使用ただし依存が重い
- 起動速度重視 → Cranelift JIT推奨
- nyash --backend cranelift program.nyash
================================================================================
5. 実装計画
================================================================================
Phase 12.5.1: 基盤整備1週間
□ MIRMetadata構造体追加
□ 各MIR命令にmetadataフィールド追加
□ デフォルトヒントの設定
Phase 12.5.2: MIR最適化パス1週間
□ ConstFoldingPass実装
□ DeadCodeElimPass実装
□ BranchFoldingPass実装
□ CFGCleanupPass実装
□ LightInliningPass実装
Phase 12.5.3: バックエンド統合2週間
□ Cエミッタでヒント→属性変換
□ zig cc最適化オプション統合
□ MSVC最適化オプション対応
□ 簡易ベンチマーク作成
Phase 12.5.4: 評価・調整1週間
□ 各最適化レベルの性能測定
□ コンパイル時間 vs 実行時間のトレードオフ評価
□ ドキュメント作成
================================================================================
6. 成功指標
================================================================================
- MIR15の命令数は変更なし15命令維持
- 基本的なベンチマークで既存言語の70%以上の性能
- コンパイル時間は既存言語の10%以下
- 最適化パスのコード行数は1000行以下
================================================================================
7. リスクと対策
================================================================================
リスク1: ヒントが複雑になりすぎる
→ 対策: 自動推論を強化、明示的ヒントは最小限
リスク2: バックエンド依存が強くなる
→ 対策: 共通ヒントセットを定義、バックエンド固有は分離
リスク3: 性能が期待に達しない
→ 対策: プロファイリング強化、ボトルネック特定
================================================================================
8. なぜこの戦略が最適か
================================================================================
1. シンプルさの維持
- MIR15の美しさを損なわない
- 最適化バグのリスク最小化
2. 実用的な性能
- 成熟したコンパイラ技術を活用
- 必要十分な性能を達成
3. 開発効率
- 車輪の再発明を避ける
- 既存ツールチェーンと協調
4. 将来性
- コンパイラの進化を自動的に享受
- 新しいCPUアーキテクチャにも対応
================================================================================
9. Phase 11からの知見
================================================================================
LLVM実装完了から得られた重要な知見
1. 技術的成功・実用的課題
- LLVM統合は技術的に成功
- しかし依存関係が重すぎる(ビルド時間・バイナリサイズ)
- Craneliftが現実的な選択肢
2. コンパイラ丸投げ戦略の妥当性
- LLVMの重さを経験したことで、Cコンパイラ活用の価値を再認識
- zig cc / clang / MSVCは既にインストール済み
- 追加依存なしで高性能を達成可能
3. 段階的アプローチの重要性
- 必要な時だけ重い最適化
- デフォルトは軽量・高速
- ユーザーが選択可能
================================================================================
「シンプルなMIR × 賢いコンパイラ = 実用的な性能」
これがNyashの最適化哲学。

View File

@ -0,0 +1,72 @@
# Phase 15: Nyashセルフホスティング - 究極の目標
## 📋 概要
NyashでNyashコンパイラを書く、完全なセルフホスティングの実現フェーズ。
内蔵Cranelift JITを活用し、外部コンパイラ依存から完全に解放される。
## 🎯 フェーズの目的
1. **完全なセルフホスティング**: NyashコンパイラをNyashで実装
2. **外部依存の排除**: gcc/clang/MSVC不要の世界
3. **Everything is Box哲学の完成**: コンパイラもBox
4. **エコシステムの自立**: Nyashだけで完結する開発環境
## 📊 主要成果物
- [ ] CompilerBox実装Nyashコンパイラ
- [ ] NyashパーサーNyash実装
- [ ] MIR LowererNyash実装
- [ ] CraneliftBoxJITエンジンラッパー
- [ ] ブートストラップ成功
## 🔧 技術的アプローチ
### 内蔵Craneliftの利点
- **軽量**: 3-5MB程度LLVMの1/10以下
- **JIT特化**: メモリ上での動的コンパイル
- **Rust統合**: 静的リンクで配布容易
### 実装例
```nyash
box NyashCompiler {
init { cranelift }
compile(source) {
local ast = me.parse(source)
local mir = me.lower(ast)
local code = me.cranelift.compile(mir)
return code
}
}
// 使用例
local compiler = new CompilerBox()
local program = compiler.compile("print('Hello, Self-hosted Nyash!')")
program.run()
```
## 🔗 関連ドキュメント
- [セルフホスティング詳細計画](self-hosting-plan.txt)
- [Phase 10: Cranelift JIT](../phase-10/)
- [Phase 12.5: 最適化戦略](../phase-12.5/)
## 📅 実施時期
- **開始条件**: Phase 10-14完了後
- **推定開始**: 2026年前半
- **推定期間**: 6-8ヶ月
## 💡 期待される成果
1. **技術的証明**: 実用言語としての成熟度
2. **開発効率**: Nyashだけで開発完結
3. **教育価値**: シンプルなコンパイラ実装例
4. **コミュニティ**: 参入障壁の大幅低下
## 🌟 夢の実現
> 「コンパイラもBox、すべてがBox」
外部ツールチェーンに依存しない、真の自立したプログラミング言語へ。

View File

@ -0,0 +1,162 @@
================================================================================
Phase 15: Nyashセルフホスティング計画 - 内蔵Craneliftによる夢の実現
================================================================================
【ビジョン】
NyashでNyashコンパイラを書き、Nyashプログラムをコンパイル・実行する
完全なセルフホスティング環境の実現
================================================================================
1. なぜセルフホスティングか
================================================================================
■ 言語の成熟度の証明
├─ 自分自身をコンパイルできる = 実用的な言語
├─ ドッグフーディング = 実際に使って改善
└─ エコシステムの完成 = 外部依存からの解放
■ Everything is Box哲学の究極形
├─ コンパイラもBox
├─ JITエンジンもBox
└─ すべてがNyashで完結
================================================================================
2. 技術的実現可能性
================================================================================
■ Cranelift埋め込みの利点
├─ 軽量: 3-5MB程度の追加LLVMは50-100MB
├─ Rustライブラリ: 静的リンクで配布容易
├─ JIT特化: メモリ上でのコンパイル・実行に最適
└─ 依存が少ない: ビルド時間短縮
■ 既存の準備状況
├─ ✅ Cranelift統合準備済みCargo.toml
├─ ✅ MIR15確定シンプルなIR
├─ ✅ プラグインシステム(拡張可能)
└─ 🔄 Phase 10でJIT実装予定
================================================================================
3. 段階的実装計画
================================================================================
■ Phase 15.1: CompilerBox設計1-2週間
box CompilerBox {
init { cranelift, mir_builder, optimizer }
compile(source) {
local ast = me.parse(source)
local mir = me.mir_builder.lower(ast)
local optimized = me.optimizer.optimize(mir)
return me.cranelift.compile(optimized)
}
parse(source) { /* Nyashで書かれたパーサー */ }
}
■ Phase 15.2: Nyashパーサー実装2-3ヶ月
├─ 現在のRustパーサーをNyashで再実装
├─ トークナイザー → パーサー → AST生成
└─ エラー処理・位置情報の保持
■ Phase 15.3: MIR Lowerer実装1-2ヶ月
├─ AST → MIR15変換をNyashで
├─ 型チェック・名前解決
└─ 最適化パスの実装
■ Phase 15.4: Cranelift統合1ヶ月
├─ CraneliftBox: Cranelift JITのラッパー
├─ MIR → Cranelift IR変換
└─ メモリ上でのコード実行
■ Phase 15.5: ブートストラップ2週間
├─ NyashコンパイラでNyashコンパイラをコンパイル
├─ 完全なセルフホスティング達成
└─ 性能・正確性の検証
================================================================================
4. 実装上の課題と解決策
================================================================================
■ 課題1: パフォーマンス
├─ 問題: Nyashで書いたコンパイラは遅い
└─ 解決: ホットパスをCraneliftでJIT最適化
■ 課題2: メモリ使用量
├─ 問題: Everything is Boxのオーバーヘッド
└─ 解決: コンパイラ特有の最適化Box設計
■ 課題3: デバッグの難しさ
├─ 問題: セルフホスティングのデバッグは複雑
└─ 解決: 段階的移行・既存コンパイラとの比較検証
================================================================================
5. 期待される成果
================================================================================
■ 技術的成果
├─ 完全なセルフホスティング言語
├─ 外部コンパイラ依存からの解放
├─ Nyashエコシステムの完成
└─ 言語の実用性の証明
■ 教育的価値
├─ コンパイラ実装の教材として
├─ Nyashで学ぶコンパイラ理論
└─ シンプルで理解しやすい実装
■ コミュニティへの影響
├─ 開発者の参入障壁低下
├─ Nyashだけで開発環境構築
└─ 真の「Everything is Box」体験
================================================================================
6. 成功指標
================================================================================
□ NyashコンパイラがNyash自身をコンパイル可能
□ 性能: Rustコンパイラの50%以上
□ バイナリサイズ: 10MB以下Cranelift込み
□ コンパイル時間: 中規模プロジェクトで10秒以内
□ 100%のテストケース互換性
================================================================================
7. ロードマップ依存関係
================================================================================
必須完了フェーズ:
├─ Phase 10: Cranelift JIT統合
├─ Phase 11.8: MIR Core-13最適化
├─ Phase 12: プラグインシステム統一
├─ Phase 12.5: 最適化戦略確立
└─ Phase 14: 実アプリでの実証
推定開始時期: 2026年前半
推定完了時期: 2026年後半
================================================================================
8. 夢の先にあるもの
================================================================================
セルフホスティング達成後の可能性:
■ Nyash専用最適化
├─ Box境界での特殊最適化
├─ Everything is Box前提の新しい最適化手法
└─ Nyashらしい高速化
■ 新しいバックエンド
├─ WebAssembly直接出力
├─ GPU計算対応
└─ 組み込みターゲット
■ 言語の進化
├─ Nyashで実験的機能を実装
├─ コミュニティ駆動の言語拡張
└─ 真のオープンソース言語
================================================================================
「コンパイラもBox、すべてがBox」
これがNyashの究極の姿。

View File

@ -0,0 +1,367 @@
# Phase 15: セルフホスティング技術詳細
## 1. アーキテクチャ設計
### 1.1 全体構成
```
NyashCompiler (Nyashで実装)
├── Frontend
│ ├── Lexer (トークナイザー)
│ ├── Parser (構文解析)
│ └── AST Builder
├── Middle-end
│ ├── Type Checker
│ ├── Name Resolver
│ ├── MIR Lowerer
│ └── Optimizer
└── Backend
├── CraneliftBox (JITラッパー)
├── Code Generator
└── Runtime Linker
```
### 1.2 CompilerBox設計
```nyash
box CompilerBox {
init {
lexer, // トークン解析器
parser, // 構文解析器
lowerer, // MIR生成器
optimizer, // 最適化器
backend // コード生成器
}
// ソースコードからASTを生成
parse(source) {
local tokens = me.lexer.tokenize(source)
local ast = me.parser.parse(tokens)
return ast
}
// ASTからMIRを生成
lower(ast) {
local mir = me.lowerer.lower(ast)
return me.optimizer.optimize(mir)
}
// MIRから実行可能コードを生成
codegen(mir) {
return me.backend.generate(mir)
}
// 完全なコンパイルパイプライン
compile(source) {
local ast = me.parse(source)
local mir = me.lower(ast)
return me.codegen(mir)
}
}
```
## 2. パーサー実装Nyash版
### 2.1 Lexer実装例
```nyash
box Lexer {
init { keywords, operators }
constructor() {
me.keywords = new MapBox()
me.keywords.set("box", TokenType.BOX)
me.keywords.set("if", TokenType.IF)
me.keywords.set("loop", TokenType.LOOP)
// ... 他のキーワード
me.operators = new MapBox()
me.operators.set("+", TokenType.PLUS)
me.operators.set("-", TokenType.MINUS)
// ... 他の演算子
}
tokenize(source) {
local tokens = new ArrayBox()
local position = 0
loop(position < source.length()) {
local char = source.charAt(position)
if me.isWhitespace(char) {
position = position + 1
continue
}
if me.isDigit(char) {
local token = me.readNumber(source, position)
tokens.push(token)
position = token.end
continue
}
if me.isLetter(char) {
local token = me.readIdentifier(source, position)
tokens.push(token)
position = token.end
continue
}
// ... 他のトークン種別
}
return tokens
}
}
```
### 2.2 Parser実装例
```nyash
box Parser {
init { tokens, current }
parse(tokens) {
me.tokens = tokens
me.current = 0
return me.parseProgram()
}
parseProgram() {
local statements = new ArrayBox()
loop(not me.isAtEnd()) {
local stmt = me.parseStatement()
statements.push(stmt)
}
return new ASTNode("Program", statements)
}
parseStatement() {
if me.match(TokenType.BOX) {
return me.parseBoxDeclaration()
}
if me.match(TokenType.IF) {
return me.parseIfStatement()
}
// ... 他の文種別
return me.parseExpression()
}
}
```
## 3. MIR生成器実装
### 3.1 Lowerer実装例
```nyash
box MIRLowerer {
init {
current_block,
value_counter,
block_counter,
locals
}
lower(ast) {
me.value_counter = 0
me.block_counter = 0
me.locals = new MapBox()
local mir = new MIRModule()
me.lowerNode(ast, mir)
return mir
}
lowerExpression(node, mir) {
if node.type == "BinaryOp" {
local left = me.lowerExpression(node.left, mir)
local right = me.lowerExpression(node.right, mir)
local result = me.newValue()
mir.addInstruction(new BinOp(
node.operator,
left,
right,
result
))
return result
}
if node.type == "Literal" {
local result = me.newValue()
mir.addInstruction(new Const(node.value, result))
return result
}
// ... 他の式種別
}
}
```
## 4. Cranelift統合
### 4.1 CraneliftBox実装
```nyash
box CraneliftBox {
init { jit_module, func_ctx }
constructor() {
// CraneliftをFFI経由で初期化
me.jit_module = ExternCall("cranelift_new_module")
me.func_ctx = ExternCall("cranelift_new_context")
}
compile(mir) {
local compiled_funcs = new MapBox()
// 各関数をコンパイル
for func in mir.functions {
local code = me.compileFunction(func)
compiled_funcs.set(func.name, code)
}
return compiled_funcs
}
compileFunction(mir_func) {
// MIR → Cranelift IR変換
ExternCall("cranelift_begin_function", me.func_ctx)
for inst in mir_func.instructions {
me.emitInstruction(inst)
}
// JITコンパイル
return ExternCall("cranelift_finalize_function", me.func_ctx)
}
}
```
## 5. ブートストラップ手順
### 5.1 段階的移行
1. **Stage 0**: Rustコンパイラで初期Nyashコンパイラをビルド
2. **Stage 1**: Stage 0コンパイラでNyashコンパイラNyash版をコンパイル
3. **Stage 2**: Stage 1コンパイラで自分自身をコンパイル
4. **検証**: Stage 1とStage 2の出力が同一であることを確認
### 5.2 検証スクリプト
```nyash
box BootstrapVerifier {
verify() {
// Stage 0でStage 1をビルド
local stage0 = new CompilerBox() // Rust版
local stage1_code = stage0.compile(readFile("compiler.nyash"))
// Stage 1でStage 2をビルド
local stage1 = stage1_code.instantiate()
local stage2_code = stage1.compile(readFile("compiler.nyash"))
// バイナリ比較
if stage1_code.equals(stage2_code) {
print("🎉 Bootstrap successful!")
return true
} else {
print("❌ Bootstrap failed - outputs differ")
return false
}
}
}
```
## 6. 性能最適化
### 6.1 ホットパス最適化
```nyash
box OptimizingCompiler from CompilerBox {
init { profiler }
constructor() {
from CompilerBox.constructor()
me.profiler = new ProfilerBox()
}
compile(source) {
// プロファイル収集モード
if me.profiler.isEnabled() {
me.profiler.start()
}
local result = from CompilerBox.compile(source)
// ホット関数をJIT再コンパイル
if me.profiler.hasHotFunctions() {
for func in me.profiler.getHotFunctions() {
me.recompileWithOptimization(func)
}
}
return result
}
}
```
## 7. エラー処理とデバッグ
### 7.1 エラーレポート
```nyash
box CompilerError {
init { message, location, suggestions }
format() {
local output = "Error at " + me.location + ": " + me.message
if me.suggestions.length() > 0 {
output = output + "\nSuggestions:"
for suggestion in me.suggestions {
output = output + "\n - " + suggestion
}
}
return output
}
}
```
## 8. テストフレームワーク
```nyash
box CompilerTest {
testParser() {
local parser = new Parser()
local ast = parser.parse("box Test { }")
assert(ast.type == "Program")
assert(ast.children.length() == 1)
assert(ast.children[0].type == "BoxDeclaration")
}
testMIRGeneration() {
local compiler = new CompilerBox()
local mir = compiler.lower(compiler.parse("1 + 2"))
assert(mir.instructions.length() == 3) // 2 Const + 1 BinOp
}
testEndToEnd() {
local compiler = new CompilerBox()
local code = compiler.compile("print('Hello')")
local output = code.run()
assert(output == "Hello")
}
}
```
このようにして、NyashでNyashコンパイラを実装することで、真のセルフホスティングを実現します。