Files
hakorune/docs/development/roadmap/phases/phase-16/fold-lang-design.txt

181 lines
7.3 KiB
Plaintext
Raw Normal View History

================================================================================
Phase 16: 折りたたみ言語FoldLang設計 - ChatGPT5提案
================================================================================
【概要】
セルフホスティング達成後の次なる進化。
"Everything is Box"を土台に、等価変換でプログラムを畳む/展開する最適化層。
MIR15は増やさず、BoxCall列を書き換えるだけで実用速度を実現。
================================================================================
1. コア思想Fold = 等価変換の一段)
================================================================================
■ 公理Fold Laws
├─ 等価性: unfold(fold(P)) = Ptrace_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% を超えたら自動で折畳みOFFFold Budget
================================================================================
4. ツールとメトリクス
================================================================================
■ Fold Inspector
└─ before/after のBoxCall DAG・削減率・safepoint位置を可視化
■ Fold Budget
└─ 実行時に効果を測って自動ON/OFF回帰防止
■ Unfold-on-error
└─ 例外発生時は即展開で再実行(原因特定用)
================================================================================
5. 実装ロードマップ(段階導入)
================================================================================
■ v012週
├─ 対象: 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
================================================================================