昨今ではあらゆる言語を学べる環境が整っています。
しかしながら、esolangに関しては正確な資料なども少なく、学習コストが比較的高いのが現状です。
仕様はこんなにも簡単なのにもったいないですよね。
Brainfuckの基本
不正確な内容が含まれる可能性があります。
また、動作環境によって仕様が異なる場合があります。
Brainfuck仕様がとても単純な言語です。
しかしながら、それは可読性を損ねたり手続きを複雑にすることが大半です。
これは同じ意味の文章を日本語で書くより英語で書く方が長くなるのと似ています。
仕様
Brainfuckには以下のような特徴があります
- 命令は8つのみ
- 記憶域は十分な長さ1のbyte配列のみ
ただし、一部実行環境では異なるようです。
- byte以外の配列
- 長さが異なる
- 端が存在しない
などの仕様の実行環境もあります。
これをC言語であらわすと以下の通りです。
#define LENG 30000 //30000以上なら良い
char tape[LENG]={0},*p=tape;
そしてこの配列はこのようなイメージで考えることができます。
|00|00|00|00|00|00|00|00|...
^
命令
Brainfuckには8つの命令が存在しており、それぞれ特定の一文字に対応しています。
命令文字 | 動作 | 対応するCのコード |
---|---|---|
, |
ポインタが指す値を入力された値に変える | *p=getchar(); |
. |
ポインタが指す値を文字として出力 | putchar(*p); |
> |
ポインタをインクリメント | p++; |
< |
ポインタをデクリメント | p--; |
+ |
ポインタが指す値をインクリメント | (*p)++; |
- |
ポインタが指す値をデクリメント | (*p)--; |
[ |
ポインタが指す値が00 なら,対応する] に飛ぶ |
while(*p){ |
] |
対応する[ の直前の文字に飛ぶ |
} |
以下では特筆すべき命令を紹介します。
ポインタ移動命令(>
,<
)
Brainfuckのポインタのインクリメントは>
です。
Brainfuckのポインタのデクリメントは<
です。
上の説明はC言語的な説明となっていますがいささかわかりにくいです。
そこでBrainfuckの配列を一次元に広がる帯のようなものだと考えるとわかりやすいでしょう。
この帯は左端が存在し、初期状態ではポインタは左端にあります。帯の右端はあまりにも遠いので考慮しません。
初期状態は以下のような状態です。
|00|00|00|00|00|00|00|00|...
^
これに対して>
が行われると
|00|00|00|00|00|00|00|00|...
^
のようになります。
これは>
命令によってポインタが左端から右に移動したとみなせます。
このように、>
命令が配列に対してポインタを右に移動、<
命令が配列に対してポインタを左に移動させるような命令と考えることができます。
この考えはBrainfuckのインタプリタをBrainfuckで書く時などに使います。
加減算命令(+
,-
)
Brainfuckはbyte配列です。
すなわち0(0x00)
~255(0xFF)
までの数字を扱うことができます。
FF
の時に+
命令を行うとデータがオーバーフローして00
になります。
00
の時に-
命令を行うとデータがアンダーフローしてFF
になります。
ただし、一部実行環境では異なるようです。
-
30000以上といわれているが出典は不明。 ↩