訂正・NOP命令の誕生
目次
調査済みの歴史
今回取り上げなかった部分も含め、現状で調査済みのことをまとめておきます。
NOP のあり・無しの欄は、根拠となる資料へリンクします。
コンピューター名は、僕が記事を書いている場合、その記事へリンクします。
このまとめに乗っていないコンピューターは僕は存在すら気づいていません。気づいたら教えてください。
未調査、となっているものは資料不足です。こちらも、どなたか資料を知っていましたら教えてください。
2015.5.19追記 2015.6.19修正
当初、気になりながら資料不足だった IBM SSEC (702 より古い機械)の命令表を見つけ、NOP の存在を確認しました。
SSEC の詳細はIBM SSECのページにまとめます。また、NOP に関しては再訂正・NOP命令の誕生にまとめています。
以下の年表は、SSEC も含め、現時点で調査済みの一覧です。
機械名 | 年 | NOP | 付記 |
---|---|---|---|
Zuse Z3 | 1941 | 無し | パンチテープによりプログラム可能な、2進法リレー計算機。 世界初のプログラム可能計算機とされる。 |
IBM ASCC | 1944 | 無し | 歯車式計算機。Harvard mark I とも呼ばれる。 IBMが初めてつくった、ソフトウェア作成可能な自動計算機。 プログラム内蔵式ではないが、紙テープに機械語コードでプログラムできた。 |
IBM PSRC | 1944 | 無し | IBM ASCC の経験をもとに作られた、リレー計算機。ASCC より高速。 プログラムは可能だが、配線によって行った。機械語が無いので NOP もない。 |
ENIAC | 1946 | 無し | プログラム内蔵式ではなく、配線によってプログラム。機械語がないので NOP も無い。 1948年にプログラム内蔵型に改造されているが、NOPは無い。 |
IBM SSEC | 1948 | あり | ASCC / PSRC の経験をもとに作られた真空管計算機。紙テープでプログラム可能だが、メモリに命令を置けた。 メモリ上の命令を自己書き換えすることにより、条件分岐可能だった。 IBM 公式には計算機。コンピューターではない。 |
The Baby | 1948 | 無し | Manchester Mark 1 のプロトタイプ。 |
Manchester Mark 1 | 1949 | 未調査 | 機械語コード不明で NOP 未調査。 しかし、この後作られる量産機には NOP は無い。 |
EDSAC | 1949 | 無し? | プログラム内蔵式。NOP 相当の「何もしない」命令があったとされている。 しかし、リンク先にあるように、後世の捏造の可能性大。 |
BINAC | 1949 | 無し | ENIAC 設計者による、世界初の商用マシン。(もっとも、量産されなかった) |
CISRAC | 1949 | 無し | 世界初の電子音楽を奏でたオーストラリアのマシン。 |
UNIVAC 1101 | 1950 | 無し | UNIVAC 社の作った最初のコンピューター。事実上世界初の商用マシン。 |
EDVAC | 1951 | 無し | ENIAC プロジェクトが作った後継機(設計者は途中離脱)。 |
UNIVAC I | 1951 | 無し | ENIAC 設計者による商用マシン。大統領選の結果を予想したマシンとして有名。 |
Ferranti Mark 1 | 1951 | 無し | Manchester Mark 1 の量産機。 |
Whirlwind I | 1951 | 無し | 現代的な最初のコンピューター。 |
IBM 701 | 1952 | あり | IBM 702 より後に開発が始まり、先に発売。 NO OP が存在するが、なぜかマニュアルに詳細がない。 |
IBM 702 | 1953 | あり | NO OP が存在するだけでなく、利用意図まで明確。 マニュアルも非常に詳細。 |
IBM 650 | 1954 | あり | NO OP が存在するが、マニュアル上は「何もしない」と書かれているのみ。 |
IBM 704 | 1954 | あり | IBM 701 の後継機。互換性は無い。 NOP 命令が存在する。 |
TX-0 | 1956 | あり | トランジスタ式。Whirlwind I を元にしている。 当初から「何もしない」命令はあったが、特に名前は付いていなかった。 (重要と考えてなかった) 1960年の改造時に NOP と名付け、今後も何もしないことを保証。 今回の調査以前は、この NOP が歴上最初と思っていました。 |
PDP-1 | 1960 | あり | TX-0を元にして改良・拡張した量産機。 当初から「何もしない」命令はあったが、特に名前は付いていなかった。 TX-0がNOPを「保障」したのを受け、1961年マニュアルにNOPを記載。 先行研究では、PDP-1が最初とされていました。 |
現在の NOP
PDP-1 に受け継がれた NOP は、PDP-8 / PDP-11 にも受け継がれます。
PDP-8 を参考に、初期の1チップ CPU である、Intel 4004 や Mos 6502 が作られます。また、PDP-11 を参考に、Motorola 6800 が作られます。
このため、8bit 時代のパソコン CPU には当然のように NOP がありました。
一方、IBM の POWER アーキテクチャに端を発し、1990年代から流行した RISC 命令セットには、NOP がないものが多いようです。
RISC とはもともと、CPU に「なくてもよい」命令を徹底して排除し、CPU の回路を簡素にし、駆動速度を上げることが目的でした。
NOP は不要なものの筆頭として削除されたのでしょう。POWER はもちろん、PowerPC 、SPARC、ARM、MIPS …などなど、みな NOP を持っていません。
今回の調査で驚いたのは、RISC ではない Intel の 8086 にも NOP がなかったという事実。8080 や Z80 にあったから、当然 8086 にもあると思ってた!
ただし、いずれの CPU でも、アセンブラ上では NOP が使えます。NOP を指示すると、「最小の命令サイズ」「最小の実行時間」で「何も影響がない」命令が埋め込まれます。
レジスタに 0 を足す、レジスタを 0回 シフトする、同じレジスタに対して内容をコピーする…などが良く使われるようです。
8086 の場合、XCHG EAX,EAX (EAX レジスタの内容と、EAX レジスタの内容を交換する)が使われるそうです。
ただ、これまた余談ですが、近年の Intel プロセッサではこの命令は実行を阻害して「遅く」してしまう作用があり、何もしないわけではないそうな…
上記は今回の調査で知ったこと。
8086 でアセンブラはやったのだけど、NOP と書けるからあるのだと思っていたよ…
SH-2 でアセンブラやったけど、RISC なのに NOP 命令持ってるよ…
ちなみに、ARM は各種命令セットがありますが、中には NOP を持つセットもあります。
(32bit-Thumb2 セットと、64bit-AArch64 セットには NOP があるのだとか)
まとめ
最初に書いた通り、前回記事に書いた「TX-0 が NOP の最初」は間違っていました。申し訳ありません。
(申し訳ないとは思いますが、今後も方針は変えずに記事を書き続けます)
現時点のまとめとしては、世界で最初に NOP が搭載されたマシンは IBM 701 。
ただし、登場順では後だが、開発は先に始まっていた IBM 702 の開発チームが考案したものと思われます。
NOP 導入の理由は、「常に真」の条件分岐(無条件分岐)に対し、「常に偽」の条件分岐(つまり「なにもしない」)があると、自己書き換えプログラムを作るうえで便利だったから。
NOP は「何もしない命令」ではなくて「分岐しない分岐命令」だったのですね。
勘違いしないでほしいのは、前回書いた TX-0 の NOP 導入の理由は、TX-0 に関して言えば間違っていないということです。
世界初と書いたことが誤りだっただけで、記事内容全てが間違えているわけではない。
一度書いたことに対して負け惜しみを言っているわけではなくて、歴史上、様々な理由で「世界初」があるのは当然だと思っています。
IBM 702 と TX-0 は、それぞれ別の理由で「何もない命令」を作る必要があった。それぞれの工夫は素晴らしいもので、TX-0 が後だから真似しただけ、ということではないように思うのです。
2014. 7. 8 ENIAC の命令一覧発見、NOPがないことを確認。
2015. 5.12 Z3 の命令一覧発見、NOPがないことを確認。
2015. 5.19 SSEC の特許書面と、その概要を発見。NOPを発見!(困った)
参考文献:当時のマニュアルなど、多くの文献を当たっています。
基本的には、途中に書かれた年表からリンクしています。