Brainfuck
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Brainfuck(ブレインファック)は難解プログラミング言語のひとつ。なお名称に卑語が含まれるため、Brainf*ckなどと表記されることがある。
概要
開発者Urban Müllerがコンパイラがなるべく小さくなる言語として考案した。 実際、Müllerが開発したコンパイラのサイズはわずか123バイト、インタプリタは98バイトであった。
Brainfuckプログラムは非常に可読性・記述性が低いため実用性は期待できないが、チューリング完全である。その簡潔さから多くの派生言語を生み出すこととなった。
Brainfuckの言語仕様
処理系は次の要素から成る: Brainfuckプログラム、インストラクションポインタ(プログラム中のある文字を指す)、少なくとも30000個の要素を持つバイトの配列(各要素はゼロで初期化される)、データポインタ(前述の配列のどれかの要素を指す。最も左の要素を指すよう初期化される)、入力と出力の2つのバイトストリーム。
Brainfuckプログラムは、以下の8個の実行可能な命令から成る(他の文字は無視され、読み飛ばされる)。
>
ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;
」に相当する。<
ポインタをデクリメントする。C言語の「ptr--;
」に相当。+
ポインタが指す値をインクリメントする。C言語の「(*ptr)++;
」に相当。-
ポインタが指す値をデクリメントする。C言語の「(*ptr)--;
」に相当。.
ポインタが指す値を出力に書き出す。C言語の「putchar(*ptr);
」に相当。,
入力から1バイト読み込んで、ポインタが指す先に代入する。C言語の「*ptr=getchar();
」に相当。[
ポインタが指す値が0なら、対応する]
の直後にジャンプする。C言語の「while(*ptr){
」に相当。]
ポインタが指す値が0でないなら、対応する[
(の直後[1])にジャンプする。C言語の「}
」に相当[2]。
派生言語
以上の8つの命令文字は可読性のために選ばれたものであり、これらが使われなければならない理由はなく、より難解にすることを目指したり、あるいは単なる遊びとして、各命令に使用する文字を置き換えた派生言語が考えられている。
- A[1] - 「
A
」だけで記述する。 - BF-BASIC'n[2] - 命令をそれぞれべーしっ君風に置き換えたもの。
- BrainCrash[3] - 4つの命令「
|&~^
」を加えたもの。終了時にポインタの指す値が0になるまでポインタを進め値を出力する。また、実行前に"Hello, world!"が格納される。 - Misa[4] - みさくらなんこつの作品に登場する人物の口調(通称:みさくら語)で表記できるよう、各命令に「
あ お っ ☆ !
」などを割り当てたもの。 - MONAmona[5] - 「
MONAmona
」の8文字を順に「><+-,.[]
」に当てはめたもの。 - Nyaruko[6] - 「這いよれ! ニャル子さん」に関する文字列だけからなる言語。
- Ook! - 「
Ook.
」「Ook!
」「Ook?
」のうち2つのトークンから成る文字列をBrainfuckの各命令に当てはめたもの。使用される記号(実際には文字列だが)の種類がわずか3つと、本家より少ない。 - おっぱい言語[7] - おっぱいに関連する言葉に置き換えたもの
- ジョジョ言語[8] - ジョジョの奇妙な冒険のセリフで置き換えたもの。
注
- ↑ 現在言語仕様として参照されているBrian Raiterによる記述には「直後」とは書いてないが、意味を考えると直後とするのが妥当
- ↑ 無条件に、対応する
[
にジャンプしている、と考えることもできる。
関連項目
外部リンク
- http://www.muppetlabs.com/~breadbox/bf/ 解説ページ(英語)
- http://esoteric.sange.fi/brainfuck/ 処理系のアーカイブ
- http://brainfuck.sourceforge.net/ Brainf*ck Golf(お題に沿ってなるべく短いBrainfuckソースコードを書くコンテスト)
- http://home.arcor.de/partusch/html_en/bfd.html Brainfuck Compiler (Windows/MS-DOS)
- http://brainfuck.progopedia.org/ Kit's JavaScript Brainfuck Interpreter
- http://cfs.maxn.jp/neta/onlineBrainFuck.html ONLINE BrainF*ck interpreter for JavaScript(STEP実行ができる)
- http://lab.moyo.biz/garage/brainfuck/index.xsp BrainFuck ダイナマイツ(メモリ表示付きインタープリタアプレット)
- http://d.hatena.ne.jp/yoshidaa/20130514/1368540057 Ruby による Brainf*ck の実装例 (動作過程を表示)