コンテンツにスキップ

Brainfuck

出典: フリー教科書『ウィキブックス(Wikibooks)』

概要

[編集]

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つの命令を持ちます。命令は以下の通りです:

Brainfuckの命令セット
命令 動作
+ 現在のメモリをインクリメントする。
- 現在のメモリをデクリメントする。
> 命令ポインタを1つ右に移動させる。
< 命令ポインタを1つ左に移動させる。
. 現在のメモリの値を文字コードとみなし出力する。
, 入力を求め、入力された値を現在のメモリに代入する。
[ 現在のメモリの値が0なら、対応する]にジャンプする。
] 現在のメモリの値が0でないなら、対応する[にジャンプする。

また、命令でない文字は無視されます(コメントとして扱われます)。

影響と派生言語

[編集]

Brainfuckは多くの派生言語を生み出しました。主な例として:

  • Ook! - 命令をOok!で表現する変種
  • Whitespace - 空白文字のみで構成される言語に影響を与えた
  • Buffalo - buffalo という単語のみで構成される変種

これらの派生言語は、Brainfuckの単純さを様々な形で拡張または変形しています。

Hello world

[編集]

Brainfuckにおけるハローワールドプログラムを以下に示します。

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

実装

[編集]

Brainfuckを利用するには、ソフトウェアをインストールするほかに、ブラウザで実行する方法があります。以下はその一例です(2024年11月時点):

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)

[編集]
-[+[+<]>>+]<++

参考文献

[編集]
Wikipedia
Wikipedia
ウィキペディアBrainfuckの記事があります。
このページ「Brainfuck」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。