Brainf*ckの仕様と動作


最もシンプルでたくさんのことができる。その代わりわかりづらいということで有名なプログラミング言語「Brainf*ck」

言語仕様

概要

チューリング完全なプログラミング言語(基本的にどんな処理でも可能)で、コンソールのみに対応するプログラミング言語です。

とてもシンプルな命令でどんなことでもできちゃう万能言語…ただシンプルすぎて逆に扱いづらいというのがこの言語の特徴です。

言語名の由来は、可読性が低すぎる(コードが見づらい)ために、頭がイかれるというのが意味でBrainfuckという名前が付いています。

ただ、fuckは汚い言葉なのでuまたはucの部分をアスタリスクで隠すのが一般的です。

命令はわずか8つ

まず命令がわずか8種類しかありません。しかも動作もすごくシンプル

  • + メモリの値をインクリメント
  • - メモリの値をデクリメント
  • > ポインターをインクリメントする
  • < ポインターをデクリメントする
  • [ ループ開始
  • ] ループ終了
  • ,(コロン)
  • .(ピリオド)

簡単な説明はこの通りとなります。

メモリを持つ

Brainf*ckではある程度のメモリが事前に確保され、その領域を使います。

img_1355

イメージとしてはこんな感じ。

どこのメモリを指しているかを記録する「ポインター」というものがあり、それは< >で指定します。

そして、そのポインターの指しているかメモリを+1したり-1したりする命令が + – というわけです。

ただひたすら+したり-するのは大変ななので、ループ機能として [ ] を使います。また、ループの開始時点でポインターの指しているメモリの値が0なら、対応するループ終了までスキップします。

また、画面への入出力として.(ピリオド)で画面へ出力、,(コンマ)で入力を行うことができます。入出力には文字コードを使用します。

サンプルソース

aと表示する

まず最初はHello world!といきたいところですが、それすらも難しいのがこの言語の特徴。まずはaとだけ表示させるプログラムを作ってみましょう。

aの文字コードは97です。なので、+を97個書けばいいのです。

しかしこれでは長すぎますし効率も悪すぎます。というわけで、5*4*5-3=97という式を使い、ループで短縮してみましょう。

このコードは以下のような動きをしています。

  1. #1に+5する
  2. #2に移動し、+4し、#1に戻り、-1する。これを#1が0になるまで繰り返す。
  3. #1に移動し、+5し、#2に戻り、-1する。これを#2が0になるまで繰り返す。
  4. #1の内容を-3する
  5. 文字を出力する。

たったこれだけのコードで、先ほどのコードと同じ結果が得られるようになりました。

ループを使っている分、実行速度は最初の方が速いですが、このようにコードを短縮するのがBrainf*ckの醍醐味でもあります。

Hello world!を表示しよう

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.——.——–.>+.>.

Wikipediaから引用

ループを使うとこんなに短縮することができます。また、同じ内容でもいろんな書き方ができるので、サイトによってコードにばらつきがあるかも。

文字コード一覧

長くなるので別記事に記載。Brainf*ck用の文字コード一覧です。

Brainf*ck用文字コード一覧

2016.10.21

派生言語がたくさんある

このようにシンプルな仕様な言語なので、Brainf*ckの言語仕様をそのまま使った派生言語がたくさんあります。

といっても、仕様は同じ、可読性の低さも同じなのでBrainf*ckができれば一気に複数言語が習得できたとも言えるかも?

まとめ

ネタ言語として名高いBrainf*ck、できることは少ないですが、やり方しだいでは条件に応じて処理を分岐するなんてこともできるみたいですし、パズル感覚でやってみてはいかがでしょうか。

応用

Brainf*ckの詳しいことは他の記事でも紹介しています。よろしければどうぞ。

Brainf*ckで条件分岐をする(パート1)

2016.10.19