Files
hakorune/docs/development/roadmap/phases/phase-17-loopform-selfhost/loopform-design.md

2.1 KiB
Raw Blame History

LoopForm Design — MacroDriven Loop Normalization

Goal

  • ループで発生する「変数キャリアloopcarried values」を Nyash のユーザーマクロで前段正規化し、MIR/LLVM側は素直に最適化可能な形にする。

Key Idea

  • ループ状態複数変数をタプルまたは専用Boxに束ねて“1個の搬送値carrier”として扱う。
  • ループのヘッダで φ は常に“1つのタプル”にだけ付与される → PHIグルーピングの不変が自動で満たされる。

Normalization PatternwhileのMVP

// input
// i=0; sum=0; while (i<n) { sum = sum + a[i]; i = i + 1 }

// expanded
let __car0 = (i, sum);
head:
  let (i, sum) = __car_phi;
  if !(i < n) goto exit;
  let __car1 = (i + 1, sum + a[i]);
  __car_phi = φ(__car0, __car1);
  goto head;
exit:
  let (i, sum) = __car_phi;

Break/ContinueWeek2

  • continue: “次のキャリア”を構築して head へ遷移。
  • break: 現キャリアで exit へ遷移。
  • ネスト時: 内側ループのcarrierと外側スコープの分解を明示する名称はgensym

for/foreachWeek3

  • for (init; cond; step) は init→while(cond){ body; step } へ前処理後、同様に正規化。
  • foreach は IteratorBoxMVP経由の while 形式へ前処理。

Constraints / Notes

  • try/finally/throw との相互作用はMVPでは未対応将来ガイドで制約を明記
  • キャリア自動抽出: 本体で再代入される変数集合を候補とし、ループ外で参照されるものを優先収集。
  • 衛生: MacroCtx.gensym で __car_phi/__carK などの一意名を生成。

Integration

  • ユーザーマクロ: apps/macros/examples/loop_normalize_macro.nyash
  • 事前展開: selfhostpreexpand autoPyVM限定で適用
  • 検証: macrogolden + LLVM PHI健全性スモーク空PHIなし/先頭グループ化)

Future Work先の先

  • MIRに LoopHeader/LoopLatch/LoopContinue/LoopExit の4命令を導入した正規形を検討最適化/解析の高速化)。
  • Boxベースの LoopState/Carrier の型体系を整理(型推論との接続)。