📚 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:
@ -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への変換実装完了
|
||||
- ✅ AOT(Ahead-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-15(14)の最終確定
|
||||
- プラグインシステムの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先生の助言
|
||||
|
||||
38
docs/development/roadmap/phases/phase-12.5/README.md
Normal file
38
docs/development/roadmap/phases/phase-12.5/README.md
Normal 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 11(LLVM統合)完了後、Phase 13(実アプリ開発)前に実施。
|
||||
約1ヶ月の開発期間を想定。
|
||||
@ -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」を保ちながら、**死ぬほど安全**を実現する素晴らしい設計!
|
||||
@ -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%とした場合の目安
|
||||
@ -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の最適化哲学。
|
||||
72
docs/development/roadmap/phases/phase-15/README.md
Normal file
72
docs/development/roadmap/phases/phase-15/README.md
Normal 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 Lowerer(Nyash実装)
|
||||
- [ ] CraneliftBox(JITエンジンラッパー)
|
||||
- [ ] ブートストラップ成功
|
||||
|
||||
## 🔧 技術的アプローチ
|
||||
|
||||
### 内蔵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」
|
||||
|
||||
外部ツールチェーンに依存しない、真の自立したプログラミング言語へ。
|
||||
162
docs/development/roadmap/phases/phase-15/self-hosting-plan.txt
Normal file
162
docs/development/roadmap/phases/phase-15/self-hosting-plan.txt
Normal 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の究極の姿。
|
||||
367
docs/development/roadmap/phases/phase-15/technical-details.md
Normal file
367
docs/development/roadmap/phases/phase-15/technical-details.md
Normal 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コンパイラを実装することで、真のセルフホスティングを実現します。
|
||||
Reference in New Issue
Block a user