🧠
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
ループの動き:
-
++++++++→ 最初のセル(セル0)に「8」を入れる -
[>++++++++<-]→ セル1に8を加算しセル0を1減らす、これを8回繰り返す(結果: セル1 = 8 x 8 = 64) -
>+.→ ポインタをセル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 を楽しむために
- 最初は「A」を出すだけのコードから練習する
- 「ループを使って掛け算」を意識するとわかりやすい
- 最終目標は「Hello, World!」の出力
最終問題
Q. このコードは何を出力するでしょう?
+++++++[>+++++++<-]>.
答え
実行結果:
1
7 x 7 = 49、ASCII 49 は文字「1」です。
これで Brainfuck マスターへの第一歩
次は Ook! などの難解言語にも挑戦してみよう。
Discussion