難解プログラミング言語のひとつ、Brainfuckのインタプリタを書いてみました。命令は8つしかありませんが、立派にチューリング完全です。
言語仕様
処理系の構成要素
- インストラクションポインタ – プログラム中のある文字を指す。
- 少なくとも30000個の要素を持つバイトの配列 – 各要素はゼロで初期化される。
- データポインタ – 前述の配列のどれかの要素を指す。最も左の要素を指すよう初期化される。
- 入力と出力の2つのバイトストリーム
命令
>ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。<ポインタをデクリメントする。C言語の「ptr--;」に相当。+ポインタが指す値をインクリメントする。C言語の「(*ptr)++;」に相当。-ポインタが指す値をデクリメントする。C言語の「(*ptr)--;」に相当。.ポインタが指す値を出力に書き出す。C言語の「putchar(*ptr);」に相当。,入力から1バイト読み込んで、ポインタが指す先に代入する。C言語の「*ptr=getchar();」に相当。[ポインタが指す値が0なら、対応する]の直後までジャンプする。C言語の「while(*ptr){」に相当。]ポインタが指す値が0でないなら、対応する[にジャンプする。C言語の「}」に相当。
コード
hello.bf を食わせてやると、”Hello, world!” と表示されます。
ビルド
gcc -o bfi bfi.c
実行
./bfi hello.bf
# または
./bfi < hello.bf
注意
実行するスクリプトによっては、危険な振舞いをする可能性があります。十分に注意してください。

[…] 以前、C 言語で Brainfuck インタプリタを書きましたが、今度は Ruby で同じものを書いてみました。 […]