================================================================================ Phase 16: 折りたたみ言語(FoldLang)設計 - ChatGPT5提案 ================================================================================ 【概要】 セルフホスティング達成後の次なる進化。 "Everything is Box"を土台に、等価変換でプログラムを畳む/展開する最適化層。 MIR15は増やさず、BoxCall列を書き換えるだけで実用速度を実現。 ================================================================================ 1. コア思想(Fold = 等価変換の一段) ================================================================================ ■ 公理(Fold Laws) ├─ 等価性: unfold(fold(P)) = P(trace_hash/heap_hash一致) ├─ 安全点保持: 折畳み後もsafepoint(入口/背縁/await前後)を保存 └─ 純度境界: #[ny.pure] / #[ny.readonly] / #[ny.nothrow] の範囲のみ自動融合 ■ 層構造 Nyash → MIR15 → (FoldPass/FIR) → {VM/Clif/LLVM/x86} └─ MIRは増やさず、BoxCall列を書き換えるだけ ================================================================================ 2. 何が畳める?(期待できる進化) ================================================================================ ■ A. データ・ストリーム融合(Map/Filter/Reduce) ├─ 連鎖したBoxCallを1回に畳む(配列/文字列/マップ/JSON) ├─ 例: arr.map(f).filter(p).map(g) → arr.fused([Map(f), Filter(p), Map(g)]) └─ 効果: Box境界・アロケーション・バリア回数を削減(P95 -10〜40%期待) ■ B. 非同期の塊化(構造化並行) ├─ TaskGroup.spawn(..)* → joinAll() を1グループ命令に畳む └─ await前後のsafepointは保持、キャンセル/タイムアウトを最短経路で扱う ■ C. GUI/シーン構築の一括ビルド ├─ Scene.add(Button).add(Label).add(Grid…) → Scene.fused(buildlist) └─ 初期描画を1回に集約(レイアウト/フォント測定をまとめて実行) ■ D. I/Oバッチ化 ├─ FileBox.read(x).read(y).read(z) → FileBox.readv([x,y,z]) └─ SocketBox.send(a).send(b) → sendv([a,b]) ■ E. ループ域内の局所折りたたみ ├─ ループ本体の純パスだけを畳み、背縁safepointを残す └─ 例: for x in arr { y = g(f(x)) } # g∘fを一体化 ================================================================================ 3. 安全ガード(壊れないための制約) ================================================================================ ■ 副作用検出 └─ #[ny.may_write(box=…)] 等の注釈が付いた経路は折畳み対象外 ■ バリア規律 └─ barrier_{read,write} の相対順序を保持(Lowererが再挿入可能) ■ 観測可能性 └─ --unfold でいつでも展開実行に切替(デバッグ容易) ■ しきい値制御 └─ P95 +3% を超えたら自動で折畳みOFF(Fold Budget) ================================================================================ 4. ツールとメトリクス ================================================================================ ■ Fold Inspector └─ before/after のBoxCall DAG・削減率・safepoint位置を可視化 ■ Fold Budget └─ 実行時に効果を測って自動ON/OFF(回帰防止) ■ Unfold-on-error └─ 例外発生時は即展開で再実行(原因特定用) ================================================================================ 5. 実装ロードマップ(段階導入) ================================================================================ ■ v0(1–2週) ├─ 対象: Array.map/filter/map など純関数パイプ(長さ≤3) ├─ 仕組み: 属性タグ収集 → 連鎖検出 → fused([...]) 置換 → NyRT ny_array_fused へ └─ テスト: trace/heap_hash 一致、gc=sync/stress(k) 緑 ■ v1 ├─ ループ内の局所折畳み(背縁safepointを保持) └─ I/Oのreadv/sendvバッチ化 ■ v2 ├─ TaskGroup の塊化(spawn*→joinAll) ├─ GUI初期構築の一括ビルド └─ --unfold と Inspector を標準同梱 ================================================================================ 6. Nyash側APIの薄い拡張(MIRそのまま) ================================================================================ ■ 属性 ├─ #[ny.pure] # 副作用なし、参照透明 ├─ #[ny.readonly] # 読み取りのみ、状態変更なし ├─ #[ny.nothrow] # 例外を投げない ├─ #[ny.fold(barrier="keep")] # 折畳み制御 └─ #[ny.unfold] # デバッグ用展開強制 ■ FIR(内部表現)ノード └─ Fused(BoxId, [Op…])(ただのBoxCallの糖) ■ NyRT追加 ├─ ny_array_fused ├─ ny_scene_fused └─ ny_io_readv/sendv ================================================================================ 7. 具体イメージ(最小のv0例) ================================================================================ # ユーザーコード let out = arr.map(f).filter(p).map(g) # MIR15(概念) %a1 = BoxCall Array.map [%arr, %f] %a2 = BoxCall Array.filter [%a1, %p] %a3 = BoxCall Array.map [%a2, %g] # FoldPass v0 %fused = BoxCall Array.fused [%arr, [Map(f), Filter(p), Map(g)]] ================================================================================ 8. 効果予測(現実的な数値) ================================================================================ ■ Array操作 ├─ アロケーション削減により30-40%高速化 ├─ メモリ使用量: 中間配列削除で50%削減 └─ GC圧力: Box生成数が1/3になり、GC頻度低下 ■ ループ処理 ├─ ループ回数削減により実行時間1/3 └─ キャッシュ効率向上 ■ 非同期処理 ├─ コンテキストスイッチ削減 └─ レイテンシ改善 ================================================================================ 9. セルフホスティング後に実装する理由 ================================================================================ 1. 複雑性の分離 - セルフホスティングは「動くこと」が最優先 - 最適化は「速くすること」が目的 - 混ぜると両方失敗するリスク 2. ドッグフーディング - Nyashで最適化パスを書く - 言語の表現力を証明 - コミュニティが貢献しやすい 3. 段階的成功 - Phase 15: 動くコンパイラ(15,000行) - Phase 16: 速いコンパイラ(+3,000行) - 各段階で明確な成果 ================================================================================ 10. まとめ ================================================================================ 折りたたみ言語 = "Box世界の合成最適化層" - MIR15は増やさない - BoxCall列を等価変換で融合 - 必要ならいつでもunfold - 効果は速度×省メモリ×デバッグ容易 Nyashの「箱理論」を実用速度へ直結する次のステップ。 セルフホスティング達成後の楽しみ! ================================================================================ 注記: ChatGPT5による革新的提案(2025-09-01) ================================================================================