Brain StudioでBrainf*ckを学んでみる

Brainf*ckというプログラミング言語を知っていますか?

難解プログラミング言語の代表的なものの1つで書いてると脳ミソがフ〇ックされたように感じることからその名前がついていると思われます。



Brainf*ckはなんと8個の命令しかなく、それを8個の記号で記述します。
1. > ポインタインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。
2. < ポインタをデクリメントする。C言語の「ptr--;」に相当。
3. + ポインタが指す値をインクリメントする。C言語の「(*ptr)++;」に相当。
4. - ポインタが指す値をデクリメントする。C言語の「(*ptr)--;」に相当。
5. . ポインタが指す値を出力に書き出す。C言語の「putchar(*ptr);」に相当。
6. , 入力から1バイト読み込んで、ポインタが指す先に代入する。C言語の「*ptr=getchar();」に相当。
7. [ ポインタが指す値が0なら、対応する ] の直後にジャンプする。C言語の「while(*ptr){」に相当。
8. ] ポインタが指す値が0でないなら、対応する [ (の直後[1])にジャンプする。C言語の「}」に相当[2]

https://ja.wikipedia.org/wiki/Brainfuck#Brainfuck%E3%81%AE%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98
なんだかよくわからないですね(コナミ感)。

↓はBrainf*ckで書かれた「Hello World!」です。
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++
++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>
++++++++[<++++>-]<+.[-]++++++++++.
…理解できる気がしないですね。

MicrosoftストアにこのBrainf*ckを実行するためのアプリがあるため、使いながら構文を覚えてみようと思います。

インストール

Brain Studioをストアアプリからインストールするだけですぐに使えるようになります。

使い方

UIはシンプルです。

コード入力エリアにBrainf*ckコードを入力して右上の実行ボタンを押せば、標準出力エリアに実行結果がでます。
メモリが汚れて結果がおかしくなったら、ゴミ箱ボタンを押すとリセットされます。
Inputタブもあるので、標準入力も受け取れそうです。

左上のハンバーガーアイコンから外部ファイルに保存したり、それを読み込んだりもできます。

下部のツールのVirtual Keyboardをオンにすると、Brainf*ckで使う8つの記号を入力できるボタンが出てきます。
また、その下の入力欄は入力した文字のASCIIコードを表示してくれます。
後述しますが、この言語のコードを書くには大変助かる機能です。

Brainf*ckを書いてみる

それでは命令を読み解きながら書いていきましょう。

ポインタがC言語のポインタと同じ意味なら、メモリ空間のアドレスを指し示すものだと思われます。
アドレスに入っている値を操作した結果をASCIIコードに対応する文字として出力するということですね。

なので、「1」のASCIIコードは「49」のため、
+++++++++++++++++++++++++++++++++++++++++++++++++.
+を49個並べて.で出力すれば「1」が出力されます。
+++++++++++++++++++++++++++++++++++++++++++++++++.+.+.-.-.
このように書けば結果は「12321」ですね。

+をただ並べるだけだとASCIIコードが大きくなればなるほど、コードが長くなってしまいます。

ひどく直感的でないですが、[]を使うと繰り返しが書けます。
+++++++[>+++++++<-]>.
このコードも結果は「1」を出力します。
7の加算を7回繰り返して出力したことになります(よくわからんけど)。

頑張ってBrainf*ckという文字列を出力してみます。
ASCIIコードは66 114 97 105 110 102 42 99 107です。
+++++++++++[>++++++<-]>.[>++<-]>------------------.-----------------.++++++++.+++++.--------.>++++++[>+++++++<-]>.[>++<-]>+++++++++++++++.++++++++.
B 11×6で66
r 2掛けして、18引いて114
a 17引いて97
i 8足して105
n 5足して110
f 8引いて102
* ポインタを進めて6×7で42
c 2掛けして、15足して99
k 8足して107

名前の通り書いてるとだんだん頭がおかしくなります…。


ジョーク言語のようなものなので、知ってても何の飯の種にもならないですが、話のネタくらいにはなるでしょう。

繰り返しやポインタ移動をうまく使うとエレガント?なBrainf*ckコードが書けるのでコードゴルフをやってみるのも一興かも…。

Let’s brain f*ck!

後日談

ブラウザ版実行環境を見つけました。
Brainfuck Online Simulator