NOP 命令の誕生
さて、TX-0 の話題も、これで最後にしましょう。
前回の「拡張後のTX-0の命令」で、opr命令の拡張は「最初は互換性を保ったまま拡張が行われた」と書きました。
まだそのことを書いていません。
また、拡張後のビットフィールドを、初期と同じ形で記述しました。
実は、拡張案の決定文書以降は、違う形式が取られています。しかし、その書き方は使いませんでした。
これは、初期と比較しやすいように…ということもあるのですが、今回書こうと思っている核心部分がばれてしまうのを防ぐため。
今回は、世界で最初の NOP 命令についてです。
TX-0 が NOP の最初ではない、という情報が寄せられました。
TX-0 が最初である、という点に関し、このページの記述は誤りでした。
最初に記述されたのは IBM 701 のマニュアル。しかし、考案したのは先に開発が開始され、後で発売された IBM 702 のようです。
IBM 702 では、明確な目的を持って NOP が設計されています。
詳細は別記事にまとめてあります。
TX-0 が最初である、という記述は誤りですが、他の記述が間違っているわけではありません。
資料性の高い内容もあるためページはそのまま公開を続けます。
目次
NOP命令と都市伝説
実は、Whirlwind (WWI) の記事を書く際に、WWI - TX-0 - PDP-1 と続く系譜を調査していました。
その際、PDP-1 の命令セットを調べていて見つけたのが「NOP命令と都市伝説」という記事。
念のために解説すれば、NOP とは「何もしない」と言う意味のコンピューター命令です。
計算するために作られたコンピューターに、なぜ「何もしない」なんて無駄な命令があるのか?
詳細はリンク先を見てもらうとして、上述したページでは、NOP がなぜ生まれたのか、に関する根も葉もない話…「都市伝説」を取り上げ、誤っていることを解説しています。
(僕はこれらの話を聞いたことはなかったのですが、そういうことをいう人がいそうだ、というのはわかる気がします)
そして、最初の NOP がいつ生まれたのか、という調査結果と、なぜ生まれたのかの推察を書いています。
ここでは「NOP」は、「何もしない命令」とは違うことになっています。
何もしないだけなら、EDSAC の X 命令があるそうで、あくまでも調べる対象は「NOP」と名付けられた「何もしない命令」である、とのこと。
ここでは、最初の搭載は 1960年11月完成の PDP-1 、理由はインストラクションデコーダ(命令を解釈する回路)の設計上の理由により自然発生、としています。
しかし、著者の方はこれを「自分の調査範囲でわかったこと」と断ったうえで、さらなる情報提供を求めています。
…というわけで、今回は情報提供のために記事をまとめます。
再検証
著者の方を疑うわけではありませんが、一応再検証しておきます。
EDSAC の「何もしない」命令
著者の方は、EDSAC に「何もしない命令があった」が、これは NOP とは呼ばれていなかった、として「最初の NOPではない」と考えています。
EDSAC の命令は過去に見たことあったけど、「何もしない命令」になんて注目していませんでした。改めて調べます。
探してみると、EDSAC の命令コード一覧は、EDSAC Simulator のチュートリアルにありました。
EDSAC はアルファベット1文字で命令を表します。上記チュートリアルによれば、X は No operation です。
そして、「使っていないアルファベット」は他にもあるにもかかわらず、X だけが No operation と明記されているのです。
つまり、「未実装」だったから何もしないのではなく、何らかの意図があってわざわざ「何もしない」命令を作っている、と言うことになります。
ただし、このチュートリアルが書かれたのは 2001 年ですから、「No operation」というのは NOP 命令を知っている人間の書いた説明です。EDSAC 開発当時の資料がないと、鵜呑みにはできません。
何もしない命令は、当時どのように説明されていたのか? 裏を取る必要があります。
探せば、他にも EDSAC の命令コード一覧を載せているページは見つかります。
しかし、それらのページのほぼすべてで、上の Simulator の存在に触れています。
つまり、これらのページは上記チュートリアルを元に書かれた内容であり、検討に値しません。
いろいろなページを探し回り、やっと1950年の雑誌の記事の中に「EDSAC 開発当時の」命令コード表を見つけました。
なんということ!
この命令コード表には、X なんて命令は載っていません。
「何もしない命令」を意図して作ったのであれば、載っていて当然なのに。
…いや、もしかしたら開発者が意図して作った命令を、記事を書いた人が「何もしないのなら、わざわざ命令表に入れる必要ないじゃないか」と削除してしまった可能性もあります。
そう思って記事を書いた人の署名を見ると、M. V. Wilkes とあります。これ、EDSAC の開発者です。
なんということ!
つまり、開発者は「何もしない」なんて命令は作っていません。
最初はなかった X 命令を後から追加した、という可能性も考えたのですが、EDSAC Simulator のチュートリアルには「1949年の命令セット」と書かれています。
先ほどの命令コード表が 1950年に書かれたものですから、「後から X を追加した」のでもありません。
ところで、この X 命令の「追加」位置ですが、おかしいです。
命令が X Y Z …と並んでいて、何もおかしそうには見えませんが、この命令表は「アルファベット順」ではなく、「機能別」にまとめられています。
EDSAC は計算機ですから、計算に必要なものから順に書かれています。Y は計算上「必須」ではないが、工学的には計算を行うのに必要とされる「桁あふれの処理」をする命令。そして Z は純粋に工学的な「計算機の停止」命令です。
もし「何もしない」命令を入れるなら、Y よりも後のはずです。何もしない命令は、工学的な必要があって作られていたとしても、数学的には不要なのですから。
確定的なことは言えませんが、X 命令の記述は、何かがおかしいです。
EDSAC Simulator のチュートリアルには、最後に参考文献が並んでいます。
残念ながら、すべてが 1980年以降に発行された本です。すでに NOP 命令が一般化してから書かれた資料です。
一応、1950年当時の本の再版もありますが、それだって「再版」なのです。手が加えられた可能性を排除できません。
開発に関係していた誰かが、未実装であった X 命令を「実は NOPだった」と言い出して手を加えていたとしても、誰も疑問には思わないでしょうし、すでに検証もできなかったでしょう。
今のところ見つかっている、一番信用できそうな資料は、1950年に書かれた開発者本人による解説です。そして、そこには X 命令は書かれていません。
となると、EDSAC に何もしない命令は存在していなかったか、もしあっても重要だとは思っていなかった、と捉えるのが妥当なように思います。
次ページ: PDP-1 の NOP 命令
(ページ作成 2013-06-27)
(最終更新 2014-07-06)