総称関数の先行実行

並列記号処理という本を読んだんですが、なかなか面白いです。
タイトルからはあまり想像が付きませんが、
高級言語マシンについての話がほとんどで、
Lispマシンなどが好きな人にはお勧めできます。
その中で一箇所印象に残ったものを取り上げます。
Symbolics 3600の後継マシンであるIvoryは、
総称関数の呼び出しの際に、高頻度で使用される命令を先行処理し、
それ以外の命令の実行が必要だった場合は、
割り込みによって処理を切り替えるそうです。
残念ながら、あまり詳しく書いてありませんでしたが、
次のような感じかと思います。

(defmethod m1 ((num number))  ;;m1-1
(1+ num))
(defmethod m1 ((numlis list))  ;;m1-2
(1+ (reduce #'+ numlis)))

上記のような総称関数があり(便宜上、m1-1, m1-2と呼び分けます)、
もし、m1-1(引数の型がnumber)の方が高頻度で呼ばれるならば、
m1が呼ばれた際に、型チェックに先行してm1-1を呼び出し、
後で、引数の型がリストだとわかったら、割り込みを用いて、
途中まで行った処理を無効化し、m1-2に処理を切り替えるという感じでしょうか。
これは、今時のCPUなら必ず付いている分岐予測の一種だとは思いますが、
『総称関数の呼び出し』という大きな単位についてこれが行われるのは
いかにも専用マシンっぽくてかっこいいですよね。

Leave a Reply