Brainfuck
表示
概要
[編集]Brainfuckは、Urban Müllerによって1993年に開発された難解プログラミング言語です。
P′′やFALSEに影響を受けました。また、膨大な数の難解プログラミング言語に影響を与えた言語です。
拡張子は、「.b」もしくは「.bf」です。
fuckが卑語であるため、様々な別名があります。それを以下に示します:
- bf
- Brainf**k
- Brainf*ck
このように、様々な別名のせいで、情報を探すことが困難になっていたりします。
仕様
[編集]メモリモデル
[編集]Brainfuckは以下のような単純なメモリモデルを採用しています:
- メモリセルは8ビット(0-255)の符号なし整数として扱われます
- メモリセルは30000個以上の配列として実装されます
- メモリの範囲外アクセスの挙動は実装依存です
実行モデル
[編集]Brainfuckは以下のもので成ります:
- 現在のメモリを指し示す命令ポインタ。初期値はメモリの左端を指す。
- 少なくとも30000個の要素があるメモリ。初期値は0。
- 入出力のストリーム。
命令
[編集]Brainfuckは、8つの命令を持ちます。命令は以下の通りです:
命令 | 動作 |
---|---|
+ |
現在のメモリをインクリメントする。 |
- |
現在のメモリをデクリメントする。 |
> |
命令ポインタを1つ右に移動させる。 |
< |
命令ポインタを1つ左に移動させる。 |
. |
現在のメモリの値を文字コードとみなし出力する。 |
, |
入力を求め、入力された値を現在のメモリに代入する。 |
[ |
現在のメモリの値が0なら、対応する] にジャンプする。
|
] |
現在のメモリの値が0でないなら、対応する[ にジャンプする。
|
また、命令でない文字は無視されます(コメントとして扱われます)。
影響と派生言語
[編集]Brainfuckは多くの派生言語を生み出しました。主な例として:
- Ook! - 命令をOok!で表現する変種
- Whitespace - 空白文字のみで構成される言語に影響を与えた
- Buffalo - buffalo という単語のみで構成される変種
これらの派生言語は、Brainfuckの単純さを様々な形で拡張または変形しています。
Hello world
[編集]Brainfuckにおけるハローワールドプログラムを以下に示します。
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
実装
[編集]Brainfuckを利用するには、ソフトウェアをインストールするほかに、ブラウザで実行する方法があります。以下はその一例です(2024年11月時点):
- El Brainfuck - メモリ可視化機能付き
- Online Brainf**k Compiler - デバッグ機能付き
- オンラインbrainf*ckデバッガ - 日本語インターフェース
Brainfuckの定数
[編集]英数字
[編集]以下のコードは、各数字の文字コードを生成します。コメントは生成される値を示しています。
0(48)
[編集]+++++++[>+++++++<-]>- # 7 * 7 - 1 = 48
1(49)
[編集]+++++++[>+++++++<-]> # 7 * 7 = 49
2(50)
[編集]+++++++[>+++++++<-]>+ # 7 * 7 + 1 = 50
3(51)
[編集]+++++[>++++++++++<-]>++ # 5 * 10 + 1 = 51
4(52)
[編集]++++[>++++++++++++<-]> # 4 * 13 = 52
5(53)
[編集]++++[>+++++++++++++<-]>+ # 4 * 13 + 1 = 53
6(54)
[編集]+++++[>+++++++++++<-]>- # 5 * 11 - 1 = 54
7(55)
[編集]+++++++[>++++++++<-]>- # 7 * 8 - 1 = 55
8(56)
[編集]+++++++[>++++++++<-]> # 7 * 8 = 56
9(57)
[編集]+++++++[>++++++++<-]>+ # 7 * 8 + 1 = 57
アルファベット・大文字
[編集]以下のコードは、各アルファベットの文字コードを生成します。
A(65)
[編集]>+[+[<]>>+<+]>
B(66)
[編集]--[++>+[<]>+]>
C(67)
[編集]+[->-[--<]>-]>
D(68)
[編集]+[->-[--<]>-]>+
E(69)
[編集]+[->-[--<]>-]>++
F(70)
[編集]-[+[>---<<]>+]>
G(71)
[編集]-[>+<-------]>--
H(72)
[編集]-[>+<-------]>-
I(73)
[編集]-[>+<-------]>
J(74)
[編集]-[>+<-------]>+
K(75)
[編集]-[>+<-------]>++
L(76)
[編集]>+[+<[-<]>>++]
M(77)
[編集]>+++[[-<]>>--]
N(78)
[編集]+[+[>>+<+<-]>]>
O(79)
[編集]-[+>++[++<]>]>-
P(80)
[編集]-[+>++[++<]>]>
Q(81)
[編集]-[>+<---]>----
R(82)
[編集]-[>+<---]>---
S(83)
[編集]-[>+<---]>--
T(84)
[編集]-[>+<---]>-
U(85)
[編集]-[>+<---]>
V(86)
[編集]-[>+<---]>+
W(87)
[編集]-[>+<---]>++
X(88)
[編集]-[+[+<]>>+]
Y(89)
[編集]-[+[+<]>>+]<+
Z(90)
[編集]-[+[+<]>>+]<++
参考文献
[編集]- Müller, Urban. "Brainfuck specification". 1993.
- Daniel B. Cristofani. "Brainfuck algorithms". http://www.hevanet.com/cristofd/brainfuck/