難解プログラミング言語を整える
中級Malbolgeを整える。
= 「人間には書けない」よう設計された言語の、既知のプログラムを動かしてレジスタの動きを見る
① 既知のプログラムを実行
Malbolgeは人が書けないため、このページでは検証済みのプリセットのみを用意しています。
RESULT(out命令の出力)
実行するとここに出力が表示されます
レジスタ a(アキュムレータ)
0
レジスタ c(コードポインタ)
0
レジスタ d(データポインタ)
0
ステップ数 / 状態
0
解説
なぜMalbolgeは「人間には書けない」と言われるのか。
Malbolgeは1998年、Ben Olmsteadが発表した言語です(esolangs.org: Malbolge)。名前はダンテ「神曲」の地獄の第八圏(Malebolge)に由来します。世界初のHello Worldプログラムは、人が書いたのではなく、Lisp製の局所ビームサーチ(あり得るプログラムの空間を機械的に探索するプログラム)によって発見されました。
仕組みが難解な最大の理由は2つです。1つめは、メモリ上のある位置に置かれた文字が「その文字コード」ではなく「(その位置+文字コード) % 94」という計算結果で命令が決まること。同じ文字でも置く位置がずれれば別の命令になります。2つめは、命令を1つ実行するたびに、実行した場所の中身が暗号表で自動的に書き換わること(自己書き換え)。プログラムは実行しながら自分自身を変化させ続けるため、事前に「このプログラムはこう動く」と読み解くのが極めて困難です。
| (c+[c])%94 | 名前 | 動き | 意味 |
|---|---|---|---|
| 4 | jmp | C = [D] | Dが指すメモリの値をCへ代入する(ジャンプ) |
| 5 | out | print(A % 256) | Aの値を文字コードとして出力する |
| 23 | in | A = 入力 | 入力を1文字読みAへ(本ページは入力なし=常にEOF扱い) |
| 39 | rotr | A = [D] = rotate_right([D]) | Dが指す値を3進数で右に1桁回転し、その結果をAにも入れる |
| 40 | mov | D = [D] | Dが指すメモリの値をDへ代入する |
| 62 | crz | A = [D] = crazy(A, [D]) | AとDが指す値の「crazy演算」(後述の表)を行い、結果をAにもDが指す先にも入れる |
| 68 | nop | (何もしない) | 何もしない |
| 81 | end | STOP | 実行を停止する |
レジスタは3つ(a=アキュムレータ、c=命令の実行位置、d=データの参照位置)で、メモリは59,049(3の10乗)個の升目、各升目は0〜59,048の10桁の3進数です。8命令のいずれにも当てはまらない値は何もしない命令(NOP)として扱われます。
あわせてエソラング図鑑(Malbolgeの「読み物」としての解説も掲載)やBrainfuckの遊び場もどうぞ。
送信ゼロ(貼り付けたコードはこの端末から出ません)。入力を読む命令(in)はこのページでは常に「入力なし(EOF)」として扱われます。実行はステップ数の上限に達すると自動的に停止します。
このツールについて
Malbolgeは「解読を目的として設計された」言語です。命令は文字そのものではなく (実行位置 + そこに置かれた文字コード) % 94 で決まり、しかも実行のたびに実行した命令自身を暗号表で書き換えます。同じ文字でも位置が変われば意味が変わるため、人間が新規にプログラムを書くのは事実上不可能で、実在するプログラムはビームサーチなどの探索やツールで発見・生成されたものです。このページは実行専用(生成機能はありません)。
世界初の Hello World は人間ではなく探索プログラムが発見した、というエピソードで有名な言語。既知の正しいプログラムを動かして、a/c/d レジスタとステップ数の推移を見られます(新規作成の機能はありません)。
主な機能
- 既知の Hello World 2種をプリセット実行
- 1ステップ実行でレジスタ(a/c/d)を確認
- 自己書き換え・crazy 演算を仕様どおりに実装
- 実行専用(生成なし)・送信ゼロ
よくある質問
Q. なぜ Malbolge は人間に書けないと言われるのですか?
A. 命令が文字そのものではなく「(実行位置+文字コード)÷94 の余り」で決まることと、命令を実行するたびにその場所の中身が暗号表で書き換わる(自己書き換え)ことの2点が理由です。同じ文字でも位置がずれれば別の命令になり、実行しながら自分自身が変化し続けます。
Q. 世界初の Hello World は誰が書いたのですか?
A. 人が直接書いたのではなく、Lisp で書かれた局所ビームサーチ(あり得るプログラムの空間を機械的に探索するプログラム)が発見しました。このページのプリセットにその元祖プログラムを収録しています。
Q. なぜこのページには新規作成の機能が無いのですか?
A. 自己書き換えと位置依存の命令のため、狙った動作を人が予測して書くことが事実上不可能だからです。実在するプログラムのほぼすべてが探索や専用ツールで発見・生成されたものです。
Q. レジスタ a・c・d は何をしていますか?
A. a は計算用の値を1つ持つアキュムレータ、c は今実行している命令の位置、d は読み書き対象のデータの位置です。いずれも0〜59,048の10桁3進数です。
Q. 入力を使うプログラムは動きますか?
A. 動きません。このページは入力欄を持たないため、入力命令は常に「入力なし」として扱われます。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。