292 lines
11 KiB
Plaintext
292 lines
11 KiB
Plaintext
================================================================================
|
||
Phase 15: Nyashセルフホスティング計画 - 80k→20k行への革命的圧縮
|
||
================================================================================
|
||
|
||
【ビジョン】
|
||
NyashでNyashコンパイラを書き、Nyashプログラムをコンパイル・実行する
|
||
完全なセルフホスティング環境の実現 + 劇的なコード圧縮(75%削減)
|
||
MIR 13命令の美しさを最大限に活かした究極の実装
|
||
|
||
【数値目標】
|
||
現在: 80,000行(Rust実装)
|
||
第一目標: 20,000行(Nyash実装)
|
||
削減率: 75%
|
||
究極の夢: さらなる最適化で更に小さく!
|
||
|
||
【革命的要素】
|
||
MIR命令数: たった13個で全機能実現
|
||
バックエンド選択: Cranelift/直接x86/テンプレート方式
|
||
バイナリサイズ: 2-3KBの超小型も可能
|
||
|
||
================================================================================
|
||
1. なぜセルフホスティングか + コード圧縮の価値
|
||
================================================================================
|
||
|
||
■ 言語の成熟度の証明
|
||
├─ 自分自身をコンパイルできる = 実用的な言語
|
||
├─ ドッグフーディング = 実際に使って改善
|
||
├─ エコシステムの完成 = 外部依存からの解放
|
||
└─ 75%コード削減 = 保守性・理解容易性の劇的向上
|
||
|
||
■ Everything is Box哲学の究極形
|
||
├─ コンパイラもBox
|
||
├─ JITエンジンもBox
|
||
├─ リンカーもBox
|
||
└─ すべてがNyashで完結
|
||
|
||
■ コード削減の主要因
|
||
├─ Arc<Mutex>パターンの自動化(-30%)
|
||
├─ 型システムの簡略化(-20%)
|
||
├─ エラーハンドリングの統一(-15%)
|
||
└─ パターンマッチングの動的ディスパッチ化(-10%)
|
||
|
||
================================================================================
|
||
2. 技術的実現可能性
|
||
================================================================================
|
||
|
||
■ Cranelift埋め込みの利点
|
||
├─ 軽量: 3-5MB程度の追加(LLVMは50-100MB)
|
||
├─ Rustライブラリ: 静的リンクで配布容易
|
||
├─ JIT特化: メモリ上でのコンパイル・実行に最適
|
||
└─ 依存が少ない: ビルド時間短縮
|
||
|
||
■ 既存の準備状況
|
||
├─ ✅ MIR 13命令に削減完了(究極のシンプルさ)
|
||
├─ ✅ Cranelift統合準備済み(Cargo.toml)
|
||
├─ ✅ 直接x86エミッタ選択肢(dynasm-rs/iced-x86)
|
||
├─ ✅ プラグインシステム(拡張可能)
|
||
└─ ✅ Phase 12で統一実行パス確立
|
||
|
||
================================================================================
|
||
3. 段階的実装計画 - ChatGPT5戦略による最速ルート
|
||
================================================================================
|
||
|
||
■ Phase 15.0: バックエンド選択戦略(新規追加)
|
||
├─ 選択肢1: Cranelift(現在の主力、安定)
|
||
├─ 選択肢2: 直接x86エミッタ(dynasm-rs使用、高速)
|
||
├─ 選択肢3: テンプレート・スティッチャ(2-3KB超小型)
|
||
└─ 段階的移行: Cranelift→x86→テンプレート
|
||
|
||
■ Phase 15.1: YAML自動生成基盤(1-2週間)【最優先】
|
||
├─ boxes.yaml: Box型定義(type_id, method_id対応表)
|
||
├─ externs.yaml: 外部関数定義(C ABI境界)
|
||
├─ semantics.yaml: MIR13セマンティクス定義(13命令!)
|
||
└─ build.rs: 自動生成システム(重複コード即削除)
|
||
|
||
効果: Array/Instance/Console等で即座に1-2万行削減
|
||
|
||
■ Phase 15.1: 外部リンカー統合(1週間)
|
||
box LinkerBox {
|
||
link(objects, output) {
|
||
if Platform.isWindows() {
|
||
return exec("lld-link", objects + ["nyrt.lib", "/out:" + output])
|
||
} else {
|
||
return exec("ld.lld", ["-o", output, objects, "nyrt.a"])
|
||
}
|
||
}
|
||
}
|
||
|
||
■ Phase 15.2: Nyashパーサー最小実装(2-3週間)
|
||
├─ 再帰下降パーサー(800行目標)
|
||
├─ MIR15 JSON出力(既存VMで即実行可能)
|
||
├─ エラー処理の簡略化(Result祭り解消)
|
||
└─ ny-echo/ny-calcで動作確認
|
||
|
||
■ Phase 15.3: MIR実行器のNyash化(2-3週間)
|
||
box MirExecutor {
|
||
// 動的ディスパッチで15命令を処理
|
||
execute(inst) { return me[inst.type](inst) }
|
||
|
||
Const(inst) { me.values[inst.result] = inst.value }
|
||
BinOp(inst) { /* 実装 */ }
|
||
// ... 15命令分のメソッド
|
||
}
|
||
|
||
■ Phase 15.4: Boxes高レベル実装移植(1ヶ月)
|
||
├─ String/Array/Map等の表層メソッドをNyashへ
|
||
├─ NyRT側は最小プリミティブのみ維持
|
||
├─ プラグインBox統合
|
||
└─ 目標: 3,000行以下
|
||
|
||
■ Phase 15.5: インタープリターコア移植(1ヶ月)
|
||
├─ 評価ループのNyash化(3,000行目標)
|
||
├─ Arc<Mutex>自動管理の恩恵
|
||
├─ GCフックはNyRT委譲
|
||
└─ 自己コンパイル可能ラインへ
|
||
|
||
■ Phase 15.6: ブートストラップ(2週間)
|
||
├─ c0(Rust版)→ c1(Nyash版)コンパイル
|
||
├─ c1 → c1' 自己コンパイル
|
||
├─ パリティテスト(trace_hash一致)
|
||
└─ 完全セルフホスティング達成
|
||
|
||
================================================================================
|
||
4. EXEファイル生成・リンク戦略(ChatGPT5提案)
|
||
================================================================================
|
||
|
||
■ 段階的アプローチ(現実的順序)
|
||
├─ Phase 1: 外部リンカー利用(lld/gcc)【最速】
|
||
├─ Phase 2: lld内蔵(配布容易性)
|
||
└─ Phase 3: ミニリンカー自作(究極の自立)
|
||
|
||
■ C ABI境界設計(ny_プレフィクス統一)
|
||
├─ 呼出規約: Windows(fastcall) / Linux(sysv_amd64)
|
||
├─ 型マッピング: ny_handle=uint64_t, 数値=int64_t/double
|
||
├─ シンボル: ny_v1_console_log, ny_init, ny_fini
|
||
└─ 必須: 16Bスタックアライン、32B Shadow Space(Win64)
|
||
|
||
■ リンク形態の選択
|
||
├─ 静的リンク: nyrt.lib/.a同梱(配布楽・サイズ大)
|
||
├─ 動的リンク: nyrt.dll/.so依存(サイズ小・管理難)
|
||
└─ バンドル方式: スタブEXEにMIR埋め込み(初期案)
|
||
|
||
■ 最小リンカー実装(将来ロマン)
|
||
box MiniLinkerBox {
|
||
// PE/ELFサブセット実装
|
||
link(objects) {
|
||
local exe = new ExecutableBuilder()
|
||
exe.addSections(objects)
|
||
exe.resolveSymbols()
|
||
exe.applyRelocations()
|
||
return exe.build()
|
||
}
|
||
}
|
||
|
||
================================================================================
|
||
5. 実装上の課題と解決策
|
||
================================================================================
|
||
|
||
■ 課題1: パフォーマンス
|
||
├─ 問題: Nyashで書いたコンパイラは遅い?
|
||
└─ 解決: ホットパスをCraneliftでJIT最適化
|
||
|
||
■ 課題2: メモリ使用量
|
||
├─ 問題: Everything is Boxのオーバーヘッド
|
||
└─ 解決: コンパイラ特有の最適化Box設計
|
||
|
||
■ 課題3: デバッグの難しさ
|
||
├─ 問題: セルフホスティングのデバッグは複雑
|
||
└─ 解決: 段階的移行・既存コンパイラとの比較検証
|
||
|
||
■ 課題4: ABI互換性
|
||
├─ 問題: プラットフォーム毎の呼出規約差異
|
||
└─ 解決: 統一FFI層(type_id, method_id)で抽象化
|
||
|
||
================================================================================
|
||
6. 期待される成果
|
||
================================================================================
|
||
|
||
■ 技術的成果
|
||
├─ 完全なセルフホスティング言語
|
||
├─ 外部コンパイラ依存からの解放
|
||
├─ Nyashエコシステムの完成
|
||
├─ 言語の実用性の証明
|
||
└─ 【革命】71,000行→15,000行(75%削減)
|
||
|
||
■ 教育的価値
|
||
├─ コンパイラ実装の教材として
|
||
├─ Nyashで学ぶコンパイラ理論
|
||
├─ シンプルで理解しやすい実装
|
||
└─ 15,000行で読破可能なコンパイラ
|
||
|
||
■ コミュニティへの影響
|
||
├─ 開発者の参入障壁低下
|
||
├─ Nyashだけで開発環境構築
|
||
├─ 真の「Everything is Box」体験
|
||
└─ コントリビューション容易化
|
||
|
||
■ コード削減の具体例(80k→20k)
|
||
├─ Boxes実装: 13,000行 → 3,000行(77%削減)
|
||
├─ Interpreter: 15,000行 → 4,000行(73%削減)
|
||
├─ MIR: 12,000行 → 2,000行(83%削減、13命令化の効果)
|
||
├─ Parser: 5,000行 → 1,500行(70%削減)
|
||
├─ Backend: 15,000行 → 4,000行(73%削減)
|
||
└─ その他: 20,000行 → 5,500行(72%削減)
|
||
|
||
================================================================================
|
||
7. 成功指標
|
||
================================================================================
|
||
|
||
□ NyashコンパイラがNyash自身をコンパイル可能
|
||
□ コード行数: 20,000行以内(75%削減達成)
|
||
□ MIR 13命令での完全実装
|
||
□ 性能: Rustコンパイラの50%以上
|
||
□ バイナリサイズ:
|
||
- Cranelift版: 10MB以下
|
||
- 直接x86版: 5MB以下
|
||
- テンプレート版: 1MB以下(夢の2-3KBも視野)
|
||
□ コンパイル時間: 中規模プロジェクトで10秒以内
|
||
□ 100%のテストケース互換性
|
||
□ trace_hash/heap_hashパリティ(VM/JIT/AOT)
|
||
|
||
================================================================================
|
||
8. ロードマップ依存関係
|
||
================================================================================
|
||
|
||
必須完了フェーズ:
|
||
├─ Phase 10: Cranelift JIT統合
|
||
├─ Phase 11.8: MIR Core-13最適化
|
||
├─ Phase 12: プラグインシステム統一
|
||
├─ Phase 12.5: 最適化戦略確立
|
||
└─ Phase 14: 実アプリでの実証
|
||
|
||
推定開始時期: 2026年前半
|
||
推定完了時期: 2026年後半
|
||
|
||
================================================================================
|
||
9. 実装優先順位(ChatGPT5推奨)
|
||
================================================================================
|
||
|
||
■ 今すぐ着手(2日以内)
|
||
├─ boxes.yaml/externs.yaml/semantics.yaml スキーマ設計
|
||
├─ build.rs自動生成(Array/Instance/Console)
|
||
└─ 生成物でのパリティテスト
|
||
|
||
■ 今週中
|
||
├─ 外部リンカー呼び出し実装
|
||
├─ ny_プレフィクスABI仕様書作成
|
||
└─ echo/calcのリンク動作確認
|
||
|
||
■ 今月中
|
||
├─ Nyashパーサー骨格(MIR15 JSON出力)
|
||
├─ MirExecutorのNyash実装開始
|
||
└─ 1万行削減の実証
|
||
|
||
■ 3ヶ月以内
|
||
├─ c0→c1ブートストラップ
|
||
├─ 主要Box型のNyash移植
|
||
└─ 3万行削減達成
|
||
|
||
================================================================================
|
||
10. 夢の先にあるもの
|
||
================================================================================
|
||
|
||
セルフホスティング達成後の可能性:
|
||
|
||
■ Nyash専用最適化
|
||
├─ Box境界での特殊最適化
|
||
├─ Everything is Box前提の新しい最適化手法
|
||
└─ Nyashらしい高速化
|
||
|
||
■ 新しいバックエンド
|
||
├─ WebAssembly直接出力
|
||
├─ GPU計算対応
|
||
└─ 組み込みターゲット
|
||
|
||
■ 言語の進化
|
||
├─ Nyashで実験的機能を実装
|
||
├─ コミュニティ駆動の言語拡張
|
||
└─ 真のオープンソース言語
|
||
|
||
■ 究極の姿
|
||
├─ 15,000行で完全なコンパイラ
|
||
├─ 誰でも読めて改造できる
|
||
├─ 教育用言語の決定版
|
||
└─ Everything is Boxの証明
|
||
|
||
================================================================================
|
||
|
||
「コンパイラもBox、リンカーもBox、すべてがBox」
|
||
「71,000行→15,000行、これが革命」
|
||
|
||
これがNyashの究極の姿。 |