本文へスキップ
totonoe.tech

難解プログラミング言語を整える

中級

Brainf*ckを整える。

= たった8命令だけの言語を、1命令ずつ動かして仕組みを見る

Brainfuck が初めての方は、先に そもそも Brainfuck とは・何の役に立つのか をどうぞ。

サンプル(クリックでエディタに入れる)

CODE(> < + - . , [ ] 以外の文字は無視されます) 入力するだけ・送信ゼロ

OUTPUT

「実行」を押すと、ここに出力が出ます。

ステップ実行

1命令ずつ、テープとポインタの動きを見る

実行中のコード(コメント除去後・色つきが現在の命令)

テープ(先頭30マス・色つきがポインタの位置)

出力(ステップ実行中の途中経過)

 

TEXT → BRAINFUCK

好きな文字列を出力するコードを作る

「前の文字の文字コードからの差分」だけ + / - を出す、という素朴な方式でコードを組み立てます(1文字=0〜255の範囲に丸めます)。

生成されたコード(0文字)

実行結果(もとの文字列に戻れば成功)

 

そもそも Brainfuck とは

命令がたった8つしかない、世界でいちばん有名な難解言語。

Brainfuck(ブレインファック)は、1993年に Urban Müller が作ったとされる言語です。使える命令は記号8つだけで、「マスの数字を1増やす・減らす」「隣のマスへ動く」「繰り返す」「入出力する」といった最小限の操作しかありません。それでも組み合わせれば、理屈の上ではふつうの言語と同じ計算ができます。

作者は、できるだけ小さなコンパイラ(プログラムを翻訳する道具)を作ることを狙ったと言われています。ふつうの言語は人が読み書きしやすいように言葉や記号を増やしますが、Brainfuck は人の読みやすさを捨てて、言語そのものを小さくしたのが違いです。そのため、簡単な文字を1つ出すだけでも、記号を何十個も並べることになります。

何の役に立つのか

  • 「計算できる」とはどういうことかを体感できる

    命令が8つでも、繰り返しと分岐があればどんな計算もできる(チューリング完全)。教科書の理論を手元で確かめられます。

  • インタプリタ作りの定番の練習題材

    命令が少ないので、プログラムを実行する側を自分で作る入門課題としてよく使われます。

  • メモリと「今の位置」の感覚をつかめる

    1列に並んだマスと現在位置という形で、メモリと番地の考え方が見えます。C 言語のポインタを理解する助けにもなります。

  • パズル・コードゴルフとして頭の体操になる

    限られた命令で、どうやって目的の出力を作るかを考える遊びです。

  • 話のネタ・研修のアイスブレイクになる

    「この記号の羅列でも文字が出る」と見せると、プログラムの見方がほぐれます。

知っておくと面白いこと

  • 変数名も関数も数値の書き方もありません。メモリのマスを1つずつ直接動かす世界です。
  • 8つの記号以外の文字は無視されるので、コードの中に説明文を混ぜて書けます。
  • 「チューリング完全」と呼ばれる、ふつうの言語と同じ計算力を持つ最小クラスの言語として、理論の話題でもよく名前が出ます。

上の実行環境でサンプルを動かし、ステップ実行で1命令ずつテープの変化を見ると、この言語の仕組みがつかめます。

早見表

8つの命令、これで全部。

命令 意味
> ポインタを右へ1つ動かす
< ポインタを左へ1つ動かす
+ 今のマスの値を1増やす(255の次は0に戻る)
- 今のマスの値を1減らす(0の前は255に戻る)
. 今のマスの値を文字コードとして出力する
, 1文字入力してマスに書く(このページでは常に「入力なし=0」)
[ 今のマスが0なら、対応する ] の次の命令まで飛ぶ(ループの入口)
] 今のマスが0でなければ、対応する [ の次の命令まで戻る(ループの出口判定)

なぜ8命令だけで、どんな計算もできるのか

Brainfuckが持っているのは「テープ(メモリ)を1マスずつ移動する」「マスの数値を1増減する」「今のマスの値で分岐する(ループ)」「入出力する」の4種類だけです。 でもこの4種類があれば、好きな回数だけ繰り返す(ループ)・条件によって処理を変える(マスが0かどうかで分岐)・好きなだけメモリを使う(テープを移動しながら値を貯める)ができます。

「足し算」プリセットはセル1の値をセル0へ1ずつ移し替えて([<+>-])たし算を、 「掛け算」プリセットはそれを繰り返し行う二重ループでかけ算を実現しています。ループと増減だけで、四則演算はもちろん、原理的にはどんなアルゴリズムでも組み立てられます (計算理論ではこれを「チューリング完全」と呼びます)。書くのが大変なだけで、できないことは(メモリの上限を除けば)ありません。

⚠️ このページのインタプリタはテープ3万マス・8bit(0〜255でラップアラウンド)。ステップ実行には上限(20万ステップ)があり、無限ループでも必ず止まります。 入力命令 , はこのページでは常に「入力なし(0)」として扱います(送信ゼロのため、キーボード等からの入力は受け付けません)。

このツールについて

`> < + - . , [ ]` の8命令だけでできたプログラミング言語。ここではコードを実行するだけでなく、1命令ずつ止めながらテープとポインタの動きを見たり、好きな文字列を出力するコードを自動生成したりできます。

8命令(> < + - . , [ ])だけの言語。実行・1命令ずつのステップ実行(テープ可視化)・文字列→コード自動生成の3本立て。送信ゼロ。

主な機能

  • 実行とステップ実行(テープ先頭30マスの可視化・現在命令のハイライト)
  • 再生/一時停止/1歩/速度スライダー
  • テキスト→Brainf*ck コード自動生成(その場で実行して一致を確認)
  • 8命令の早見表とチューリング完全性の解説
  • プリセット4種(Hello World・A〜Z・足し算・掛け算)・ステップ上限で必ず停止・送信ゼロ

よくある質問

Q. Brainf*ck は本当に8個の命令だけですか?

A. はい。「> < + - . , [ ]」の8文字だけが命令で、ほかの文字はすべて無視されます。そのためコメントを自由に書き込めます。

Q. なぜ8命令だけで何でも計算できるのですか?

A. メモリの移動・数値の増減・条件分岐(ループ)・入出力の4種類がそろっているためです。理論上「チューリング完全」で、書くのが大変なだけで、メモリの上限を除けばできない計算はありません。

Q. 無限ループのコードを動かすとどうなりますか?

A. 20万ステップに達すると自動的に停止します。ブラウザが固まることはありません。

Q. 入力命令「,」を使うとどうなりますか?

A. このページは送信ゼロで入力を受け付けないため、常に0が読み込まれた扱いになります。

Q. テキストからのコード生成はどんな仕組みですか?

A. 前の文字の文字コードからの差分だけを「+」「-」で表す方式です。生成したコードを実行すると元の文字列に戻ることを、その場で確認できます。

入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

続けて整える

運営サイト

私たちが運営するサイト