shinhさんのBrainstuck(id:shinichiro_h:20070714#1184371977)でBrainf*ckを実装する方法を思いついたのだが、書く時間がない。

以下アイデア

必要なBFのセルは1ステップ実行するごとに最大で一個しか増えないので、1ステップ実行するごとにスタック上のBFのセルを全部積みなおして、最後に一個だけ新しいセルを追加する。

すなわち、nステップ後のスタックは(スタックは右に伸びるとする)

BF junk C0 C1 ... Cn

ここで、BFは実行するBFのコード、junkはもう使わないごみ領域、C0が0番目のセル、…、Cnがn番目のセル。

各々のセルはスタックの5エントリを消費して、内容は

C=(clock, value, cursor, pc, end)

ここで、左にある要素ほどスタックの深いところにある。

nステップ後のスタックにおいては、
value はこのセルの現在値。cursor はカーソルがこのセルの位置にあれば1、なければ0。end は常に0。
pc と clock は Cn 以外はゴミで、Cn.pc は次に実行するコードの深さを指す。Cn.clock は n*5。

で、うまくコードを書いてやればn+1ステップ後のスタック

BF junk C0 C1 ... Cn C'0 C'1 ... C'n C'n+1

の形にできてインタープリタが完成する。このコピーの途中で「+-<>」の4命令は実行できる(最初に命令で分岐して、個別に更新しながらコピーを実行)。新しい C'n+1.pc は Cn.pc + n*5 + 5 - 1 にしないといけないのだが、これの計算に C'i.pc の領域をうまく使おう。

残った繰り返し命令がめんどくさいのだが、「通常実行モード」「]を探してる途中」「[を探してる途中」で分けるしかないはず。

実装できるはずなのだが、こいつはめんどうだ。