「コード=データ」の等価性と自己言及(Self-Reference)の魔法
命令が自分自身の行($0)を「データ」として読み出し、別の場所へ複製する自己書き換えコードの原理
「命令もデータも同じ箱に入っている」ということは、MOV 命令で「命令そのもの」をデータとして別の箱へコピーできる ということです!
現在、0000 番地は MOV.I $1, $1(1つ下のデータ箱を、1つ下へコピー)となっています。 ここでコピー元(A)を $1 から $0(0マス先=今実行している 0000 番地自身!) に変えたらどうなるでしょうか?
🎯 やってみよう 0000 番地の A(左の番地) を $1 から $0 に書き換えて [STEP] を1回押し、0000 番地の MOV 命令そのものが 0001 番地へ複製される瞬間を目撃しましょう!
1. 禁断の相対番地「$0(自分自身)」の参照
Step 14では「データが命令として実行されてしまいクラッシュする」というノイマン型アーキテクチャの『破壊の側面』を見ました。続くこのStep 15では、同じノイマン型の特徴を180度反転させた『創造の側面』——すなわち「命令そのものをデータとして扱い、自分自身のクローンを生み出す」という驚くべき実験を行いました。
0000 番地の『MOV.I $1, $1』のコピー元(Aフィールド)を『$1』から『$0』へと書き換えた瞬間、何が起きたでしょうか? 相対アドレスにおいて、『$1』は「1つ下の箱」、『$-1』は「1つ上の箱」でした。では『$0(0マス先)』とはどこでしょうか? そう、「今まさにこの命令を実行している 0000 番地(自分自身の箱)」です!
[STEP] を1回押した瞬間、0000 番地の『MOV.I $0, $1』は、鏡を見るかのように自分自身の箱を開け、そこに入っている『MOV.I $0, $1』という命令コードを丸ごと読み出し、1つ下の 0001 番地(元々は DAT #0, #99 だった箱)の上へと完璧に転写(クローン複製)したのです!
[0000] MOV.I $0, $1 ──┐ (1. Reads its own cell $0 = "MOV.I $0, $1")
▲ │
└───($0)──────┤
▼ (2. Writes clone into $1 = [0001])
[0001] MOV.I $0, $1 ◄─┘ (Cell 0001 is now an identical executable instruction!)2. 「コード=データ(Code is Data)」の等価性とは何か?
普通のプログラミング言語(たとえばPythonやJavaやC言語)を学んでいるとき、私たちは「プログラムのソースコード(関数や命令)」と「プログラムが処理するデータ(数値や文字列)」を全く別のものとして扱います。C言語で書かれた足し算の命令が、実行中に突然自分自身の機械語を読み取って別のメモリ番地へコピーし始める、といったことはまず目にしません。
しかし、ハードウェア(CPUとRAM)の物理レベルに降りてみれば、命令である『MOV.I $0, $1』も、データである『DAT.F #0, #99』も、どちらも単に「メモリの箱の中に並んだビット列(数値の組)」に過ぎません。 ・プログラムカウンタ(PC)がその箱を指せば、その箱は「コード(命令)」として振る舞う。 ・MOVやADDのオペランド($0など)がその箱を指せば、その箱は「データ(材料)」として振る舞う。
つまり、ノイマン型コンピュータにおいては「ある箱がコードであるかデータであるかは、箱の中身によって決まるのではなく、CPUがその瞬間にどう参照したか(役割)によって決まる」のです。これを計算機科学では『コードとデータの等価性(Code-Data Equivalence / Homoiconicity)』と呼びます。
3. 自己書き換えコードとJITコンパイラへの応用
プログラムが実行中に自分自身の命令を読み書きする技法は「自己書き換えコード(Self-Modifying Code)」や「メタプログラミング(プログラムを生むプログラム)」と呼ばれます。
実はあなたが今このページを見ているWebブラウザ(ChromeやSafariなど)の内部でも、JavaScriptを超高速に動かすための『JIT(Just-In-Time)コンパイラ』が、このStep 15と全く同じことを行っています。ブラウザはJavaScriptを実行しながら、メモリ上に新しい機械語命令を「データ」として動的に書き込み、完成した瞬間にそこへプログラムカウンタをジャンプさせて「命令」として実行しているのです。
そして今、0001 番地に新しい『MOV.I $0, $1』が誕生し、光るプログラムカウンタ(PC)がちょうどその 0001 番地の上に立っています。もしここで、もう1回 [STEP] ボタンを押したら何が起きるでしょうか? 次のStep 16で、歴史的な瞬間を目撃しましょう!
🔒 MISSION CLEAR で講義ノートの全編が解放されます
上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)