2006年06月28日 15:45 [Edit]

brainfu.k って命令大杉ね?

やはりbrainとfu.kが好きなハカーはbrainfu.kにはまりますね。何なんだこのはやりようは。

でも、よく見るとbrainf.ckって以外と複雑ですよね。


メモリーが4つもある

BFの処理系では、命令、データ、入力、出力が全て分かれています。通常のプログラミング環境でもそうなってはいるのですが、これは環境によってそう仮想化されているのであって、実際にはこれら全てを単一のメモリーに並べているだけというのはご存じのとおり。

実際のOSでは、入出力はメモリーの特定の位置に書き込んでから割り込みを入れてそれを処理する部分にjumpし、処理後にreturnするというやり方をしています。よって,.は不要、ということになります

引算って必要?

BFの仕様では、メモリーセル(バイト)の大きさが8bit、メモリーの大きさが不定という仕様になっていますが、Overflowしたら元にもどる(例えば -1 = 255)という風にすれば、引算は不要になり、よって<-も不要ということになります。

まとめ

というわけで、BFよりさらに小さな言語と処理系仕様が出来ました。

  • メモリーは単一でRing Bufferになっている
  • メモリーセルも単一で、Overflowしたら一回りする。
  • プリミティブは以下の4つ。
    • > : ptr = (ptr + 1) % memory_size;
    • + : *ptr = (*ptr + 1) % max_char;
    • [ : while(*ptr){
    • ] : }

これなら1byteに4命令入ります。なんと1byteでVLIWなのです。DNAに記録する時にもよさげです。

そして、どうせ4なら、プリミティブの名前も以下のとおりにしてしまいましょう。

  • F = [
  • U = +
  • C = >
  • K = ]

なぜこの順番で並んでいるかと言えば、この順番だと、一以上の値が並んだメモリーセルを一づつ増やし続ける命令になるからです。産めよ増やせよ地に満ちよ。

これだけ単純なら、brainはいらないでしょう。もちろん処理系の名前も、これに準じるのが自然です。

"Dan the Brainfu.ker".replace(/Brain/i,'')


この記事へのトラックバックURL

この記事へのコメント
kazuhoさん
鋭い指摘。
ですが現実の電脳もメモリーは有限なので
現実にはチューリング不完全なんですよね。
Dan the Turing Incomplete Computer
Posted by at 2006年06月28日 17:51
< を廃止したら、チューリング不完全になったりしないでしょうか?
Posted by kazuho at 2006年06月28日 17:32