BrainFuckとは

初めに

わざわざこのページに来るくらいだから、説明の必要などないかもしれません。結局は2chのBrainFuckスレを見れば大体分かりますし。それでも読んでもらえるのなら、どうぞ見てやってください。

HelloWorld

とりあえずどんな言語でも、始めに書くだろうと思われる、HelloWorldをBrainFuckで書いてみます。

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

えーと、なんだこれ。普通の言語なら、せめてどこでHellowWorldを出しているかがわかるはずなのだが…。この言語はそれを感じさせませんね。

せっかくなんでCでHellowWorldを出力するプログラムを書いてみましょう。

#include <stdio.h>
int main() {
    printf("HelloWorld");
}

HelloWorldって書いてありますね。分かりやすい。

説明

ちょっと脱線しましたね。ではBrainFuckの説明に入ります。

BrainFuckの命令は以下の8個です。

各命令の意味は以下の通りです。

+
ポインタが示すメモリ位置のデータをインクリメント
-
ポインタが示すメモリ位置のデータをデクリメント
[
ポインタが示すメモリ位置のデータがヌル(0)なら対応する]までジャンプ
]
ポインタが示すメモリ位置のデータがヌル(0)でなければ対応する[までジャンプ
.
ポインタが示すメモリ位置のデータを出力
,
ポインタが示すメモリ位置のデータに入力
>
ポインタをインクリメント
<
ポインタをデクリメント

プログラムの例

例えば、Aを出力するBrainFuckコードは以下のようになります。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.

AはASCIIコードで65なので、65回インクリメントして出力。としています。

ただせっかくループが組める仕様になっていますので、1バイト目をカウンターとして使い2バイト目を65回インクリメント出来るように、以下のように書くとスマートです。

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

なんか上で紹介したページとほぼ同じだなぁ、文字を@からAに変えてるだけだし。まぁいいか。

HelloWorld

というわけで(長い前置きでしたが)HelloWorldの説明をします。ほとんど説明することなんてないんですけど。

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

1文字目"H"は72なので72回インクリメントし出力しています。

2文字目"e"は101なので72から数えて29回インクリメントすればいい。ってことは5回ループ4回インクリメント最後にデクリメントでOK。

後は今までの説明で理解できるはずなので、省略します。

インタープリタ

上で紹介したページのBF ◆leSXCx/JO2氏も言っていましたが、プログラミングのパズル的な面白さを思い知らせてくれる、すばらしい言語なわけですよ。

インタープリタが、http://esoteric.sange.fi/brainfuck/のcompiled/win/にありますので使ってみましょう(上で紹介したページのBF ◆leSXCx/JO2氏の情報)。フリーで公開している人も結構いますので探してみてもいいかも知れません。

AS/400でBrainFuck

AS/400でBrainFuckを使ってみたい方はAS/400でもBrainFuckを!を参考にしてください。