Brainf*ck

はじめに

なんか、Brainf*ckのページでも作ってみようかなーなんて。
いっしょに楽しく学びましょう。

言語の特徴

命令が8つしかない。以下はWikipediaからの引用。

  1. > ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。
  2. < ポインタをデクリメントする。C言語の「ptr--;」に相当。
  3. + ポインタが指す値をインクリメントする。C言語の「(*ptr)++;」に相当。
  4. - ポインタが指す値をデクリメントする。C言語の「(*ptr)--;」に相当。
  5. . ポインタが指す値を出力する。C言語の「putchar(*ptr);」に相当。
  6. , 1バイトを入力してポインタが指す値に代入する。C言語の「*ptr=getchar();」に相当。
  7. [ ポインタが指す値が0なら、対応する ] までジャンプする。C言語の「while(*ptr){」に相当。
  8. ] ポインタが指す値が0でないなら、対応する [ にジャンプする。C言語の「}」に相当。

処理系

The Brainfuck Archiveの、 impl/compilers/BF2C.c を保存します。

BF2C.cをCのコンパイラでコンパイルすると、BrainfuckのソースをCのソースに変換してくれるプログラムができあがるので、
Cに変換されたソースをもう一度Cコンパイラでコンパイルして実行してください。
こんな感じ。

 program.bf ー(BF2C.exe)→ program.c ー(Cコンパイラ)→ program.exe

また impl/interp/ 以下にインタープリタもあるようなので、UNIX系OSではそちらを使って #!/usr/bin/bfi などとした方がラクでしょう。

Hello, World!

さて、WikipediaのHello worldプログラムの一覧に、こんなコードが載っております。

 +++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
 ------------.<++++++++.--------.+++.------.--------.>+.

これを実行するとたしかに Hello, World! と表示されますが、最初はわけがわからないのでちょっと解説を。

まず一つ目の +++++++++ ですが、これは次の [ ] ループのためのループ回数の設定です。これを念頭に置いてコードを読むと良く分かります。

次に [ がありますが、今ポインタの内容は最初に9まで増やしたので、0ではありません。従って ] までジャンプはせずに、中に入ります。
そして >++++++++>+++++++++++>+++++<<<- が実行され、メモリの内容は

 [8][8][11][5][0][0]……

となります。

[ ] ループはメモリの先頭のが0になるまで(つまり9回)繰り返され、ループが終わった時点でメモリの内容は

 [0][72][99][45][0][0]……

となります。

あとは見てもらえれば分かると思います。72が H の文字コード、99が c の文字コード、45が , の文字コード-1で、この3つを基準にいくつかずらして表示しています。(例えばeなら 99+2 と言った感じで。)

続く

多分続くよ!