難解プログラミング言語を整える
中級Befungeを整える。
= 盤面の上を上下左右に走るプログラムを、ポインタの動きごと眺める
Befunge が初めての方は、先に そもそも Befunge とは・何の役に立つのか をどうぞ。
サンプル(クリックでエディタに入れる)
OUTPUT
「実行」を押すと、ここに出力が出ます。
ステップ再生
盤面の上を走るポインタを見る
STACK(上が一番上=次に使われる値)
出力(ステップ再生中の途中経過)
そもそも Befunge とは
上から下へ読むのではなく、盤面の上を動き回りながら実行される言語。
Befunge(ビーフンジ)は、1993年に Chris Pressey が作った言語です。プログラムは文字を並べた2次元の盤面で、実行を担う「ポインタ」が上下左右に進みながら、1マスずつ命令を読んでいきます。矢印の命令で、進む向きを変えられます。
できるだけコンパイル(先にまとめて翻訳)しにくい言語を目指して作られたと言われています。プログラムが実行中に自分自身を書き換えられるため、ふつうの言語のように「上から順に」と決めて翻訳することが難しいからです。ふつうの言語は行ごとに上から下へ読み進めますが、Befunge は同じ場所を何度も通ったり、途中で向きを変えたりできる点が大きく違います。
何の役に立つのか
-
処理の流れを「目で追って」学べる
ポインタが盤面を進む軌跡を見れば、分岐や繰り返しがどう動くかが図のように分かります。
-
実行環境を作る歯ごたえのある練習題材
自己書き換えがあるので、インタプリタを正しく作ること自体が良い練習問題になります。
-
スタック(積み重ね)で計算する考え方に慣れる
値を積んでから取り出して計算する方式は、実際のコンピューター内部の仕組みにも通じる考え方です。
-
パズル・盤面アートとして遊べる
命令を盤面にどう並べるかを考える、図形パズルのような楽しみがあります。
-
話のネタ・研修のアイスブレイクになる
「プログラムが2次元になっている」と知ると、コードは上から下へ、という思い込みがほぐれます。
普通の言語と比べると
- ふつうの言語は左から右・上から下へ読みますが、Befunge は命令で進む向きが変わります。
- 計算はスタックで行います。足し算も、先に2つの数を積んでから足す命令を実行する形です。
- 実行中にプログラム自身のマスを書き換えられます。ふつうは「プログラム」と「データ」を分けて考えるのと対照的です。
上の実行環境でサンプルを動かし、ステップ再生でポインタが盤面を走る様子を眺めてみてください。
早見表
盤面を走りながら読む、という発想。
| 命令 | 意味 |
|---|---|
| 0〜9 | その数字をスタックに積む |
| + - * / | 足す・引く・掛ける・割る(スタック上位2つ) |
| % | 割った余り(0で割ると0にする) |
| ! | 論理否定(0なら1、それ以外は0にする) |
| ` | 比較(下の値 > 上の値 なら1、それ以外は0) |
| > < ^ v | その向き(右・左・上・下)へ進むように変える |
| ? | 上下左右のどれかへ、ランダムに進む向きを変える |
| _ | 値を1つ取り出し、0なら右へ・それ以外なら左へ進む(横方向の分岐) |
| | | 値を1つ取り出し、0なら下へ・それ以外なら上へ進む(縦方向の分岐) |
| " | 文字列モードを切替。次の " までの文字を1文字ずつスタックに積む |
| : | 一番上の値を複製する |
| \ | 上位2つの値を入れ替える |
| $ | 一番上の値を捨てる |
| . | 一番上の値を数値として出力する(後ろに空白がつく) |
| , | 一番上の値を文字として出力する |
| # | 次の1マスを読み飛ばす(橋) |
| p | 盤面の指定マスへ値を書き込む(プログラム自身を書き換えられる) |
| g | 盤面の指定マスの値を読む |
| & ~ | 数値/文字を入力する(このページでは常に「入力なし=0」) |
| @ | プログラムを終了する |
| (空白) | 何もしない |
ふつうの言語は「プログラムは上から下へ、先に全部を機械語へ翻訳してから実行する」のが前提です。Befungeはポインタが盤面上を走りながら1マスずつその場で読むため、
p でプログラム自身のマスを書き換えることもできてしまいます。「1から10まで数える」プリセットは
|(縦方向の分岐)を使って、盤面の外側(下に行けば止まる・上に行けばループして戻る)へ迂回させることでループを作っています。
⚠️ このページのインタプリタは80×25マス固定・ステップ再生には上限(20万ステップ)があり、無限ループでも必ず止まります。
入力命令 & ~ はこのページでは常に「入力なし(0)」として扱います(送信ゼロのため、キーボード等からの入力は受け付けません)。
このツールについて
ふつうのプログラムは上から下へ1行ずつ読みますが、Befungeはコードの上を読みとるポインタが上下左右に走り回ります。矢印にぶつかると向きが変わり、盤面そのものが迷路になる言語です。実行して、盤面とスタックの動きをステップごとに見てみましょう。
コードが平面の上を上下左右に走り回る言語。実行・ステップ再生(盤面のポインタ+向き+スタックを可視化)・3種のプリセット。送信ゼロ。
主な機能
- 実行とステップ再生(ポインタ・向き・スタックの表示)
- 再生/一時停止/1歩/速度スライダー
- Hello World・カウントループ・乱数迷路のプリセット
- 命令の早見表(Befunge-93)
- 入力命令は入力なし(0)の注記・ステップ上限で必ず停止・送信ゼロ
よくある質問
Q. なぜプログラムが盤面を走り回るのですか?
A. 1993年に Chris Pressey 氏が「コンパイルしにくい言語」を目標に作ったためです。「> < ^ v」の矢印にぶつかると進む向きが変わり、盤面そのものが実行経路になります。
Q. 盤面のサイズは何マスですか?
A. 80列×25行(Befunge-93 の仕様)です。それを超える部分は無視され、端まで行くと反対側から出てきます。
Q. 「?」はどんな命令ですか?
A. 上下左右のどれかへランダムに向きを変える命令です。「乱数迷路」のプリセットは実行するたびに出力が変わります。
Q. 入力命令「&」「~」はどうなりますか?
A. このページは送信ゼロで入力を受け付けないため、常に0が積まれた扱いになります。
Q. ステップ再生でスタックはどう見ればよいですか?
A. スタック欄に、いちばん上(次に使われる値)が上に来るように表示されます。数値の増減・比較・出力のたびに変化を追えます。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。