magic number

名詞

[Unix/C。一般的]

  1. ソースコードにおいて、その値がプログラムの動作にとって重要でありながら、コメント付きの#defineで設定された記号によって展開されるのではなく、目立たないようにインラインで挿入された(hardcoded)、自明でない定数。この意味でのmagic numberは悪いスタイルである。

  2. アルゴリズムで使われる重要な情報を何らかの不透明な方法でエンコードした数。これらの古典的な例は、ハッシュやCRC関数で使われる数や、擬似乱数のための線形合同生成器の係数である。この語義は実際にはより一般的な語義に先行し、その祖先である。

  3. バイナリデータファイルの先頭に置かれ、その型をユーティリティに示す特別なデータ。Unixでは、システムやさまざまなアプリケーションプログラム(特にリンカ)が、magic numberを探すことで実行可能ファイルの型を区別する。かつて、これらのmagic numberは、ヘッダデータを飛ばして実行可能コードの先頭へ分岐するPDP-11の分岐命令だった。たとえば0407は‘16バイト相対分岐’の八進数だった。今や他の多くの種類のファイルもどこかにmagic numberを持っている。一部のmagic numberは実際には文字列であり、Unixのアーカイブファイルの先頭の!<arch>や、PostScriptファイルの先頭の%!のようなものである。今日ではwizardだけがmagic numberを作る呪文を知っている。自分の新しいmagic numberはどう選ぶか?簡単だ。ランダムに一つ選べばいい。ほらね?魔法だろう!

  4. 計算上の境界条件、すなわちアルゴリズムの振る舞いが不連続になる箇所につながる入力。数値オーバーフロー(特に符号付きデータ型で)や実行時エラー(ゼロ除算、スタックオーバーフロー)はmagic numberの兆候である。Y2K騒動はおそらく最も悪名高いmagic numberの「非事件」だった。

一方、例のmagic numberは7±2である。George MillerのThe magical number seven, plus or minus two: some limits on our capacity for processing information(Psychological Review63:81-97、1956年)を参照。この古典的論文は、人間が短期記憶に保持できる別個の項目(数字などの)の数を明らかにした。とりわけ、これは電話システムのインターフェース設計に強い影響を与えた。