| パラダイム | 難解、命令的、構造化された |
|---|---|
| デザイン: | アーバン・ミュラー |
| 初登場 | 1993年9月 |
| タイピングの規律 | タイプなし |
| ファイル名拡張子 | .b、.bf |
| Webサイト | ブレインファック |
| 影響を受けた | |
| P′′、偽 | |
| 影響を受けた | |
| マルボルジュ | |
ブレインファックは、1993年にスイスの学生アーバン・ミュラーによって作成された難解なプログラミング言語です。 [1]極めてミニマルに設計されたこの言語は、8つの単純なコマンド、データポインタ、および命令ポインタのみで構成されています。[2]
Brainfuckはいわゆるチューリングタールピットの一例です。これはあらゆるプログラムを書くのに使用できますが、抽象化がほとんどないためプログラムが非常に長く複雑になるため、実用的ではありません。Brainfuckは完全にチューリング完全ですが、実用的ではなく、プログラマーに挑戦して楽しませるためのものです。[3] [4] Brainfuckでは、コマンドを小さく単純な命令に分解する必要があります。
この言語の名前は、非常に複雑または異常で理解の限界を超えるものを指す俗語「ブレインファック」に由来しており、実際のソフトウェアを設計するために作られたのではなく、コンピュータプログラミングの限界に挑戦するために作られたものである。
言語名には卑猥な言葉が含まれているため、brainfsck、branflakes、brainoof、brainfrick、BrainF、BFなど多くの代替語が使用されています。[5]
歴史
ミュラーは、FALSEプログラミング言語の1024バイトコンパイラに触発され、可能な限り小さなコンパイラを実装することを目標にBrainfuckを設計しました。[6] [8]ミュラーの元のコンパイラはアセンブリで実装され、 296バイトのサイズのバイナリにコンパイルされました。彼は1993年に最初のBrainfuckコンパイラをAminetにアップロードしました。プログラムには「Readme」ファイルが付属しており、言語について簡単に説明し、読者に「これで何か役に立つものをプログラムできる人はいますか? :)」と挑戦しました。ミュラーはインタープリタといくつかの例も含めました。コンパイラの2番目のバージョンは、わずか240バイトしか使用しませんでした。[9]
言語設計
この言語は 8 つのコマンドで構成されています。ブレインファック プログラムはこれらのコマンドのシーケンスであり、他の文字 (無視されます) が散在している場合もあります。コマンドは順番に実行されますが、いくつかの例外があります。命令ポインタは最初のコマンドから始まり、それが指す各コマンドが実行され、その後、通常は次のコマンドに進みます。命令ポインタが最後のコマンドを通過すると、プログラムは終了します。
brainfuck 言語は、プログラムと命令ポインター、およびゼロに初期化された少なくとも 30,000バイトのセルの 1 次元配列、移動可能なデータ ポインター(配列の左端のバイトを指すように初期化されます)、および入力と出力用の 2 つのバイト ストリーム (ほとんどの場合、それぞれキーボードとモニターに接続され、 ASCII文字エンコードを使用します) で構成される単純なマシン モデルを使用します。
8 つの言語コマンドはそれぞれ 1 つの文字で構成されます。
[と は]括弧が通常行うように一致します。それぞれが[正確に 1 つに一致し]、逆もまた同様です。 が最初になり、 2 つの間に
一致しないまたは[が存在することはできません。[]
Brainfuck プログラムは通常、理解するのが難しい。これは、少し複雑なタスクでも長いコマンド シーケンスが必要になることと、プログラムのテキストがプログラムの状態を直接示さないことが理由である。これらと Brainfuck の非効率性と限られた入出力機能が、本格的なプログラミングに使用されない理由の一部である。とはいえ、チューリング完全な言語と同様に、Brainfuck は、無制限のメモリと時間へのアクセスが与えられれば、理論的には計算可能な関数を計算したり、他の計算モデルをシミュレートしたりすることができる。[10]さまざまな Brainfuck プログラムが書かれている。[11] Brainfuck プログラム、特に複雑なプログラムは書くのが難しいが、C などのより一般的な言語で Brainfuck のインタープリタを書くのは、その単純さゆえに非常に簡単である。Brainfuck 言語自体で書かれた Brainfuck インタープリタも存在する。[12] [13]
例
2つの値を追加する
最初の簡単な例として、次のコード スニペットは、現在のセルの値を次のセルに追加します。ループが実行されるたびに、現在のセルが減分され、データ ポインターが右に移動し、次のセルが増分され、データ ポインターが再び左に移動します。このシーケンスは、開始セルが 0 になるまで繰り返されます。
[ - > + < ]
これは次のように簡単な追加プログラムに組み込むことができます。
++ セル c0 = 2
> +++++ セル c1 = 5
[ ループカウンタ(この場合は c1)にセルポインタを置いてループを開始します。
< + c0 に 1 を加算> - c1 から 1 を減算] ループカウンタにセルポインタを置いてループを終了します。
この時点で、プログラムは5を2に加算し、c0に7、c1に0を残しました
が、この値はASCIIエンコードされていないため、端末に出力できません。
ASCII文字「7」を表示するには、値7に48を加算する必要があります。
ループを使用して48 = 6 * 8を計算します。
++++ ++++ c1 = 8 で、これが再びループ カウンターになります[ < +++ +++ c0 に 6 を加算> - c1 から 1 を減算] < 。 値 55 を持つ c0 を出力します。これは "7" に変換されます。
「こんにちは世界」
次のプログラムは、「Hello World!」と改行を画面に出力します。
[このプログラムは、画面に「Hello World!」と改行を出力します。
長さは 106 個のアクティブ コマンド文字です。[これは最短ではありません。]
このループは「初期コメント ループ」です。これは、 BF プログラムにコメントを追加する簡単な方法で、コマンド
文字を気にする必要がありません。" . " 、" 、" + " 、" - " 、" < " 、" > " 文字は 無視され、" [ " と " ] " 文字はバランスが取れている必要があります。 現在のセルの値はデフォルトで 0 に設定されているので、このループとそれに含まれるコマンドは無視されます。値 が 0 の場合、このループはスキップされます。] ++++++++ セル #0 を 8 に設定します[ > ++++ セル #1 に 4 を追加します。これにより、セル #1 は常に 4 に設定されます[ ループによってセルがクリアされるため> ++ セル #2 に 2 を追加します> +++ セル #3 に 3 を追加します> +++ セル #4 に 3 を追加します> + セル #5 に 1 を追加します<<<< - セル #1 のループ カウンターをデクリメントします] セル #1 が 0 になるまでループします。反復回数は 4 です> + セル #2 に 1 を加算します> + セル #3 に 1 を加算します> - セル #4 から 1 を減算します>> + セル #6 に 1 を加算します[ < ] 最初に見つかったゼロ セルに戻ります。これは、 前のループでクリアされたセル #1 になります< - セル #0 のループ カウンターを減算します] セル #0 がゼロになるまでループします。反復回数は 8 です
結果は次のようになります:
セル番号: 0 1 2 3 4 5 6
内容: 0 0 72 104 88 32 8
ポインタ: ^
>> 。 セル #2 の値は 72 で、これは 'H' です。
> --- 。 セル #3 から 3 を引くと 101 になり、これは 'e' です。
+++++++ .. +++ 。 セル #3 の 'llo' も同様です。
>> 。 セル #5 はスペースのため 32 です。
< - 。 セル #4 から 1 を引くと 87 になり、'W' になります。
< 。 セル #3 は 'Hello' の末尾から 'o' に設定されました
。 +++ 。------ 。-------- 。 セル #3 は 'rl' と 'd' です。
>> + 。 セル #5 に 1 を加えると感嘆符になります。
> ++ 。 最後にセル #6 から改行が入ります。
読みやすくするために、このコードは複数の行にまたがっており、空白とコメントが追加されています。Brainfuck は 8 つのコマンド以外の文字をすべて無視する+-<>[],.ため、コメント用の特別な構文は必要ありません (コメントにコマンド文字が含まれていない限り)。コードは次のように記述することもできます。
++++++++ [ > ++++ [ > ++ > +++ > +++ > + <<<< - ] > + > + > - >> + [ < ] < - ] > > 。> --- 。++++++ .. +++ 。>> 。< - 。< 。+++ 。------ 。-------- 。>> + . > ++ 。
ROT13
このプログラムは、入力をROT13暗号で暗号化します。これを行うには、文字 AM ( ASCII 65–77) を NZ (78–90) にマッピングし、その逆も行います。また、am (97–109) を nz (110–122) にマッピングし、その逆も行います。他のすべての文字をそれ自体にマッピングする必要があります。文字を 1 つずつ読み取り、EOF (ここでは -1 または「変更なし」として表されるものと想定) を読み取るまで暗号化された同等の文字を出力します。EOF を読み取ると、プログラムは終了します。
- , + [ 最初の文字を読み取り、外側の文字読み取りループを開始します
- [ 文字が 0 の場合はスキップします>> ++++ [ > ++++++++ < - ] 除算ループの除数 (32) を設定します (メモリ レイアウト: 被除数 コピー 余り 除数 商 ゼロ ゼロ) < + < - [ 被除数 (x マイナス 1) を設定し、除算ループに入ります> + > + > - [ >>> ] コピーと余りを増加 / 除数を減らします / 通常の場合: スキップします< [[ > + < - ] >> + > ] 特殊なケース: 余りを除数に戻して商を増やします<<<<< - 被除数を減分します] 除算ループを終了します] >>> [ - ] + スキップ ループを終了します。以前の除数をゼロにして、フラグ用にスペースを再利用します> -- [ - [ < - > +++ [ - ]]] < [ 商が 2 または 3 でない限り、そのフラグをゼロにします。商をゼロにします。フラグをチェック++++++++++++ < [ フラグの場合、2 番目の除算ループの除数 (13) を設定します (メモリ レイアウト: ゼロ コピー 被除数 除数 余り 商 ゼロ ゼロ) > - [ > + >> ] 除数を減らします。通常の場合: 余りを増やします> [ + [ < + > - ] > + >> ] 特殊なケース:余りを増やす / 除数に戻す / 商を増やす<<<<< - 被除数を減らす] 除算ループを終了>> [ < + > - ] 余りを除数に戻して、有用な 13 を取得します> [ 商が 0 の場合はスキップします- [ 商が 1 の場合は商を減らしてスキップします- << [
- ] >> 商が 2 の場合、商と除数をゼロにする
] << [ << - >> - ] >> 商が 1 の場合、除数をゼロにしてコピーから 13 を引く] << [ << + >> - ] 商が 0 の場合、除数をゼロにしてコピーに 13 を加える] 外側のスキップ ループを終了 (((文字マイナス 1)/32) が 2 でも 3 でもない場合はここにジャンプします) < [ - ] 2 番目 の除算がスキップされた場合、最初の除算の剰余をクリアします< . [ - ] コピーから ROT13 された文字を出力してクリアします< - , + 次の文字を読み取ります] 文字読み取りループを終了
生命起源のシミュレーション
2024年、Googleの研究プロジェクトでは、わずかに改良された7コマンド版のBrainfuckを人工デジタル環境の基礎として使用しました。この環境では、レプリケータが自然に発生し、環境の支配権をめぐって互いに競争していることが分かりました。[14]
参照
- JSFuck –非常に限られた文字セットを持つJavaScriptプログラミング言語の難解なサブセット
注記
- ^ あるいは、コマンドを対応するコマンドへの
]無条件ジャンプとして変換したり、その逆を行ったりすることもできます。プログラムの動作は同じですが、不要な二重検索が発生するため、実行速度は遅くなります。[
参考文献
- ^イースター、ブランディー(2020-04-02)。「完全に人間、 完全に機械:プログラミングにおけるデジタルの非具現化のレトリック」。レトリックレビュー。39 (2):202–215。doi : 10.1080 /07350198.2020.1727096。ISSN 0735-0198。S2CID 219665562 。
- ^ Temkin, Daniel (2017-09-01). 「コードのない言語: 意図的に使用不可能、計算不可能、または概念的なプログラミング言語」. Journal of Science and Technology of the Arts . 9 (3): 83–91. doi :10.7559/citarj.v9i3.432. ISSN 2183-0088. 2024-07-09にオリジナルからアーカイブ。 2024-02-11に取得。
- ^ Haupt, Michael. 「COLA での Brainfuck の実装」
- ^ コックス、ジェフ、アレックス・マクリーン。「ただの楽しみではない」ブルームズベリー・アカデミック、2014年。157-173。
- ^ “brainfuck - Esolang”. esolangs.org . 2018年10月23日時点のオリジナルよりアーカイブ。2024年2月7日閲覧。
- ^ 「The Brainfuck Programming Language」。Muppetlabs.com。2023年5月3日時点のオリジナルよりアーカイブ。2023年4月30日閲覧。
- ^ 「FALSEプログラミング言語 — Wouter van Oortmerssen」。Strlen.com。2013年8月3日。2023年4月30日時点のオリジナルよりアーカイブ。 2023年4月30日閲覧。
- ^ Tamedia TX 2017 - Livestream Werdino. 2017年6月13日. 2023年8月11日時点のオリジナルよりアーカイブ。2024年8月30日閲覧。
- ^ “Aminet - dev/lang/brainfuck-2.lha”. Aminet. 2023年4月30日時点のオリジナルよりアーカイブ。2023年4月30日閲覧。
- ^ 「BFはチューリング完全である」。Iwriteiam.nl。2023年5月23日時点のオリジナルよりアーカイブ。2023年4月30日閲覧。
- ^ “Index of /esoteric/brainfuck/bf-source/prog”. sange.fi. 2002-01-22. 2023-04-30時点のオリジナルよりアーカイブ。 2023-04-30に閲覧。
- ^ 「BF で書かれた BF インタープリター」。Iwriteiam.nl。2024 年 9 月 22 日時点のオリジナルよりアーカイブ。2023 年 4 月 30 日閲覧。
- ^ 「brainfuck インタープリター」。Daniel B. Cristofani。2024年9月22日時点のオリジナルよりアーカイブ。2024年6月19日閲覧。
- ^ Blaise Agüera y Arcas; Alakuijala, Jyrki; Evans, James; Laurie, Ben; Mordvintsev, Alexander; Niklasson, Eyvind; Randazzo, Ettore; Versari, Luca (2024). 「計算生命: 単純な相互作用から整形式の自己複製プログラムが出現する方法」. arXiv : 2406.19108 [cs.NE].
外部リンク
- 公式サイト
