先行評価(正格評価、厳密評価)とは
先行評価(eager evaluation)とは、
プログラミング言語における評価戦略の一つで、正格評価(strict evaluation)や厳密評価とも呼ばれます。多くの
プログラミング言語処理系で標準的に採用されている評価方式です。
概要
先行評価の最も重要な特徴は、変数の値が定義された時点で、関連する
数式を即座に評価する点です。つまり、式が変数に代入される瞬間に計算が実行され、結果の値がメモリに格納されます。
この方式は、評価されていない
数式を保持するための中間的な
データ構造を必要としないため、特に単純な
プログラミング言語においては効率的な処理が可能です。例えば、以下のような
BASICコードを例に考えてみましょう。
basic
x = 5 + 3 (1 + 5 ^ 2)
print x
print x + 2
先行評価の場合、1行目の`x = 5 + 3 (1 + 5 ^ 2)`が実行されると、即座に`5 + 3 (1 + 25)`、`5 + 3 26`、そして`5 + 78`と計算が進み、最終的に`x`の値は`83`と確定します。そして、この値`83`がメモリに格納されます。
そのため、2行目の`print x`や3行目の`print x + 2`が実行される際には、再度`x`の値を計算する必要はありません。メモリに保存されている`83`の値を利用して、それぞれ`83`と`85`が出力されます。
先行評価のメリット
先行評価の主なメリットは、以下の2点です。
1.
メモリ使用量の削減:
数式を保持する必要がないため、中間的な
データ構造のためのメモリ領域が不要になります。特に、複雑な計算式や大規模なデータを取り扱う場合、メモリ使用量の削減は非常に重要な利点となります。
2.
計算速度の向上:一度計算された値は再計算する必要がないため、プログラムの実行速度が向上します。特に、同じ値を何度も参照する場合には、この効果が顕著に現れます。
先行評価は、シンプルで直感的であるため、多くの
プログラミング言語に採用されています。しかし、全ての状況において先行評価が最適とは限りません。特に、
遅延評価のような別の評価戦略が適しているケースも存在します。
対照的な評価戦略として、
遅延評価(lazy evaluation)があります。
遅延評価では、式が実際に必要になるまで評価を遅らせます。この方式は、特に以下のような場合に有効です。
不要な計算を避けることで、計算リソースを節約できる
無限リストなどの
データ構造を扱うことができる
副作用をコントロールしやすい
ただし、
遅延評価では評価を遅らせるための仕組みが必要となるため、先行評価よりも複雑な実装が必要となります。また、
遅延評価を採用している言語では、
メモ化(memoization)という仕組みによって、一度計算した結果を保存し、同じ計算を何度も繰り返すことを防ぐことで、効率的な処理を実現しています。
まとめ
先行評価は、多くの
プログラミング言語で採用されている、シンプルかつ効率的な評価戦略です。計算式が定義された時点で即座に評価を行うため、メモリ使用量を削減し、プログラムの実行速度を向上させることができます。しかし、状況によっては
遅延評価などの別の評価戦略がより適切な場合もあります。
プログラミング言語を選択する際には、これらの評価戦略の違いを理解しておくことが重要です。
関連項目
グラフ還元
遅延評価
短絡評価
部分評価
評価戦略