今日は NOP 命令が初めて公式文章に記された日(1960)。
…本当かどうかわかりませんが。
僕の調べではこれより古い NOP 命令の記述はありません。
2014.7.6 追記
もっと前の記述がある、という情報が寄せられました。情報提供ありがとうございます。
この記事の内容全てが誤りではありませんが、少なくとも「初めて公式文書に記された日」は誤りでした。
最初に NOP が登場したのは IBM 701。しかし、考え出したのは先に開発を始め、後で発売された IBM 702のようです。
IBM 702 では、明確な目的を持って NOP が作られています。
詳細は別記事にまとめてあります。
えーと、1年近く前に書いた記事、「NOP命令の誕生」は、自分では結構面白い内容だと思うのですが、面白さが伝わる人はかなり限られたようです。
うん。妻にすら、なんだかわからないと言われたよ。
まず、普通は NOP 命令が何かわからないよね。それで当然。
もっと多くの方に読んでもらえるように、前知識を解説しちゃいますよ!
面白いと思ったら本文も読んでいってね。
現代のコンピューター機器は、大抵 CPU を搭載しています。
会社によっては MPU って呼んだりするけど、つまりはコンピューターの本体部分。
コンピューターは電流を使って計算をしているわけですが、これは、計算できる回路をたくさん用意して、切り替えているのです。
足し算をしたいなら足し算回路を、引き算をしたいなら引き算回路を、掛け算をしたいなら掛け算回路を、割り算をしたいなら割り算回路を呼び出すだけ。
計算以外では、メモリにデータを記録しておく、とか、逆にデータを読み込む、とか。全部回路で用意されている。
そんな、小さな命令の寄せ集めでコンピューターは動いています。
ちなみに、画面に文字を書いたり、キーボードからの入力を読み込むのは、「記録」の一種です。
特定の場所に書いたデータは画面に表示されて、特定の場所のデータは、キーボードの内容によって勝手に書き変わる。
コンピューターって、本当に、驚くほど簡単な事しかできません。
さて、そんなコンピューターの「命令」も、データとしてメモリに記録されています。
コンピューターは数字しか扱えませんから、10 だったら足し算、11だったら引き算…みたいに、命令は数字と対応している。
しかし、数字だとプログラムしにくいので、一対一対応で、英語を省略したような名前が付いているのが普通です。
足し算なら add 、引き算なら sub 、掛け算なら mul 、割り算なら div 、という具合。
データの読み込みは CPU によって mov (ムーブ、移動、の意味)だったり、ld (ロード、読み込む、の意味)だったり、store (ストア、保存する、の意味)だったり。
余程単純な英語でない限り、CPU メーカーによって命令の呼び名も、その動作詳細も異なるのが普通です。
ところが、メーカーに寄らずほとんど同じ名前、動作も同じ命令があります。
それが NOP 命令。
No OPeration (なにもしない)の略なのですが、略であれば NOOP になりそうなものが、なぜか NOP 。
(NOOP にしているメーカーもあります)
…と、これが「NOP命令」が特別な理由なのですが、理解できる人が非常に少ないんですよね。
多分、プログラム能力がある人って、非常に簡単なものを作る能力でも 100人に1人いない。
ましてや、機械が理解できる言葉(機械語)で直接プログラムしようなんて人は、プログラムできる人のうち 100人に1人いない。
そして、機械語プログラムができる人でも、NOP 命令に興味を持つ人なんて、100人に一人いない。
…となると、今日が「NOP が初めて公式文書に記述された日」と書いて関心を持つ人は、日本全国で 100人程度しかいないことになる。
#今まで NOP に興味を持ってなかった人の2人に1人が、このページを読んで興味を持ってくれれば、5千人程度には増える計算(笑)
僕がコンピューターを使い始めた時には NOP はあって当たり前の命令でした。
だから僕も、正直なところ NOP の存在を特に疑問に思ったことはありませんでした。
これがちっとも「常識」ではないと知ったのは、がたろうさんのページに、「NOPと都市伝説」というコーナーを見つけたから。
そして、上記ページを見つけた時、すでに僕は がたろうさん が求めている答えを知っていました。
がたろうさんは、ある程度有名なマシンを調べて PDP-1 が NOP を最初に搭載したマシンである、と結論付けていました。
そして、その理由はおそらく技術的に自然発生しただけだろう、と。
NOP の名前の由来も、同じように自然発生と考えています。
しかし、PDP-1 の前には TX-0 があり、TX-0 には NOP が存在しなくてはならない、強い理由があるのです。
実際、PDP-1 よりも前に TX-0 の技術文章に NOP が登場していました。
TX-0 は、非常に複雑な命令系を持っています。
先に、CPU の命令を「足し算」「引き算」などの簡単なものしかない、と書きましたが、TX-0 にはそれすらもないのです。
「半加算」と呼ばれる、繰り上がりの無い足し算は出来ました。
また、「繰り上がり処理」も出来ました。
だから、組み合わせれば足し算ができます。でも、それを組み合わせるのはプログラマの責任でした。
全ての命令が、いくつか組み合わせたら何かできそうな機能どまりなのです。
そして、これらの命令は「同時に」実行することが可能でした。
命令の特定のビット(2進数の1桁)を 1 にすると実行され、0 にすると何もしないのです。
いくつかの命令は、2進数1桁ではなく、5桁で表現されました。
この命令体系は TX-0 独特のもので、僕は他のマシンでこのような方法を見たことは無いです。
5桁で示される命令は…2進数5桁では、32種類の組み合わせを作り出せます。
しかし、当初は全ての数字に命令が割り振られていたわけではありません。
命令表で「何も入っていないところは将来の拡張予定」とされました。
しかし、ここで問題が起こります。
1桁で示される命令は「0」を指定すると、その命令は実行しない、と決められています
5桁の場合、すべての桁が 0 の場合は、何もしないことになっていました。
しかし、「何もしない」がゆえに、命令表には何も書かれていませんでした。
何も書かれていないのですから、これは、将来の拡張予定なのでしょうか?
もし拡張されたら、5桁の2進数で示される部分は、「何もしない」ことができなくなり、他の命令に悪影響を与えるのでは?
そして、懸念していた事態…すべてが 0 の「将来の拡張予定」部分に、命令が拡張される時が来ます。
追加された命令は「NOP」。意味はもちろん「No OPeration」でした。
「命令が入ってない場所は将来の拡張予定」でしたが、すべてが 0 の時は何もしないことを保証したかったため、「何もしない」命令が作られたのです。
この追加命令が公式文章に登場したのが、1960年の7月1日。つまり54年前の今日でした。
ちなみに、TX-0 は、6bit を 1byte とする、18bit コンピューターでした。
当時はアスキーコード選定前。1文字は 6bit で、3文字を同時に扱える、ということになります。
このため、TX-0 の機械語命令は、3文字で1命令とするのが普通でした。
NOOP ではなく NOP となっているのはそのためです。
…と、概要は以上の通り。
詳細は「NOP命令の誕生」を読んでね。
ちなみに僕が書いたページ、がたろうさんのページでは触れられていませんが、書いてすぐに連絡済みです。
いろいろお忙しい方なので、ページ更新の暇が無いようです。
お忙しい方の手を煩わせたくないので、「こんな記事があるよ」というような無駄な追加連絡はしないように。
(こっちも趣味、あっちも趣味だから、主張が違ったって構いませんし)
同じテーマの日記(最近の一覧)
関連ページ
ヴァネバー・ブッシュ 誕生日(1890)【日記 15/03/11】
ダグラス・エンゲルバート 誕生日(1925)【日記 16/01/30】
ダグラス・エンゲルバートの命日(2013)【日記 14/07/02】
別年同日の日記
15年 A Dark Room , Candy box! , Cookie Clicker.
申し訳ありませんが、現在意見投稿をできない状態にしています。 |