139 lines
4.1 KiB
Plaintext
139 lines
4.1 KiB
Plaintext
|
|
================================================================================
|
|||
|
|
Phase 16: 折りたたみ言語 実装メモ
|
|||
|
|
================================================================================
|
|||
|
|
|
|||
|
|
【実装上の重要な判断】
|
|||
|
|
|
|||
|
|
1. セルフホスティング後に実装する理由
|
|||
|
|
- 混ぜると危険(複雑性の爆発)
|
|||
|
|
- 目標のブレを防ぐ
|
|||
|
|
- テストの組み合わせ爆発を避ける
|
|||
|
|
|
|||
|
|
2. Nyashで実装することの意義
|
|||
|
|
- ドッグフーディングの極致
|
|||
|
|
- 15,000行のコードベースなら理解しやすい
|
|||
|
|
- コミュニティが貢献しやすい
|
|||
|
|
|
|||
|
|
================================================================================
|
|||
|
|
実装の技術的詳細
|
|||
|
|
================================================================================
|
|||
|
|
|
|||
|
|
■ SimpleFoldPass(最小実装案)
|
|||
|
|
```rust
|
|||
|
|
// もしRustで書くなら(参考実装)
|
|||
|
|
pub struct SimpleFoldPass;
|
|||
|
|
|
|||
|
|
impl SimpleFoldPass {
|
|||
|
|
pub fn run(&mut self, mir: &mut MIRModule) -> bool {
|
|||
|
|
// Array.map().filter().map()だけを検出
|
|||
|
|
// 3連鎖まで
|
|||
|
|
// ArrayBoxのみ対象
|
|||
|
|
// 純関数判定は決め打ち
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
■ Nyashでの実装イメージ
|
|||
|
|
```nyash
|
|||
|
|
box FoldPass {
|
|||
|
|
init { patterns, purity_db }
|
|||
|
|
|
|||
|
|
detectChains(mir) {
|
|||
|
|
local chains
|
|||
|
|
chains = new ArrayBox()
|
|||
|
|
|
|||
|
|
# BoxCall列を走査して連鎖を検出
|
|||
|
|
for inst in mir.instructions {
|
|||
|
|
if me.isChainStart(inst) {
|
|||
|
|
local chain = me.buildChain(inst)
|
|||
|
|
if chain.length() <= 3 and me.allPure(chain) {
|
|||
|
|
chains.push(chain)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return chains
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
foldChain(chain) {
|
|||
|
|
# 連鎖を1つのfused callに変換
|
|||
|
|
local ops = chain.map(inst => me.extractOp(inst))
|
|||
|
|
return new FusedCall(chain.first().array, ops)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
================================================================================
|
|||
|
|
段階的実装計画
|
|||
|
|
================================================================================
|
|||
|
|
|
|||
|
|
Step 1: 基盤整備(1週間)
|
|||
|
|
- 純度属性の構文設計
|
|||
|
|
- MIRへの属性伝播
|
|||
|
|
- テストフレームワーク
|
|||
|
|
|
|||
|
|
Step 2: Array融合(2週間)
|
|||
|
|
- map/filter連鎖の検出
|
|||
|
|
- fused call生成
|
|||
|
|
- VMサポート追加
|
|||
|
|
|
|||
|
|
Step 3: 効果測定(1週間)
|
|||
|
|
- ベンチマーク作成
|
|||
|
|
- メモリプロファイル
|
|||
|
|
- GC圧力測定
|
|||
|
|
|
|||
|
|
Step 4: 拡張(1ヶ月)
|
|||
|
|
- String操作
|
|||
|
|
- I/Oバッチ化
|
|||
|
|
- ループ最適化
|
|||
|
|
|
|||
|
|
================================================================================
|
|||
|
|
リスクと対策
|
|||
|
|
================================================================================
|
|||
|
|
|
|||
|
|
リスク1: 最適化バグでプログラムが壊れる
|
|||
|
|
対策: trace_hash/heap_hashで常に検証
|
|||
|
|
|
|||
|
|
リスク2: デバッグが困難になる
|
|||
|
|
対策: --unfoldオプションで即座に無効化
|
|||
|
|
|
|||
|
|
リスク3: 性能が逆に悪化する
|
|||
|
|
対策: Fold Budgetで自動OFF
|
|||
|
|
|
|||
|
|
================================================================================
|
|||
|
|
成功の測定基準
|
|||
|
|
================================================================================
|
|||
|
|
|
|||
|
|
1. 定量的指標
|
|||
|
|
- Array操作: 30%以上高速化
|
|||
|
|
- メモリ使用量: 50%削減
|
|||
|
|
- GC頻度: 1/3に削減
|
|||
|
|
|
|||
|
|
2. 定性的指標
|
|||
|
|
- コードの可読性維持
|
|||
|
|
- デバッグ容易性維持
|
|||
|
|
- ユーザーコード変更不要
|
|||
|
|
|
|||
|
|
================================================================================
|
|||
|
|
将来の拡張可能性
|
|||
|
|
================================================================================
|
|||
|
|
|
|||
|
|
- 非同期処理の融合
|
|||
|
|
- GUI構築の最適化
|
|||
|
|
- カスタム融合ルール
|
|||
|
|
- プラグインBox対応
|
|||
|
|
- JIT/AOTとの協調
|
|||
|
|
|
|||
|
|
================================================================================
|
|||
|
|
参考資料
|
|||
|
|
================================================================================
|
|||
|
|
|
|||
|
|
- Haskell: Stream Fusion
|
|||
|
|
- Rust: Iterator Fusion
|
|||
|
|
- Julia: Loop Fusion
|
|||
|
|
- Clojure: Transducers
|
|||
|
|
|
|||
|
|
ただし、Nyashの「Everything is Box」哲学に合わせて
|
|||
|
|
独自のアプローチを取る。
|
|||
|
|
|
|||
|
|
================================================================================
|