Brainfuck

読み:ブレイン・ファック
外語:Brainfuck
品詞:名詞

極端な小型化と難解な言語仕様で有名なプログラミング言語の一つ。

  • 枠組み ‐ 構造化プログラミング
  • 初出年 ‐ 1993(平成5)年
  • 設計者 ‐ Urban Dominik Müller
  • 開発者 ‐ Urban Dominik Müller
  • 最新版 ‐ ?
  • 言語影響関係
    • 被影響 ‐ P′′
    • 加影響 ‐ Ook!、MONAmona、BrainCrash、Grass
  • 主要動作環境 ‐ Win32、MS-DOS、MSX-DOS

Amiga OS 2.0用に、小型のコンパイラを作ることを目的として創案された。

わずか8つの機能しか持たないが、最低限必要な機能は用意されており、にもかかわらず彼の作ったコンパイラは僅か240バイト(キロバイトやメガバイトではない)しかなかった。

この刺激的な言語はプログラミング言語の世界に少なからぬ影響をもたらし、Brainfuckの派生言語や、似たような趣旨の意味不明言語を多数生み出す原動力にもなったようである。

なお、名前にfour letters wordを含み、上品でないため、これを「Brainf*ck」、あるいは略して「BF」と書くこともある。

チューリングコンプリート

Brainfuckプログラムには、「ポインタ」と呼ばれる暗黙のバイトポインタがある。

あらかじめゼロで埋められた充分な大きさ(30,000バイト)の配列が用意されており、その一つをポインタが指し示す。ポインタの初期値はこの配列の先頭で、かつポインタは配列の範囲内を自由に移動しながら、指し示す値を増減させることができる。

この言語の実用性自体は皆無である(作者自体、もともと実用性を求めてはいないだろう)が、これでもチューリングコンプリートな言語であり、理論上は他の一般的なプログラミング言語と同等の能力を持っている。

言語仕様

Brainfuckプログラミング言語には8つの機能しかないが、それぞれが単独の文字で表現される。

  1. > ‐ ポインタのインクリメント。ポインタをpとする(以下同)と、Cの「p++;」に相当する
  2. < ‐ ポインタのデクリメント。Cの「p--;」に相当する
  3. + ‐ ポインタが指す値のインクリメント。Cの「(*p)++;」に相当する
  4. - ‐ ポインタが指す値のデクリメント。Cの「(*p)--;」に相当する
  5. . ‐ ポインタが指す値の出力。Cの「putchar(*p);」に相当する
  6. , ‐ ポインタが指す場所に値を入力。Cの「*p = getchar();」に相当する
  7. [ ‐ ポインタが指す値が0なら、対応する ] に飛ぶ。Cの「while (*p) {」に相当する
  8. ] ‐ ポインタが指す値が0でないなら、対応する [ に飛ぶ。Cの「}」に相当する

これら文字は可読性を理由に選択された。また、1文字であるのは字句解析を略し、コンパイラを軽量化するためである。

関連言語

文字は、上の8種類である必然性はなく、実際には何でも良い。

このため、他の文字に置き換え、より難解な言語仕様にしたプログラミング言語も作られている。

  • 派生言語
    • BrainCrash
    • MONAmona
    • Ook!
    • プログラミング言語「長門有希」
  • 関連言語