なんか、Brainf*ckのページでも作ってみようかなーなんて。
いっしょに楽しく学びましょう。
命令が8つしかない。以下はWikipediaからの引用。
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 などとした方がラクでしょう。
以下、このコーナーでは「メモリに先頭からa, b, c, d, … と値がはいっており、ポインタは先頭から3番を指している」という状態を、
[a][b][c][d]… ↑
と書くことにします。
また、メモリのn番目を指したいとき、矢印の横に (n) と表記します。
例えば「メモリの99番目から順に e, f, g, h, … と値がはいっており、ポインタは先頭から100番目を指している」という状態を、
…[e][f][g][h]… ↑(100)
と表します。
(追記してくださる方はこのルールに従うか、独自の書き方をする場合はその見方を書いてくださるとありがたいです。)
さて、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 と言った感じで。)
多分続くよ!
Brainf*ckの性質上、 [ や . などを別の文字列と置き換えることによって、 簡単に別の言語(俺言語)ができてしまう。ここではその一部を紹介しておこう。