最適化というのは例えば

x = f(5) + f(5)

という式があったらf(5)を2度呼ぶんじゃなくてf(5)が返した値を2倍する。これは「共通部分式の削除」と呼ばれる最適化だ。

ただしこれには条件がある。1つはf()が同じ引数に対して必ず同じ値を返すこと、もう1つはf()が副作用を引き起こさないことだ。

数学の関数には同じ引数に対して別の値を返すものなんてない。副作用なんてものもない。これらはソフトウェア工学の産物だ。

ソフトウェアにおいて、例えば乱数関数は呼ぶたびに違う値を返す。むしろそれこそが欲しくてサイコロを振る代わりに呼ぶのだ。乱数関数を共通部分式として削除することはできない。

ある関数は呼ぶたびにファイルに1文字書き出す。これも共通部分式として削除することはできない。これは関数の副作用と呼ばれるものだ。