🧠

Brainfuck超入門!難解言語を完全理解する

に公開

Brainfuckって何?

Brainfuck(ブレインファック)は、極限まで単純化されたプログラミング言語 です。
たった8種類の命令 だけで、計算や出力ができます。

「難解言語(Esoteric Language)」の代表格 で、「人間が読むことを考えていない」ため、脳が爆発しそうなコード になります。

Brainfuck の基本ルール

Brainfuck には たった 8 つのコマンド しかありません。

コマンド 説明
> メモリポインタを右に移動 >>>3つ右へ移動
< メモリポインタを左に移動 <<<3つ左へ移動
+ 現在のセルの値を 1 増やす +++3増やす
- 現在のセルの値を 1 減らす ---3減らす
. 現在のセルの値を出力 (ASCII) .現在の値を文字として表示
, 1 文字入力を受け取り、セルに保存 ,入力を受ける
[ ] までのコードをループ(セルが 0 でない間) [->+<]ループ処理
] [ に戻る(ループの終了) ][ の閉じカッコ

メモリとポインタの仕組み

Brainfuck は 30,000個のメモリセル(配列) を持っていて、ポインタ(カーソル)を移動しながら計算 します。

初期状態(ポインタは左端)
[0] 0 0 0 0 0 0 0 0 0 0

`+++>` を実行すると…
 3 [0] 0 0 0 0 0 0 0 0 0
      ^
セル0が3になり、ポインタが1つ右(セル1)へ移動

「A」を出力する最短コード

1文字ずつ + を足す方法

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

実行結果:

A

ASCIIコード 65(A) を + を65回繰り返して直接作り、. で出力しています。ただし、+ を 65回打つのはつらいので、次のループを使った方法が有効です。

ループ [ ] を使って効率化

ループを使って「A」を出力

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

実行結果:

A

ループの動き:

  1. ++++++++ → 最初のセル(セル0)に「8」を入れる
  2. [>++++++++<-] → セル1に8を加算しセル0を1減らす、これを8回繰り返す(結果: セル1 = 8 x 8 = 64)
  3. >+. → ポインタをセル1に移動し、+1 して「65」にして出力(ASCII 65 = 'A')

ループを使うと、短いコードで大きな数を作れます。

「Hello, World!」を出力

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

実行結果:

Hello, World!

「掛け算の考え方」で、複数のセルに値を仕込み、大量の文字を効率よく出力しています。Brainfuck の定番コードです。

掛け算 [>++++++++<-] の仕組み

「x8」を作るループの正体:

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

実行の流れ:

初期状態:        [8]  0
ループ1回目:     [7]  8
ループ2回目:     [6] 16
ループ3回目:     [5] 24
  ...
ループ8回目:     [0] 64   ← セル0が0になりループ終了

[ ] のループは「セル0が0になるまで繰り返す」だけです。セル0を8から1ずつ減らしながら、セル1に8ずつ加算することで、8 x 8 = 64 という掛け算を実現しています。

まとめ

コマンド 内容
> < ポインタを移動
+ - セルの値を変更
. , 出力・入力
[ ] ループ処理

「ループで掛け算」を理解すると、Brainfuck が楽しくなります。

Brainfuck を楽しむために

  1. 最初は「A」を出すだけのコードから練習する
  2. 「ループを使って掛け算」を意識するとわかりやすい
  3. 最終目標は「Hello, World!」の出力

最終問題

Q. このコードは何を出力するでしょう?

+++++++[>+++++++<-]>.
答え

実行結果:

1

7 x 7 = 49、ASCII 49 は文字「1」です。

これで Brainfuck マスターへの第一歩

次は Ook! などの難解言語にも挑戦してみよう。

Discussion

Hidden comment