Strikte evaluatie, ook wel eager evaluatie genoemd, is de evaluatiestrategie die door de meeste functionele programmeertalen wordt gebruikt, waarbij een uitdrukking wordt geëvalueerd zodra deze aan een variabele is gebonden. Strikte evaluatie is lijnrecht in tegenstelling tot luie evaluatie, waarbij de evaluatie van een uitdrukking wordt uitgesteld totdat de waarde ervan nodig is. Haskell is de meest populaire programmeertaal die luie evaluatie gebruikt. De meeste programmeertalen gebruiken strikte evaluatie voor functieargumenten (soms ook wel parameters genoemd), zoals Java, Scheme (een Lisp-taal) en JavaScript.
Het gebruik van strikte evaluatie resulteert in code die gemakkelijk te begrijpen is in termen van uitvoeringsvolgorde, een eenvoudiger foutopsporingsproces in vergelijking met andere evaluatiestrategieën, en de verantwoordelijkheid voor de codeprestaties wordt verschoven naar de programmeur, wat betekent dat een zorgvuldig code-optimalisatieproces vereist is.
Evaluatiestrategieën bij het programmeren
Evaluatiestrategieën worden in programmeertalen gebruikt om te bepalen wanneer de argumenten van een functieaanroep moeten worden geëvalueerd en wat voor soort waarde aan de functie moet worden doorgegeven. Er zijn veel evaluatiestrategieën, maar de meeste vallen onder een van de twee overkoepelende categorieën: strikte en luie evaluatie.
Strikte evaluatiestrategieën
- Call-by-waarde: De meest gebruikelijke evaluatiestrategie die bestaat uit het kopiëren van de inhoud van de feitelijke parameters naar de formele parameters. Als de functie waarden aan zijn parameters kan toewijzen, wordt alleen de lokale variabele toegewezen, wat betekent dat alles dat wordt doorgegeven aan een functieaanroep ongewijzigd blijft. Call-by-value is geen enkele evaluatiestrategie, maar eerder een familie waarin de argumenten van een functie worden geëvalueerd voordat ze aan de functie worden doorgegeven. Programmeertalen zoals C, Eiffel en Common Lisp gebruiken een call-by-value-strategie.
- Call-by-reference: Een andere veel voorkomende strategie. Waar de call-by-value-strategie de inhoud van de feitelijke parameter kopieert naar de formele parameter, kopieert een call-by-reference-strategie het adres van de feitelijke parameter naar de formele. Een functie ontvangt een impliciete verwijzing naar een variabele die als argument wordt gebruikt in plaats van een kopie van zijn waarde. C ++ gebruikt de call-by-reference-strategie.
Luie evaluatiestrategieën
- Normale volgorde: Een uitdrukking wordt geëvalueerd door herhaaldelijk eerst de meest linkse, buitenste reduceerbare uitdrukking te evalueren.
- Op naam bellen: De feitelijke parameter wordt alleen geëvalueerd als deze binnen de functie wordt gebruikt. Als een parameter niet wordt gebruikt in de hoofdtekst van de functie, wordt deze nooit geëvalueerd. Als het meerdere keren wordt gebruikt, wordt het elke keer dat het verschijnt opnieuw geëvalueerd.
- Call-by-macro-expansie: Gelijk aan call-by-name, maar vervanging wordt vermeden. Biedt ontwikkelaars een mechanisme om nieuwe syntaxis toe te voegen aan de grammatica van de kerntaal die bekend staat als macro’s. Macro’s worden door een macro-preprocessor tot code uitgebreid.
- Bellen naar behoefte: Een parameter wordt alleen geëvalueerd als deze wordt gebruikt. Zodra de eerste evaluatie plaatsvindt, wordt het resultaat in de cache opgeslagen, zodat verder gebruik van de parameter geen herevaluatie vereist.