ふたつの顔 (第二回目)

Scheme の特徴のひとつに末尾呼出し最適化があることは有名だろう。 末尾文脈における呼出しの回数に制限がないことが仕様で定められている。 実装に対して制約を設けないように迂遠な言回しになっているが、条件を満したときには呼出しをジャンプに置換えることが必要だということを実質的に述べているのである。 呼出しとジャンプについて次のような関係を想定していると考えられる。

  • ジャンプとは呼出しの特別な場合 (スタック操作を省略できる場合) である

だが一方で (主要なマシンアーキテクチャにおいては) 機械語レベルで考えると、呼出しというのはもちろんスタック操作とジャンプの複合機能である。 (Scheme の駆動レコードは単純なスタックではない場合もあるが、ここでは言語ユーザが意識する必要がある概念的なことを考えている)

  • 呼出しとはスタック操作とジャンプの組合わせである

このふたつはどちらが正しいのだろうかと問う意味はないだろう。 同じことの言い換えに過ぎないことは明らかだからだ。

Scheme が繰返しの構文を持たずに手続呼出しだけをプリミティブとしていることについて難解に感じている人や、逆に感銘を受けすぎて「Scheme こそまさに計算の本質が集約されている」などと言う人がしばしば見られるが、とりたてて Scheme が特別なわけではなく同じことを別の面から見ているだけなのである。

Document ID: dfd45a0f4dae80cf2fcfecd71e245c68