難解プログラミング言語「Brainfuck」(Brainf*ck)で遊んでみた

Puzzle


会社の主席エンジニアな人にランチの雑談で「Brainfuck」を教えてもらったので遊んでみた。

Brainfuck(ブレインファック)は難解プログラミング言語のひとつ。なお名称に卑語が含まれるため、Brainf*ckなどと表記されることがある。

Brainfuck - Wikipedia

開発者Urban Mullerがコンパイラがなるべく小さくなる言語として考案した。 実際、Mullerが開発したコンパイラのサイズはわずか123バイト(キロバイトではない!)、インタプリタは98バイトとなっている。
Brainfuck プログラムは非常に可読性・記述性が低いため実用性は期待できないが、それでもチューリング完全な(チューリングマシンで実行可能なあらゆるプログラムが記述できる)言語であり、理論上はC言語などの普通のプログラミング言語と同等の表現力を持つ。その簡潔から多くの派生言語を生み出すこととなった。

Brainfuck - Wikipedia

ほうほう!何やら面白そうではないですか。
最近、頭が固くなってきているので、頭の体操として、少しかじってみることにしました。

とりあえず環境を作る

$ sudo apt-get install bf

Ubuntuだったら、↑な感じでインストールするだけ。

Brainfuckの言語仕様

実行可能な命令は次の8つのみ!(C言語的には↓のような感じ。)

> 	becomes 	++p;
< 	becomes 	--p;
+ 	becomes 	++*p;
- 	becomes 	--*p;
. 	becomes 	putchar(*p);
, 	becomes 	*p = getchar();
[ 	becomes 	while (*p) {
] 	becomes 	}

via. The Brainfuck Programming Language

文字列を出力してみる

とりあえず「Brainfuck」と出力させてみようかしら。
「Brainfuck」はASCIIコード的には、"42h 72h 61h 69h 6Eh 66h 75h 63h 6Bh"。

# 参考: Linux等でのログのモニタリングで簡単にアラートをキャッチするワンライナー (参考:US ASCII CODE LIST)

まずは書いてみようレベルで。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.
++++++++.+++++.--------.+++++++++++++++.------------------.++++++++.


あまりにもわかりにくいので、↓はわかりやすく改行を加えてみました。

++++++++++++++++
++++++++++++++++
++++++++++++++++
++++++++++++++++
++.
++++++++++++++++
++++++++++++++++
++++++++++++++++
.
----------------
-.
++++++++.
+++++.
--------.
+++++++++++++++.
----------------
--.
++++++++.

「B」は"42h"なので、66回"+"して、文字出力"."して、次の文字「r」は"72h"なので、そこ(42h)からは48回"+"して、その次の文字は・・・の繰り返しですね。

$ bf test.bf
Brainfuck

実行結果は↑のようになります。無事、文字列出力が出来ました。

繰り返し処理を活用して短くする

(ちょっと読みやすくするため、改行を加えています。)

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

こんな感じですかね。
先程は、最初に66回"+"しましたが、↑は"8 * 8"回をループで"+"して、その後2回"+"する感じ。こんな感じでループを活用することで、コードは短くなりましたが、頑張ればもうちょい短く出来そう...

$ bf test.bf
Brainfuck

先程と同じ結果となりました。

echoプログラム

慣れない私は、↑のように文字列出力するだけで、ハァハァ言いながら頭を回転させて書いていたわけで、さすが難解プログラミング言語でシンプルなのはわかるけど、これは使えんわー、とか思っていたのですが、echoプログラムは驚異的な簡単さで記述できました。

,[.,]

うほっ。こりゃ短くてシンプルw


皆さんも、お暇なときにお試しください!

参考


プログラミング作法

プログラミング作法

  • 作者: ブライアンカーニハン,ロブパイク,Brian Kernighan,Rob Pike,福崎俊博
  • 出版社/メーカー: アスキー
  • 発売日: 2000/11
  • メディア: 単行本
  • 購入: 58人 クリック: 1,152回
  • この商品を含むブログ (209件) を見る
CODE COMPLETE 第2版 上 完全なプログラミングを目指して

CODE COMPLETE 第2版 上 完全なプログラミングを目指して