GitHub

Befunge

「新次元」のプログラミング言語、Befungeについて。

Befunge

Befunge(ベファンゲ?ビファンジ?) は、世にも珍しい「2次元プログラミング言語」の一種である。 それがどういうものかを説明するよりは、サンプルコードを見てもらった方が早いだろう。

Hello world

                 v
>v"Hello world!"0<
,:
^_25*,@

上のソース(これがソースなのである)が、BefungeにおけるHello worldである。もちろん(他の言語同様に)これとは異なる書き方も可能であるが、ここでは処理系付属のサンプルから引用した。

で、これがどう実行されるかというと…

  1. まず、「カーソル」は左上(0,0)のマスにあって、「右」を向いている。
  2. 空白は「何もしない」命令なので、カーソルは右に動き続け「v」に出会う。
  3. 「v」は移動方向を「下」に変更する命令なので、カーソルは次に「<」のマスに進む。
  4. 「<」は移動方向を「左」に変更する命令なので、カーソルは次に「0」のマスに進み、0をスタックに積む。

…とまあ、こんな感じでカーソルが動いていき、「Hello world!」という文字列を逆からスタックに積んで、それを1文字ずつpopして(「:」)表示する(「,」)。よく見ると、左の方に「v」「_」「^」「>」でループ(文字通り!)ができていることがわかるだろう。ここで、「_」は条件分岐に相当するものであり、スタックをpopしそれが0なら右に、さもなくば左に進行方向を変える。これは「横方向の」if文であり、これとは別に「縦方向の」if文(「|」)も存在する。

残りの「25*,@」は、改行コード(10 = 2*5)を作りそれを表示(「,」)しているだけである。「@」はプログラムの終了を意味する。

特徴

その他の特徴について。

自己書き換え

有名なネタ言語であるBrainf**kと同様にスタックベースで動くBefungeであるが、実はスタックの他にもう一つの記憶領域を使用することができる。「g」「p」(get, put)という命令である座標(x,y)の値を操作することができる。ここで、アドレス指定が(x,y)であることから想像できるかも知れないが、この命令はプログラム自身の置かれている領域自体を操作する。これによって、実行中に自分自身を書き換えるようなBefungeプログラムを書くことができる。{{fn "あなたの脳がハングアップしなければ……だが"}}

Funge

Funge-98 Final Specificationによると、BefungeはFungeと呼ばれるプログラミング言語 (Unifunge, Befunge, Trifunge...) の一種に過ぎないことが分かる。名前から予想されるように、UnifungeはBefungeの一次元版であり、TrifungeはBefungeを三次元に拡張したものである。{{fn "Trifungeには「上下方向の」ifである「m」という命令が登場する('middle'の'm'らしい)。"}}さらに、それ以上の任意の次元についてFungeを考えることができるという(そのソースはどうやって記述するのか?などと考えてはいけない)。またBefunge-93においては右端にたどり着いたカーソルが左端から出てくる(上下も同様)ことから、Befungeのプログラムは平面ではなくトーラス上に置かれていると考えられる。

バージョン

Befungeには最初のバージョンであるBefunge-93の他に、機能強化版であるBefunge-96, Befunge-97, Funge-98が存在する。 Funge-98 Final Specificationによると、Funge-98ではスタックを複数使えるようになっていたり (stack stack)、ファイルへの入出力ができたり、OSのコマンド実行ができたりするらしい。 また、Concurrent Fungeと呼ばれるマルチスレッド版についての記述があったりもする(2つ以上のカーソルを生成でき、それらが1クロックに1命令ずつ進む)。

残念ながら、Befunge-98の処理系の存在は今のところ確認できていない。

処理系

http://quadium.net/funge/downloads/ からBefunge-93の処理系を入手することができる。

また処理系の実装自体もそれほど難しくないので、あなたのお気に入りの言語で書いてみるのも良いだろう。

Rubyで書いた処理系を http://mono.kmc.gr.jp/~yhara/files/befunge.rb に置いておく。 サンプルが動いたり動かなかったりするみたいなのでshinichiro_hさんのやつ の方を強くお勧めする。

サンプルコード

上のURLからサンプルコードもダウンロードできる(一覧はこちら)。

特に面白いものをいくつか紹介しておく。

リンク

source: Befunge.hd
View on github | Report issue