COREWAR

/
Step 15: 自分自身の命令をコピーする(コード=データ)
🎯自己複製で 0001番地の命令を MOV にする(0/1)

ミッション一覧 (全30ステップ)

第1章:画面とメモリの基本 (1-6)
BASIC★☆☆
Step 1: 時間を進める「STEP」ボタン
🔒
BASIC★☆☆
Step 2: プロセスの停止と「RESET」での復旧
🔒
BASIC★☆☆
Step 3: 「編集できる状態」と「実行中の状態」EDIT
🔒
BASIC★☆☆
Step 4: メモリの箱の3つの部屋(右の部屋 B を変える)EDIT
🔒
BASIC★☆☆
Step 5: 左の部屋(A)と右の部屋(B)を書き換えるEDIT
🔒
BASIC★☆☆
Step 6: 「数値(#)」と「番地($)」の記号の違いEDIT
第2章:代表的な命令とループ (7-13)
🔒
ARITHMETIC★☆☆
Step 7: 足し算の命令「ADD」の観察
🔒
ARITHMETIC★☆☆
Step 8: 足す「数値(A)」を変えてみようEDIT
🔒
ARITHMETIC★☆☆
Step 9: 足す「相手の場所(B)」を変えてみようEDIT
🔒
ARITHMETIC★☆☆
Step 10: 引き算の命令「SUB」を使ってみようEDIT
🔒
BASIC★☆☆
Step 11: 箱を丸ごとコピーする命令「MOV」EDIT
🔒
CONTROL★☆☆
Step 12: 時間を巻き戻すジャンプ命令「JMP」EDIT
🔒
CONTROL★☆☆
Step 13: 簡単なプログラムを作ろう(自動カウンター)EDIT
第3章:ノイマン型とデジタル生命 (14-18)
🔒
BASIC★☆☆
Step 14: なぜ「DAT」が爆弾になるのか?EDIT
🔒
BASIC★☆☆
Step 15: 自分自身の命令をコピーする(コード=データ)EDIT
🔒
BASIC★☆☆
Step 16: お手本観察:最古の生命体「Imp」をSTEP実行する
🔒
BASIC★☆☆
Step 17: Impの簡単な変更(コピー先の観察と実験)EDIT
🔒
ARITHMETIC★★☆
Step 18: 間接参照(@ポインタ)の仕組みを知るEDIT
第4章:伝統的アルゴリズム (19-24)
🔒
STRATEGY★★☆
Step 19: お手本観察:爆撃機「Dwarf」をSTEP実行で解剖する
🔒
STRATEGY★★☆
Step 20: Dwarfの簡単な変更(爆弾の間隔を変える)EDIT
🔒
STRATEGY★★☆
Step 21: 実戦デビュー:爆弾の間隔を調整して標的を破壊せよEDIT
🔒
CONTROL★★☆
Step 22: お手本観察:分裂命令「SPL」と増殖の仕組み
🔒
CONTROL★★☆
Step 23: お手本観察:条件比較命令「SEQ / CMP」で敵を探すEDIT
🔒
STRATEGY★★☆
Step 24: お手本観察と変更:防衛罠「Imp-Gate」でImpを止めろEDIT
第5章:実戦改造と総合演習 (25-30)
🔒
STRATEGY★★☆
Step 25: 【Stone(石)】高速爆撃機の観察とステップ幅の改造EDIT
🔒
STRATEGY★★☆
Step 26: 【Paper(紙)】自己複製スウォーム「Mice」を観察する
🔒
STRATEGY★★★
Step 27: 【Paperの改造】クローン投下距離を変更して増殖せよEDIT
🔒
STRATEGY★★☆
Step 28: 【Scissors(鋏)】索敵スキャナーの観察とスキャン間隔の改造EDIT
🔒
STRATEGY★★★
Step 29: 【Trap(罠)】敵の魂を誘拐する「Vampire」の観察と改造EDIT
🔒
STRATEGY★★★
Step 30: 卒業試験:愛機のチューニングと総合バトルEDIT
🟢 編集モード(セルをクリックして変更できます)
[番地][命令 (Opcode)][A (左の値)][B (右の値)]
📦 データ領域 / 爆弾 (DAT)
0000
▼MOV
#
$
👈 ここを変更
0001
▼MOV
<
<
0002
↺JMN
$
$
0003
❖SPL
@
#
0004
+ADD
#
$
0005
↺JMP
$
$
0006
■DAT
$0
$0
++ 命令を追加
0007
■DAT
$0
$0
0008
■DAT
$0
$0
0009
■DAT
$0
$0
0010
■DAT
$0
$0
0011
■DAT
$0
$0
0012
■DAT
$0
$0
0013
■DAT
$0
$0
0014
■DAT
$0
$0
0015
■DAT
$0
$0
0016
■DAT
$0
$0
0017
■DAT
$0
$0
0018
■DAT
$0
$0
0019
■DAT
$0
$0
0020
■DAT
$0
$0
0021
■DAT
$0
$0
0022
■DAT
$0
$0
0023
■DAT
$0
$0
0024
■DAT
$0
$0
0025
■DAT
$0
$0
0026
■DAT
$0
$0
0027
■DAT
$0
$0
🏟️ARENA (20 ROWS)SCOPE: 0000 - 0019
[メモリ空間 800番地 (20行 × 40列)]左のエディタと1対1で同期
TASKS: 0
CYC: 0
📖 講義ノート // STEP 15 OF 30第3章:ノイマン型の覚醒とデジタル生命の原理⏱ 読了目安:約5分
📖 講義ノート:この実験で起きているコンピュータ科学と人工生命の原理

「コード=データ」の等価性と自己言及(Self-Reference)の魔法

命令が自分自身の行($0)を「データ」として読み出し、別の場所へ複製する自己書き換えコードの原理

#Code = Data (Homoiconicity)#Self-Reference ($0)#Self-Modifying Code#Quine#Instruction Cloning
🔬Step 15: 自分自身の命令をコピーする(コード=データ)

「命令もデータも同じ箱に入っている」ということは、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 で講義ノートの全編が解放されます

上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)