はじめに。
この記事はあくあたん工房アドベントカレンダー5日目の記事です。
他の記事もよろしくお願いします。
皆さんは難解プログラミング言語を触ったことがありますか?
例を上げるとBrainf*ckや、whitespaceなど、正気の沙汰とは思えないほど意味不明な言語のことです。
今回はそんな難解プログラミング言語の入門向け言語とも言えるBrainF*ckについて話していきたいと思います。
BrainF*ckって何?
BrainFuckはチューリング完全なプログラミング言語です。
はい。
なんのことやら...
BrainFuckを説明するにはまずチューリングマシンから理解しないといけません。
全く難しくないので、身構えなくても大丈夫です。
チューリングマシンって?
チューリングマシーンとは、チューリング博士という人が大昔に考えた、単純な動作で、すべての論理的な演算を行うことができる架空のマシンです。また、チューリング完全とはプログラミング言語がすべての論理的な演算が可能なことを言います。(正しく解釈できているか不安なので突っ込み待ってます)
さて、それでは目をつぶってください。
あなたの前には一列に無限に続くメモリの配列があります。
そして、そのメモリの列の上に1台だけメモリの読み取り装置があります。
この読み取り装置は、装置の真下にあるメモリ1つ分の値しか読み書きできません。
この読み取り装置の持っている機能は、
- 一つ前のメモリの上に移動すること(ポインタのデクリメント)
- 一つ後ろのメモリの上に移動すること(ポインタのインクリメント)
- 今読み取っているメモリの値を1増やすこと(値のインクリメント)
- 今読み取っているメモリの値を1減らすこと。(値のデクリメント)
- 今読み取っているメモリが0かどうかを判断すること
だけです。
それ以外のことは何もできません。
これがチューリングマシンのすべてです。
どうですか?簡単ですよね?(仕組みは)
このマシンは理論上すべての論理的な計算を実現できると言われています。
BrainF*ckって?
さておまたせしました。
本題のBrainFckについて話しましょう。
BrainFckは上記のチューリングマシンの持つ機能に、出力と入力の機能を付け足し、すべての命令を記号に置き換えたものです。
-
メモリのインクリメント
- < メモリのデクリメント
-
- 値のインクリメント
-
- 値のデクリメント
- [ メモリの値が0であれば対応するの]直後の処理に飛ぶ
- ] 対応する[まで戻る
- , メモリに値を入力する(ほとんどの実行環境では入力された文字の文字番号が入力される)
- . メモリの値を出力する(ほとんどの実行環境ではメモリの値に対応する文字番号の文字が表示される)
どうです?覚えやすいし簡単でしょ?()
HelloWorld
まずはこれから
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.---.+++++++..+++.++++++++.--------.+++.-----.--------.
HELLOWORLD
何が何かわかりませんよね。
このコードでは一つのメモリにインクリメント、「デクリメントし続けて、出力したい文字の文字番号に対応した値になったら出力するということを繰り返しています。
次に、もっとスマートに書いてみましょう
++++++++++[->+++++++<]>++.---.+++++++..+++.++++++++.--------.+++.-----.--------.
HELLOWORLD
このコードでは、はじめにメモリ1に10を代入したあと、メモリ1から1引くたびにメモリ2に7を加算するという処理をメモリ1が0になるまで繰り返すことで、短いコードでメモリ2に70回インクリメントを実現しています。
最後に
もっともっとこの言語のトリッキーな実装や魅力があるのですが、アドベントカレンダーの締切の都合上、ここまでにしたいと思います。
この次は、可読性の悪さで悪名高い?WhiteSpaceに挑戦してみようと思います。
それでは良い難読プログラミングライフを!
+++++++++[>+++++++++++<-]>++++++++.++++.-...-----.<+++++++++[>+<-]>++.<+++++++++[>-<-]>--.-.-------.<+++++++++[>---------<-]>------.<+++++++++[>++++++++++<-]>+++++++.++++.-.+.<+++++++++[>-<-]>----.<+++++++++[>++<-]>+.-------..+++++.<+++++++++[>-<-]>--.+++++++.++++++.++.--------.<+++++++++[>+<-]>+.<+++++++++[>-<-]>-.--.--------.<+++++++++[>+<-]>++++++.<+++++++++[>--<-]>-.<+++++++++[>++<-]>+.-----.------.<+++++++++[>+<-]>+++.<+++++++++[>-<-]>-.++++.+++++.-----.-------.-------.<+++++++++[>---------<-]>------.<+++++++++[>++++++<-]>++.<+++++++++[>+++++<-]>+++.<+++++++++[>-<-]>--------.++++++++.+++++.<+++++++++[>----<-]>----.<+++++++++[>+++++<-]>++.<+++++++++[>--<-]>.++++++++.<+++++++++[>+<-]>+++.--------.----.<+++++++++[>-<-]>-.<+++++++++[>+<-]>++++..<+++++++++[>+<-]>+++.<+++++++++[>--<-]>---.<+++++++++[>+<-]>..-----.<+++++++++[>+<-]>.<+++++++++[>-<-]>.++.<+++++++++[>-<-]>-.++++++++.<+++++++++[>+<-]>+.<+++++++++[>-<-]>-.<+++++++++[>+<-]>++.<+++++++++[>--<-]>-.<+++++++++[>+<-]>+++++.------.<+++++++++[>+<-]>+++.<+++++++++[>-<-]>-.++++.+++++.-----.<+++++++++[>-<-]>--.+.<+++++++++[>+<-]>+++++.++.-------.<+++++++++[>-<-]>.<+++++++++[>------<-]>-.<+++++++++[>----<-]>.<+++++++++[>+++++++++++<-]>++.--.--------.-.+.<+++++++++[>+<-]>++++++.-----.++++++.<+++++++++[>-<-]>-----.++++++++.<+++++++++[>+<-]>++.<+++++++++[>--<-]>-------.++++++++.++++.<+++++++++[>-<-]>---.<+++++++++[>++<-]>.++.<+++++++++[>---------<-]>---.