Die strikte Bewertung, auch als eifrige Bewertung bezeichnet, ist die Bewertungsstrategie, die von den meisten funktionalen Programmiersprachen verwendet wird, bei denen ein Ausdruck ausgewertet wird, sobald er an eine Variable gebunden ist. Eine strikte Bewertung steht in direktem Gegensatz zur verzögerten Bewertung, bei der die Bewertung eines Ausdrucks verzögert wird, bis sein Wert benötigt wird. Haskell ist die beliebteste Programmiersprache, die eine verzögerte Auswertung verwendet. Die meisten Programmiersprachen verwenden eine strikte Auswertung für Funktionsargumente (manchmal auch als Parameter bezeichnet) wie Java, Scheme (eine Lisp-Sprache) und JavaScript.
Die Verwendung einer strengen Auswertung führt zu Code, der in Bezug auf die Ausführungsreihenfolge leicht verständlich ist, ein einfacherer Debugging-Prozess im Vergleich zu anderen Auswertungsstrategien und die Verlagerung der Verantwortung für die Codeleistung auf den Programmierer, was bedeutet, dass ein sorgfältiger Codeoptimierungsprozess erforderlich ist.
Bewertungsstrategien in der Programmierung
Auswertungsstrategien werden in Programmiersprachen verwendet, um zu bestimmen, wann die Argumente eines Funktionsaufrufs ausgewertet werden sollen und welche Art von Wert an die Funktion übergeben werden soll. Es gibt viele Bewertungsstrategien, aber die meisten fallen unter eine von zwei Dachkategorien: Strikte und faule Bewertung.
Strenge Bewertungsstrategien
- Call-by-Value: Die gebräuchlichste Bewertungsstrategie besteht darin, den Inhalt der tatsächlichen Parameter in die formalen Parameter zu kopieren. Wenn die Funktion ihren Parametern Werte zuweisen kann, wird nur ihre lokale Variable zugewiesen, was bedeutet, dass alles, was an einen Funktionsaufruf übergeben wird, unverändert bleibt. Call-by-Value ist keine einzelne Bewertungsstrategie, sondern eine Familie, in der die Argumente einer Funktion bewertet werden, bevor sie an die Funktion übergeben werden. Programmiersprachen wie C, Eiffel und Common Lisp verwenden eine Call-by-Value-Strategie.
- Call-by-Reference: Eine weitere gemeinsame Strategie. Während die Call-by-Value-Strategie den Inhalt des Aktualparameters in den Formalparameter kopiert, kopiert eine Call-by-Reference-Strategie die Adresse des Aktualparameters in den Formalparameter. Eine Funktion erhält einen impliziten Verweis auf eine Variable, die als Argument und nicht als Kopie ihres Werts verwendet wird. C ++ verwendet die Call-by-Reference-Strategie.
Faule Bewertungsstrategien
- Normale Reihenfolge: Ein Ausdruck wird ausgewertet, indem der am weitesten links und am äußersten am Ende reduzierbare Ausdruck wiederholt ausgewertet wird.
- Call-by-Name: Der Aktualparameter wird nur ausgewertet, wenn er innerhalb der Funktion verwendet wird. Wenn ein Parameter im Funktionskörper nicht verwendet wird, wird er niemals ausgewertet. Wenn es mehrmals verwendet wird, wird es jedes Mal neu bewertet, wenn es angezeigt wird.
- Call-by-Macro-Erweiterung: Ähnlich wie Call-by-Name, vermeidet jedoch Substitution. Bietet Entwicklern einen Mechanismus zum Hinzufügen einer neuen Syntax zur als Makros bezeichneten Kernsprachengrammatik. Makros werden von einem Makro-Präprozessor in Code erweitert.
- Call-by-Need: Ein Parameter wird nur ausgewertet, wenn er verwendet wird. Sobald die erste Auswertung erfolgt, wird das Ergebnis zwischengespeichert, sodass für weitere Verwendungen des Parameters keine erneute Auswertung erforderlich ist.