NOP 命令 — 何もしない機械命令

大型汎用機(メインフレーム)の機械命令(マシン語)に NOP 命令というのがある。私が 1980 年代末に計算機プログラミングを習いはじめた時,面食らったもののひとつである。これは要するに「何もしない」という命令(NOP = No OPeration)なのである…… ドキュメント作成システム LaTeX(「ラテック」,「ラテフ」あるいは「レイテック」と読む。「ラテックス」じゃないよ。それじゃコンドームになっちまう) を使う方は,同様に「何もしない」\relax 命令をご存知のはずである。

「何もしない」命令なんてどうして必要なのだろうかと誰しも思うだろう。ところが,沈黙が文芸表現において意味をもつように,「何もしない」命令が素晴らしいトリックを実現する場合がある。計算機の世界でも,沈黙が時に雄弁に勝ることがある。

たとえば,アセンブラで書いたプログラムにおいて BCBranch on Condition)命令で条件分岐をする手続きがあり,通常はフラグレジスタの値によって分岐するわけだが,運用上の問題からその条件分岐をさせたくないことが起こったとしよう。そのような場合,実行時パッチ(パッチとはプログラム訂正コード。訂正したい部分だけのコードなのでパッチ=「継ぎ接ぎ」と呼ばれる。大型汎用機のオペレーティングシステムには,ディスク上のプログラムそのものを書き換えるのではなく,メモリにロードする時点でパッチを適用できる機能がある。アセンブラで書いたプログラムでないとこんな芸当はできない)で記憶装置にこのプログラムをローディングする際に,BC 命令を NOP 命令で書き換えたりしたものである。これにより分岐命令が無効化され,いかなる条件においても次の命令以降が実行されるわけだ。

汎用機プログラミングのコードにはこれに類するトリックがゴマンとあった。先輩のプログラムをメンテナンスした時のこと,意味不明の DS 命令(Define Storage: 領域確保命令)が書かれていて「これ何ですか」と訊いた。アセンブラは領域の制御をすべてプログラマの知性に委ねることができる。アセンブルリストを解析すれば,記憶装置のどの位置にどのバイナリコードが配置されているかが正確に分る。ローディングされた時,高速化の鍵を握るループ処理がきちんとプロセッサの超高速バイポーラ一次キャッシュに収納可能かを正確に設計することができる。記憶域セグメントに余裕があると,プログラムの問題修正時にパッチをあてる領域を確保しておくことがある。こうしておくとメモリ配置に影響のある実行サイズを変えることなくプログラムに追加/修正コードを付加できるわけだ。先輩の領域確保命令の意図はそのようなものであった。

LaTeX の \relax についても一度定義したマクロ命令を無効化するのに利用でき,同じマクロ命令の意味を状況に応じて変更する使い方がある。もちろんそのほかに「何もしない」ことが逆説的に機能するいろんな局面がある。さあ,リラックスしてプログラムに魔法をお掛けしよう — LaTeX の作者・クヌース教授の懐の深さが知れるというものである。

「何もしない」命令。これは計算機科学者による最高の諧謔だと私は思う。