Befungeのインタプリタ
世の中には星の数ほどプログラミング言語があります。
ほとんどの言語は、できるだけ使いやすく、読みやすく、実行が早くなるように、
ユーザに優しく設計されてるのですが、ごく一部そうでないものがあります。
Brainf*ck、Whitespace、そしてBefungeといった言語が、「異端児」の代表格です。
Brainf*ckは、一次元のbyte型配列と、その上を動くポインタだけで構成された言語で、
ポインタの移動と、ポインタが指す値の増減のみが定義されています。
Brainf*ckで Hello World プログラムを作成すると、こんな風になるそうです。
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-. ------------.<++++++++.--------.+++.------.--------.>+.
魚の骨?
並んだ+や-は、ポインタの指す値を増減させています。これらを組み合わせて、「Hello World!」を構成するアルファベット(のASCIIコード)を作っているわけです。
Whitespaceは、名前のまんまです。
(中略)
「 」(半角スペース)と、「 」(タブ)と、改行コードの3つを組み合わせた符牒を並べて、プログラムを書いていく言語です。見た目は何が書いてあるのかさっぱりですね。ただ、考え方は上のBrainf*ckと似ています。プログラミングに最低限必要な部品を、どういう記号で表すことにしたか。それがまったく違うので、プログラムの外見が著しく異なるわけです。
そして、Befunge。
v >v"Hello world!"0< ,: ^_25*,@
前の二つよりは、まだ何となく言語っぽい感じがします。
何より、ちゃんと言語の中に「Hello world!」って入ってますしね。
でもよく見ると、Hello worldの部分以外、点やら記号やらで意味不明です。
「>v」で、画面に文字を表示しろって命令になるのかな?
はずれです。
実は、Befungeは、2次元平面上をポインタが上下左右に動き回る言語です。
ポインタは最初、左上にあって、右方向に1文字ずつ動いていきます。
ポインタが動いた場所にある文字を読み込んで、文字に対応する命令を実行します。
例えば、「v」があったら、ポインタはそこから下に動き始めます。「<」なら左です。
最後、「@」にたどりついたところで、プログラムの実行は終了します。
通常のプログラミング言語は横書きですが、Befungeは横書き縦書き入り交じり、場合によっては右からとか下からとか読まなければいけないこともあります。まるで、迷路の中を歩き回ってるようです。
比較的小さいコードでも、紙の上で追っていくだけではなかなか動作を把握することができません。
なので、インタプリタを作ってみました。
赤字が、現在のポインタ位置です。スタックと出力の青字は、ASCIIコード0〜15を表しています。
先生! なにやってるんですか!
コードはAYAで書いてます。AYA最強伝説。
バルーン上で、ポインタがちょこまかと動き回って、リアルタイムにスタックの内容と出力を確かめられるようになっています。ちょっと大きいプログラムを動かしただけで相当時間がかかるけど、実行結果を見てるだけでなかなか楽しい。*1
問題は、Befungeが激ムズすぎてプログラム書けない点ですかね。
ぎゃぼー。