再訂正・NOP命令の誕生
目次
自己書き換え
IBM 702 の NOP は、自己書き換えのために作られた命令でした。
SSEC の NOP もまた、自己書き換えのために重要だったのではないかな、と思います。
自己書き換えと言っても、SSEC は基本的にパンチカードで命令を与えます。書き変えられません。
しかし、リレー記憶上に命令を置いて、そこに実行を移すことで「条件分岐」出来るようになっていました。
(実際のプログラム例は前回参照)
この時、SSEC の命令系では、最下位の2桁が「ジャンプ先」に相当していることが重要です。
自己書き換えと言っても、命令そのものではなく、「ジャンプ先」を変えるのが目的でした。
では、ジャンプ先ではない部分にある「命令」は、何もしない必要があります。
ここでも、「何もしない命令」が重要になるのです。
この命令に、わざわざ No Op と名付けたのは、何もしないことが重要だったから、ではないかと思います。
ジャンプ先(次の命令読み込む機器)をに何も指定しないことはできなかったようです。
ジャンプ先は2桁で示し、その2桁の意味は別途プラグボードで指示していました。
このプラグボードには、00~99 のプラグが存在しています。
「00」であったとしても、何も指示しなかったことにはならず、00 に指定された機器から命令を読み込みます。
もしプラグが接続されていなければ、存在しないところから命令を読み込んだ結果、No Opを実行し続けることになるでしょう。
積極的に何もしない
SSEC の No Op は、決して「特に回路が作られていないから何もしない」というようなものではありません。
正しく「何もしない」ことを保証するため、何もしないための回路が作り込まれています。
SSEC では、読み込んだ命令に従って処理を行う回路を決定する機構を、Commutator と呼んでいます。
これ、「整流子」の意味です。流れを正しく整えるもの。
子供の頃にプラモデルから外したマブチモーターを分解したことある人ならわかるでしょう。
モーターなどで、コイルに正しく電気を流し続けるためのブラシ部分。あれが整流子、Commutator です。
以前に出した全体ブロック図ですが、左端中段あたりに「Main Commutator」とあります。ここで命令が解釈される。
そこから左を通って一番下に矢印が伸びていて、左下に、4つの箱で区切られた部分があります。
NO COMM / ACC.C COMM / MYC COMM / DVC COMM とあります。
これが、4種類の命令を意味しています。
「No Op」と、累算、乗算、除算です。
条件停止は累算の結果により停止するため、この時点では累算命令として扱われます。
MYC と DVC には、上向きの矢印が統合され、MD Unit と書かれた箱に入っています。
これ、乗除算回路です。
ACC.C からの上向き矢印は、ACC Unit に入っています。
そして、NO からは矢印が出ていません。
何もしないからです。
とはいえ、これは「演算回路を動かさない」というだけで、NO COMM 回路が何もしないわけではありません。
SSEC はクロックの存在しない非同期回路マシンなので、何もしないと全体が停止してしまうのです。
「処理が終了した」ことを Main Commutator に返し、次の処理を開始するきっかけを与える必要があります。
(左側から上に向かって伸びる矢印が、その信号です)
No Op は「何も指示されないから何もしない」というようなものではなく、何もしない、という動作を行う、積極的に何もしない命令なのです。
もう一台の計算機
マーク1(1944年2月)とSSEC(1948) を調査して、いよいよ NOP 命令の話も決着がついたか…と思っていたら、間に、もう1台の計算機があったようです。
IBM Pluggable Sequence Relay Calculator (PSRC)。1944年12月に完成し、米国陸軍に納入されています。
射表を作るために特別に開発されたもので…ENIAC (1946)と目的は同じですが、先に完成していますね。
マーク1の完成からわずか10か月で完成している…なんてことはおそらくなくて、並行して開発していたのでしょう。
というのも、先に書きましたが、IBM はマーク1を作っている最中に「リレーで計算ができる」というシャノンの論文を知り、マーク1もリレーで作ることを提言した節があるから。
恐らくはマーク1の発案者であるエイケンがそれを許可しなかったのですが、IBM としては陸軍をスポンサーに付け、独自にリレー式の計算機開発を始めたのでしょう。
PSRC は SSEC の元となった機械、とされているようです。
しかし、マーク1や SSEC と違って、データとして命令を与えることはできません。
名前の通り「Pluggable Sequence」…つまり、プラグボードに配線を繋ぐことでプログラムを行います。
ENIAC なんかと同じ形式。
なので、命令も存在しません。
もちろん、NOP 命令もありません。
NOP 命令の調査としては、「存在しない」で終わりです。
興味はあるのですが、現状資料不足すぎて、記事に出来るほどではありません。