加算オペランド(Δ)の制御と離散ステップ量の設計
左の部屋(Aフィールド)の数値を変えることが、計算の進行速度やポインタの歩幅をどう変えるか
ADD 命令では、 - A(左の値) が「いくつ足すか(数値)」 - B(右の値) が「どこの箱に足すか(番地)」を表します。
現在、0000 番地は ADD.AB #1, $1 となっており、1つ下の箱(初期値 0)に 1 しか足されません。
🎯 やってみよう 黄色く光っている 0000 番地の A(左の値) を #1 から #5 に書き換えて [STEP] を押し、0001 番地のデータ箱のB値を 5 にしましょう!
1. 「いくつ変化させるか(変化量 Δ)」を司るAフィールド
Step 8では、0000 番地の『ADD.AB #1, $1』の左側の数値(Aフィールド)を『#1』から『#5』へと書き換え、1回のステップで 0001 番地のデータ箱が『0』から一気に『5』へと増えることを確認しました。
数学や物理学では、ある状態から次の状態へ変化するときの「増分(変化量)」をギリシャ文字の $\Delta$(デルタ)で表します。CoreWarの『ADD.AB #Δ, $Target』という命令において、左の部屋(Aフィールド)に書かれた即値『#Δ』は、まさに1クロックサイクルあたりに対象の変数をどれだけ進めるかという「変化の速度(レート)」を決定するパラメータです。
もし A が『#1』であれば、対象の数値は 1 サイクルにつき 1 ずつしか増えません。しかし A を『#5』に変えれば、同じ 1 サイクルという時間コストで 5 倍の量を一気に加算することができます。
Before: ADD.AB #1, $1 ──► 1 Cycle = +1 increment (Slow linear step)
After : ADD.AB #5, $1 ──► 1 Cycle = +5 increment (5x stride in the same 1 cycle!)2. 計算コスト(O(1))の一定性とハードウェア加算器
人間の頭で暗算をするとき、「0 + 1」よりも「347 + 589」のほうが少しだけ時間がかかります。また、指を折って数えるなら、1を足すより5を足すほうが5倍の時間がかかります。しかし、コンピュータのCPU(ALU)にとっては、『#1』を足すのも、『#5』を足すのも、『#392』を足すのも、かかる時間は全く同じ「たった1クロックサイクル」です。
なぜなら、CPU内部の加算器(Adder)は、2進数のすべての桁(ビット)を電子回路で一斉に計算するように設計されているからです。これを計算機科学では「定数時間演算($O(1)$:オーダー・ワン)」と呼びます。
1サイクルという限られた寿命の中で戦うCoreWarにおいて、「1サイクルでどんな数値でも加算できる」という性質は極めて重要です。後ほど学ぶ爆撃機(Dwarf)や索敵機(Scanner)では、このAフィールドの数値を『#4』や『#8』や『#200』にチューニングすることで、1回のループでメモリ空間を何マス飛び越えて攻撃するかを自在にコントロールすることになります。
3. 命令の中の定数(即値)とデータ箱の変数の協調
この2行のプログラム『ADD.AB #5, $1』と『DAT.F #0, #0』を改めて眺めてみましょう。 1行目の『#5』は、命令の中に直接埋め込まれた「定数(Constant:変化しない決まった数)」です。一方、2行目の『DAT』のBフィールドは、計算結果を受け止めて変化する「変数(Variable:書き換わる器)」です。
あらゆるコンピュータ・プログラムは、この「命令側に書かれた定数パラメータ」と「データ側に用意された変数スロット」の組み合わせによって成り立っています。次は、定数(A)はそのままにして、「どの変数箱を狙うか(Bの番地)」を切り替える実験へ進みましょう。
🔒 MISSION CLEAR で講義ノートの全編が解放されます
上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)