「NOP」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
8行目: 8行目:
*後で命令を追加する予定の場所にダミーとして置く
*後で命令を追加する予定の場所にダミーとして置く
**たとえば[[遅延スロット]]にとりあえず置く、あるいは置ける命令がない時に置く
**たとえば[[遅延スロット]]にとりあえず置く、あるいは置ける命令がない時に置く
**[[VLIW]]などのようなアーキテクチャでは、より積極的にNOPが必要である
*NOPスレッドによる命令ポインタの制御
*NOPスレッドによる命令ポインタの制御
*[[マイクロコントローラ|ワンチップマイコン]]の[[PROM]]では、0x00か0xffのどちらか「上書き可能なほう」で潰すと NOP になるようにしておくと、再利用に便利
*[[マイクロコントローラ|ワンチップマイコン]]の[[PROM]]では、0x00か0xffのどちらか「上書き可能なほう」で潰すと NOP になるようにしておくと、再利用に便利

などの用途で使用される。
などの用途で使用される。


規則的に命令を決めた結果、何の意味も持たない命令(同一レジスタでの移動、次の番地へのジャンプ)が出来たのでそれをNOPとすることもあれば([[TMS9900]]など。また、[[x86]]の場合 <code>XCHG AX, AX</code> である。ただし内部的な「AXレジスタを操作する」という意味は近年の高性能化プロセッサではそのまま解釈すると並列化の邪魔になるので、AXの参照を伴わないよう特別に解釈される)、専用の命令([[オペコード]])を用意ることもある。
規則的に命令を決めた結果、何の意味も持たない命令(同一レジスタでの移動、次の番地へのジャンプ)が出来たのでそれをNOPとすることもあれば、専用の命令として用意されることもある。

=== 歴史 ===
1950年代の[[EDSAC]]において既にNOP に相当する命令は設計者らには認識されていた(コード 'X' であるが、何もしないという命令は命令でないと考えたためか命令一覧では省かれていることがあり、[[文字コード]]一覧に命令も添えてある表のほうで確認できる(EDSACでは[[文字コード]]と[[オペコード]]を一致させていた))。

[[TMS9900]]は規則的なパターンのためにできた無意味となる場合をNOPとした例である。


[[x86]]では、命令の並びからは <code>XCHG AX, AX</code> に当たる部分がNOPであり、8086に始まる16ビット時代には内部的にはそのまま動作していたものもあったと思われる。しかし80386以降の後に[[IA-32]]と呼ばれるような高性能プロセッサになってくると、「AXレジスタを操作する」という意味には並列化の邪魔になるなど弊害が現れるため、AXの参照を伴わない真にNOPであるという解釈が明確化された。さらに[[x64|AMD64]]では、32ビットと64ビットの調整のために作られた「暗黙のゼロ拡張」という仕様により、64ビットレジスタRAXに対し、32ビット操作で <code>XCHG EAX, EAX</code> に相当する動作をした場合は、64ビットのうち上位32ビットがリセットされなければならないため、特別扱いであるNOPだと再定義された。
1950年代の[[EDSAC]]において既に NOP に相当する命令はあった(コード 'X' であるが、何もしないという命令は命令でないと考えたためか命令一覧では省かれていることがあり、[[文字コード]]一覧に命令も添えてある表のほうで確認できる(EDSACでは[[文字コード]]と[[オペコード]]を一致させていた))。


== 高水準言語 ==
== 高水準言語 ==

2020年12月2日 (水) 09:34時点における版

NOP(ノップ)あるいは NOOP(ノープ)とは no operation (何もしない)を意味する。プログラミングやネットワーク通信と言ったコンピュータ関連の技術用語として使用される。

機械語

機械語において NOP は多くの命令セットで用意されている命令である。プロセッサはこの命令を読みとると文字通り「何もせず」にプログラムカウンタインクリメントのみを行う。それ自身では何の意味も持たない命令ではあるが、

  • 外部機器や他のプログラムとの同期のタイミングを取るための時間稼ぎ
  • ジャンプ命令のジャンプ先の指標
  • 後で命令を追加する予定の場所にダミーとして置く
    • たとえば遅延スロットにとりあえず置く、あるいは置ける命令がない時に置く
    • VLIWなどのようなアーキテクチャでは、より積極的にNOPが必要である
  • NOPスレッドによる命令ポインタの制御
  • ワンチップマイコンPROMでは、0x00か0xffのどちらか「上書き可能なほう」で潰すと NOP になるようにしておくと、再利用に便利

などの用途で使用される。

規則的に命令を決めた結果、何の意味も持たない命令(同一レジスタでの移動、次の番地へのジャンプ)が出来たのでそれをNOPとすることもあれば、専用の命令として用意されることもある。

歴史

1950年代のEDSACにおいて既に、NOP に相当する命令は設計者らには認識されていた(コード 'X' であるが、何もしないという命令は命令でないと考えたためか命令一覧では省かれていることがあり、文字コード一覧に命令も添えてある表のほうで確認できる(EDSACでは文字コードオペコードを一致させていた))。

TMS9900は規則的なパターンのためにできた無意味となる場合をNOPとした例である。

x86では、命令の並びからは XCHG AX, AX に当たる部分がNOPであり、8086に始まる16ビット時代には内部的にはそのまま動作していたものもあったと思われる。しかし80386以降の後にIA-32と呼ばれるような高性能プロセッサになってくると、「AXレジスタを操作する」という意味には並列化の邪魔になるなど弊害が現れるため、AXの参照を伴わない真にNOPであるという解釈が明確化された。さらにAMD64では、32ビットと64ビットの調整のために作られた「暗黙のゼロ拡張」という仕様により、64ビットレジスタRAXに対し、32ビット操作で XCHG EAX, EAX に相当する動作をした場合は、64ビットのうち上位32ビットがリセットされなければならないため、特別扱いであるNOPだと再定義された。

高水準言語

NOPという表現はしばしば、何も起こさないような関数やコードを指して使われることがある (この場合冗長コードと呼ばれることもある)。コンパイラ最適化では、このようなコードを検出し、削除する(オブジェクトサイズの削減といった直接的な効果があり、コードキャッシュが無駄に使われるのを回避するという副次的効果もある)。

プログラミング言語の構文によっては、何もないことが許されないため、NOPのようなものが必要な場合がある。次に例を示す。

Python

Pythonにおける、何の効果も持たない pass文 (pass statement) は、NOPに似ている。pass statementは、Pythonの特徴的なインデントを使用する構文の都合上、記述したいことが何もなくても、何か記述が必要な場合に使われる。たとえばクラスの定義には何かブロック本体が必要であるので、とにかくクラスを存在させたいだけ、といった場合にその本体として pass と書く。 たとえば、次のようになる。

class Foo(Bar): # クラスを継承する
  pass          # (再)定義すべき内容は何もない

通信プロトコル

いくつかの通信プロトコルでは、NOP や NOOP というコマンドを備えている。このコマンドを送信した場合、具体的に何かが起こるわけではないがサーバからの応答は返ってくる。プロトコルによっては特別なメッセージや情報を返すものもある。このコマンドは主にサーバとの接続が切断されていないか、あるいはトラフィックの増大等の理由でサーバからの応答が遅れていないかを調べる目的で使用される。

NOP もしくは NOOP コマンドを備えている主な通信プロトコルとして以下のものがある。

  • FTP - NOOP コマンド
  • SMTP - NOOP コマンド
  • POP3 - NOOP コマンド
  • TCP - TCP オプションでオプション番号 1 が No-Operation(何もしない)を意味する
  • Telnet - NOP コマンド