訂正・NOP命令の誕生
目次
自己書き換えの必要性
条件ジャンプがあるのなら、そんなややこしいことをしなくてもいいのでは? そう思う方もいるかと思います。
でも、条件判定は遅いのです。長い繰り返しの間ずっと同じ条件の場合、繰り返しの「外で」一度だけ条件を判定して、プログラムを書き変えたほうが効率がよくなります。
アドレス部分を書き変えればいいのでは? という意見もあるでしょう。実際、Whirlwind I ではそのようなプログラムをよく見ました。
ここで重要なのは、当時はまだハンドアセンブル(人間が、プログラムを機械語コードに変換する)の時代だった、ということです。
何か理由があってプログラムを移動しなくてはならない場合、アドレスの付けかえを、間違いなく「手作業で」行わなくてはなりません。
この時、数値データの中に混ざって書き変え用のアドレスが入っていると、プログラムの動作を綿密に追いながら、どのデータを書き変えるべきかを調べる…という、非常に厄介な作業が始まります。
いや、そもそも、そのプログラムは「どこかが急に書き変わる」のが前提です。動作を追うことすら難しい状態。
そして、もしアドレスの書き換えを忘れたら、プログラムは動かなくなります。大きなプログラムでは、いつそのデータが使われるかもわからず、動いているように見えても潜在的なバグが残っているかもしれない…。プログラマにとっては不安極まりない状態です。
では、IBM 702 方式を考えてみましょう。むやみやたらにプログラムが書き変えられることは無く、ただ、TR と NO OP は交換されることがあるかもしれない、と判っています。
これなら、アドレスを見つけ出すのも簡単ですし、動作を追うのもそれほど難しくありません。
IBM が 701 以前に作った SSEC というマシンは、機械部分・リレー部分・真空管部分が同居している複雑な機械で、プログラムは基本的に紙テープで与えられました。
プログラムを示した「紙テープ」には、1命令ごとに、次の命令を読み込むデバイスを指定する部分があります。通常は、当然のことながら紙テープを指示します。
しかし、ここに「内部メモリ」を指定すると、わずかなデータ用メモリに制御を移すことができました。
紙テープは順送りしかできないため、ニュートン法のような「繰り返して計算する」アルゴリズムが使えません。
内部メモリにプログラムを奥のは、こうした繰り返し計算に対応するために設計された方法で、メモリにプログラムを置けるからと言って「プログラム内蔵型」ではありません。
内部メモリは、基本的にはデータ用なので書き換え可能です。そこで、繰り返しが必要な計算が終わった際には、メモリ内の「次の命令」を支持する部分を書き変え、紙テープに制御を戻します。
この方法は特許書面にも明記されており、「プログラムの自己書き換え」を最初から考慮して SSEC が設計されていたことがわかります。
但し…SSEC のプログラムは、複雑極まりないものでした。1命令ごとに、40桁の数字を指定する必要があります。
(プログラム指定用の紙テープ装置は2台ありました)
機械的な動作部分も多く、3分に1回は停止した、とも言われ、停止した際には実行中のプログラムの内容を理解している人間が調整し、再開しなくては、結果がおかしくなりました。
ということは、IBM の技術者は誰よりも先に自己書き換えするプログラムをつくっています。その難しさも熟知しているでしょうし、簡便にする方法がないか、誰よりも長く考えているはずです。
その経験から出てきたアイディアが、IBM 702 の NO OP だったのではないか、と思っています。
NO OP から NOP へ
さて、IBM 701 / 702 / 650 とも、命令が NO OP です。NOP の3文字ではないどころか、1単語ですらありません。
当時は、機械語でプログラムを作成しました。まだ FORTRAN などのプログラム言語が生まれる前です。
NO OP のように、人間にわかる命令を「ニーモニック」と呼びます。ニーモニックを、機械がわかるコードに変換する作業を「アセンブル」と呼びます。
IBM 701 / 702 / 650 の時代は、人間がアセンブルを行っていました。先にも書きましたが、これをハンド・アセンブルと呼びます。
しかし、徐々に技術が進み、コンピューター自身がアセンブルを行う、「自動アセンブラ」が実現します。
自動アセンブラを作るには、コンピューターが命令を識別しやすいようにする工夫も必要です。
命令は必ず1単語にする、というのは基本的なことなのですが、すべての命令の文字数をそろえる、というのも、初期の頃には良く行われました。
IBM 701 の後継機(互換性は無い)の IBM 704 には、アセンブラが用意されました。この際、ニーモニックはすべて3文字に統一されます。
この時点で、命令は NO OP ではなく、NOP に変化します。そのため、IBM 704 では NOP 命令、となっています。
TX-0 の NOP
以下は余談になりますが、以前に「多分 TX-0 が最初」と書いた、TX-0 と IBM の関係について。
MIT には、IBM 704 コンピューターがありました。また、IBM 704 は、周辺機器として IBM 407 を使用できましたが、こちらも MIT にはありました。
名著「ハッカーズ」に登場する最初期のハッカーたちは、 IBM 407 で(無許可で勝手に)遊んでいます。
一方で、高価な 704 は厳重に管理され、当初は遊ぶ方法はありませんでした。
しかし、ハッカーたちは後には「授業の一環として」IBM 704 のプログラムの作成などを許可されます。どうも FORTRAN などを使っていたようです。
この際も、IBM 704 は IBM から派遣されたエンジニアによって操作され、パンチカードの束を渡して実行を頼み、後で計算結果を受け取ることしかできませんでした。
ただ、普通の学生ならともかく、ハッカーたちがそれで満足していたかな…といえば、疑問があります。
FORTRAN プログラム以外の実行が許可されなかったとしても、マニュアルを借りて読むくらいのことはできたでしょう。
そして、マニュアルには機械語命令コードの詳細も記述されていました。もちろん、NOP 命令もあります。
ただし、704 のマニュアルは、702 のmanualと違ってNOP の詳細な使い方の解説はありません。
「何もしない命令」なんてものがなぜ搭載されているのか、頭は良くとも経験の浅い若者ハッカーたちが、存在意義をすぐに理解できたかはわかりません。
さて、話は変わります。
TX-0 は MIT で作成された Whirlwind I を元にした機械です。
完成は 1956 年ですが、ハッカーたちの元に届けられたのは 1959年。すぐに改造計画が持ち上がり、NOP 命令が追加されるのは 1960年です。
先に書いたように、NOP が追加された理由は、「何もしないことを保証する必要があったから」でしょう。
今回の調査までは、この必要性が NOP を生み出したのだと思っていました。
しかし、おそらくは何もしないことの保証が必要になった際に、IBM 704 に「何もしない命令」があったのを、誰かが思い出したのでしょうね。
ここに NOP という名前が付けられたのは、IBM 704 の NOP から貰ったのだと思います。