Befunge は難解プログラミング言語の一つ。手続き型、スタック型で、自己変更的な言語である。実用言語ではない難解プログラミング言語のひとつ。
この言語のプログラムの命令は一次元の列ではなく二次元の格子上に並んでいて、実行する向きを上下左右に変更できる。この言語の任意の1命令は、ソースコード中で1文字で表現される。したがって、ソースコード中の行と桁がプログラムの格子の位置に対応する。
1993 年、Chris Pressey が「コンパイルが困難な言語」として作った。Befunge-93 はプログラムのサイズが 80 桁 25 行に固定されている。Befunge-93 の拡張 (一般化) である Funge-98 にはこの制限は無く、チューリング完全である。さらに Funge-98 には任意次元への拡張やマルチスレッド対応等が含まれている。
v @_ v >0"!dlroW"v v :# < >" ,olleH" v ^ <
5 100p:v v *g00:_00g.@ >00p1-:^
- プログラムの実行は、格子の左上から右向きに開始する。
- 格子の上端は 0 行目、左端は 0 桁目である。
- 端に達したら反対側の端へジャンプする。
- 整数を要素とするスタックがただ一つ存在する。このスタックは、命令に引数を渡したり、命令の結果を受け取ったりするのに使われる。
文字 | 意味 |
< | 実行の向きを左にする |
> | 実行の向きを右にする |
^ | 実行の向きを上にする |
v | 実行の向きを下にする |
_ | スタックをポップして、その値が0ならば実行の向きを右に、そうでなければ左にする |
| | スタックをポップして、その値が0ならば実行の向きを下に、そうでなければ上にする |
? | 実行の向きを上下左右のいずれかにランダムで変更する。 |
(空白) | 何もしない |
# | 次の文字が表す命令を実行しない |
@ | プログラムの実行を停止する |
文字 | 意味 |
0 -9 | 数値をスタックにプッシュする |
" | 次に" が出現するまで、文字の命令を実行する代わりに文字のASCIIコードをスタックにプッシュする |
文字 | 意味 |
& | ユーザに数値を入力させ、その値をスタックにプッシュする |
~ | ユーザに1文字入力させ、その文字のASCIIコードをスタックにプッシュする |
. | スタックをポップして、その値を十進表示し、続けて半角スペースを出力する |
, | スタックをポップして、その値をASCIIコードに持つ文字を表示する |
以下、「スタックから y, x をポップする」と書いた場合、「スタックをポップし、その値を y とする。その後で再度スタックをポップし、その値を x とする。」を意味する。
文字 | 意味 |
+ | スタックから y, x をポップして、x + y の値をプッシュする |
- | スタックから y, x をポップして、x - y の値をプッシュする |
* | スタックから y, x をポップして、x × y の値をプッシュする |
/ | スタックから y, x をポップして、x / y の値をプッシュする |
% | スタックから y, x をポップして、x を y で割ったときの余りをプッシュする |
` | スタックから y, x をポップして、x > y ならば 1 を、そうでなければ 0 をプッシュする |
! | スタックをポップして、その値が 0 ならば 1 を、そうでなければ 0 をプッシュする |
文字 | 意味 |
: | スタックをポップして、その値を2回プッシュする |
\ | スタックから y, x をポップして y をプッシュし、その後 x をプッシュする |
$ | スタックをポップして、その値を使用しない |
文字 | 意味 |
g | スタックから y, x をポップして、プログラムの y 行 x 桁目の文字のASCIIコードをスタックにプッシュする |
p | スタックから y, x, v をポップして、プログラムの y 行 x 桁目を、v をASCIIコードに持つ文字に書き換える |