大型汎用機 (メインフレーム) の機械命令に NOP 命令というのがある.私は二十年前に計算機プログラミングを習いはじめた時,面食らったもののひとつである.これは要するに「何もしない」という命令 (NOP=No OPeration) なのである... LaTeX を使う方は,同様に「何もしない」\relax 命令をご存知のはずである.
「何もしない」命令なんてどうして必要なのだろうかと誰しも思うだろう.ところが沈黙が文芸表現において意味をもつように「何もしない」命令が素晴らしいトリックを実現する場合がある.計算機の世界でも,沈黙が時に雄弁に勝ることがある.
例えば,アセンブラで書いたプログラムにおいて BC (Branch on Condition) 命令で条件分岐をする手続きがあり,通常はフラグレジスタの値によって分岐する訳だが,運用上の問題からその条件分岐をさせたくないことが起こったとしよう.そのような場合,実行時パッチ (汎用機にはディスク上のプログラムそのものを書き換えるのではなく,メモリロード時点でパッチを適用できる機能がある) で記憶装置にこのプログラムをローディングする際に BC 命令を NOP 命令で書き換えたりしたものである.これにより分岐命令が無効化されいかなる条件においても次の命令以降が実行される訳だ.
汎用機のコーディングにはこれに類するトリックがゴマンとあった.先輩のプログラムをメンテナンスした時のこと,意味不明の領域確保命令が書かれていて「これ何ですか」と聞いた.アセンブラは領域の制御をすべてプログラマの知性に委ねることができる.記憶装置のどの位置にどのコードが配置されているかが正確に分る.ローディングされた時,高速化の鍵を握るループ処理がきちんと CPU の超高速バイポーラ一次キャッシュに収納可能かを正確に設計することができる.セグメントに余裕があると,プログラムの問題修正時にパッチをあてる領域を確保しておくことがある.こうしておくとメモリ配置に影響のある実行サイズを変えることなくプログラムに追加/修正コードを付加できる訳だ.先輩の領域確保命令の意図はそのようなものであった.
LaTeX の \relax についても一度定義したマクロ命令を無効化するのに利用でき,同じマクロ命令の意味を状況に応じて変更する使い方がある.もちろんそのほかに「何もしない」ことが逆説的に機能するいろんな局面がある.
「何もしない」命令.これは計算機科学者による最高のデジタル・ジョークに違いない.\relax リラックスする命令だなんてクヌース教授の懐の深さが知れるというものである.

Comments