訂正・NOP命令の誕生
目次
IBM 702 の NO OP
そろそろ、IBM 702 の NO OP 命令の話に入りましょう。
マニュアルの説明は、3つの項目に別れています。
第1に「何もせず、次の命令に進む」
第2に「アドレスは意味を持たない」。
第3に「パイロットセレクタのように使用できる」。
1番目と2番目は、あっさり書かれています。上に書いたのが、省略なしにほぼすべて。そして、第3の説明で、非常に長い、図や例示の入った説明が行われています。
その説明の冒頭の一文が「パイロットセレクタのように使用できる」です。
これは、「何もしない命令が非常に便利である」という、当時の常識を超えた概念を説明するために、皆の慣れた技術から類推できるようにして、理解を助けるための一文です。
しかし、当時は当たり前の技術だったとしても、今の我々はパイロットセレクタが何か知りません。まずは、この説明から始めましょう。
IBM がコンピューター事業に乗り出す前の大ヒット商品に、IBM 407 会計機という機械がありました。パンチカードに入力されたデータを、分類し、並び替え、集計することができる機械でした。
IBM 407 では、パンチカードをどのように扱うか、配線によって「プログラム」することができました。
コロンビア大学より引用。
パンチカードは読み取られ、穴が開いていれば、対応する電極に電流が流れるようになっています。そこで、その電流をコード(電線)によって別の電極に流してやります。
装置に対応する電極に電流が流されると、装置が作動します。パンチカードを別の受け皿に送ったり、別の穴から入った信号を数として足し合わせたり…などなど。
これが、IBM 407 の「プログラム」でした。
IBM 407 、というのは、実は「シリーズ」の名前であり、この中にも機種があります。その中でも、高級機種でのみ使えた機能が「パイロットセレクタ」でした。
1つの「パイロットセレクタ」は、4つの電極を持っています。1つはスイッチ。1つは入力。そして、2つは出力でした。
スイッチに入れられた信号により、入力信号は、2つの出力のどちらかに振り分けられます。これを使って、パンチカードにあけられた穴など、特定の条件を見て働く回路を作ることができました。
(条件により、2つの回路を切り替えることもできます)
PU (PickUp : カード読み取り機)からの信号により、C (Common : 入力信号) は、N (Normal) か T (Transfer) に振り分けられます。
スイッチはパンチカードからの信号に限定されているわけではなく、「これまでに集計した数が一定数を超えたら」などでも構いません。
非常に柔軟なプログラムが作れました。
これ、ある種の「条件分岐」でした。IBM 407 はコンピューターではありませんが、プログラム可能で条件分岐も出来たのです。
双子の命令
話を IBM 702 に戻します。
IBM 702 には条件ジャンプ命令とともに「無条件ジャンプ」命令がありました。まぁ、大抵のコンピューターには存在する命令です。
無条件とは、「常に条件が整っている」条件ジャンプだと言い換えられます。つまり、条件ジャンプの一種ではあるが、必ずジャンプするのです。
IBM 702 では、無条件ジャンプは TR という命令でしたので、以下 TR と書きます。(Transfer 、「移動する」の略です)
この逆に、「常に条件が整わない」条件ジャンプがあったらどうなるでしょう?
つまり、その命令は「何も起こさない」命令だということになります。
IBM 702 のマニュアルによれば、NO OP はそのような使用用途を想定した命令でした。
NO OP と TR は、命令コードでいえば上位 2bit が違うだけでした。
そして、先に書いた通り、IBM 702 には、メモリの上位 2bit だけを操作する命令があります。
つまり、TR は簡単な操作で NO OP になり、ジャンプしなくなります。そしてまた、簡単な操作で TR に戻すこともできます。
フローチャートの中央下に、ひし形で SW と書かれた部分がある。
自己書き換えで TR にすれば左側に、NO OP にすれば右側に、と処理を振り分けられる「スイッチ」となっていることがわかる。
IBM 407 会計機は、パイロットセレクタ機能によって、「一定条件の場合だけ動かすプログラム」を作れました。
IBM 702 は TR と NO OP を切り替えることで、「一定条件の場合だけ動かすプログラム」が作れます。
これが、NO OP の説明の3番目、「パイロットセレクタのように使用できる」の意味です。
TR と NO OP の命令コードは、「交換しやすいように」考慮して定められています。
そしてその動作も、これを条件ジャンプの一種とみなすと、正反対です。TR は必ず真、NO OP は必ず偽の条件ジャンプです。
何かをさせるために作られた機械に、「何もしない」なんて命令を作るには、それなりの理由があるはずです。
IBM 702 では、条件ジャンプのバリエーションの一つとして、常に真の「TR」と対になる命令として、常に偽の「NO OP」が着想されたように思います。この二つは双子の命令なのです。
出力は「T」と「N」と呼ばれていました。そして、IBM 702 の対応する命令の頭文字も「T」と「N」です。
もっとも、T は両方とも「Transfer」の意味で同じです。
N は Normal と No operate。これは、狙ったのか偶然なのかわかりませんが、理解を早めるために類似させた可能性はあります。