Brainfuck
非常に小さい難解プログラミング言語
Brainfuck(ブレインファック)はプログラミング言語のひとつ。なお名称に含まれるfuckが卑語であるため、Brainf*ck または Brainf**kなどと表記されることがある。
パラダイム | 構造化プログラミング |
---|---|
登場時期 | 1993年 |
設計者 | Urban Müller |
型付け | なし |
影響を受けた言語 | P′′ |
影響を与えた言語 | Ook!、Pxem |
概要
編集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
﹂だけで記述する。文字を置き換え、難読性を深めた例。
●BrainCrash[2] - 4つの命令﹁|&~^
﹂を加えたもの。終了時にポインタの指す値が0になるまでポインタを進め値を出力する。また、実行前に"Hello, world!"が格納される。原型をさらに発展させた例。
●Ook! - ﹁Ook.
﹂﹁Ook!
﹂﹁Ook?
﹂のうち2つのトークンから成る文字列をBrainfuckの各命令に当てはめたもの。使用される記号︵実際には文字列だが︶の種類がわずか3つと、本家より少ない。元の8種類の文字を置き換え、よりユーモアを加えた例。
脚注
編集注釈
編集出典
編集関連項目
編集外部リンク
編集- http://www.muppetlabs.com/~breadbox/bf/ 解説ページ(英語)
- Index of /brainfuck 処理系のアーカイブ
- Brainfuck 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 の実装例 (動作過程を表示)