C による Brainfuck インタプリタ

難解プログラミング言語のひとつ、Brainfuckのインタプリタを書いてみました。命令は8つしかありませんが、立派にチューリング完全です。

言語仕様

処理系の構成要素

  • インストラクションポインタ – プログラム中のある文字を指す。
  • 少なくとも30000個の要素を持つバイトの配列 – 各要素はゼロで初期化される。
  • データポインタ – 前述の配列のどれかの要素を指す。最も左の要素を指すよう初期化される。
  • 入力と出力の2つのバイトストリーム

命令

  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でないなら、対応する [ にジャンプする。C言語の「}」に相当。

コード

hello.bf を食わせてやると、”Hello, world!” と表示されます。

ビルド

gcc -o bfi bfi.c

実行

./bfi hello.bf
# または
./bfi < hello.bf

注意

実行するスクリプトによっては、危険な振舞いをする可能性があります。十分に注意してください。

「C による Brainfuck インタプリタ」への1件の返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください