Bedarfsauswertung

Lazy Evaluation ist eine Technologie in der Informatik, bei der das Ergebnis eines Ausdrucks nur so weit berechnet wird, wie es gerade benötigt wird.

Der Vorteil einer solchen Auswertungsstrategie ist Zeitersparnis, da Funktionsaufrufe ganz vermieden oder zumindest teilweise eingespart werden können. Außerdem gibt Lazy Evaluation dem Programmierer die Möglichkeit, unendliche Datenstrukturen zu verwenden. Ein Nachteil ist die erschwerte Fehlerbereinigung in Programmen, die lazy evaluiert werden. Oft ist nicht auf den ersten Blick nachvollziehbar, ob ein Ausdruck zu einem bestimmten Zeitpunkt bereits ausgewertet wurde. Dies ist insbesondere dann problematisch, wenn Funktionsaufrufe eine Nebenwirkung haben können.

Ein auf logische Ausdrücke eingeschränkter Spezialfall ist die Kurzschlussauswertung, die auch in vielen nicht-lazy-Sprachen wie C oder Java implementiert ist.

Beispiel

Das folgende in Haskell geschriebene Beispiel zeigt eine Anwendung von Lazy Evaluation.

squares n = (n*n) : squares (n+1)

Die Funktion squares berechnet die unendliche Liste aller Quadratzahlen beginnend bei n. Das Quadrat von 3 ließe sich also durch den Ausdruck squares 0 !! 3 berechnen -- dabei holt l !! x das Element an der Position x aus der Liste l. Ohne Lazy Evaluation würde der Aufruf von squares 0 nicht terminieren. Stattdessen werden nur die Teile berechnet, die wirklich benötigt werden. Die interne Auswertung sieht verkürzt wie folgt aus:

   squares 0 !! 3
-> 0*0 : squares (0+1) !! 3
-> squares (0+1) !! 2
-> (0+1)*(0+1) : squares (0+1+1) !! 2
...
-> (0+1+1+1)*(0+1+1+1) : squares (0+1+1+1+1) !! 0
-> (0+1+1+1)*(0+1+1+1)
-> 9

Auf den ersten Blick scheint die Lazy Evaluation hier Berechnungen mehrfach auszuführen, da auf der rechten Seite der Funktion squares der Parameter n mehrfach verwendet wird und statt einem Wert eine nicht ausgeführte Berechnung eingesetzt wird. Da Haskell eine rein funktionale Sprache ist, gewährleistet die referentielle Transparenz, dass ein Ausdruck immer das gleiche Ergebnis hat. Somit muss jeder Ausdruck auch nur einmal ausgerechnet werden. Dies nutzt Haskell aus, indem intern für n auf der rechten Seite der Funktionsdefinition anstelle von beispielsweise (0+1+1+1) ein Zeiger auf die Berechnung eingesetzt wird. Wird ein Ausdruck an einer Stelle im Programm ausgerechnet, steht das Ergebnis auch an anderen Stellen zur Verfügung.


Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Programmiersprache Haskell — Haskell Basisdaten Paradigmen: funktional, nicht strikt, modular …   Deutsch Wikipedia

  • Haskell (Programmiersprache) — Haskell Basisdaten Paradigmen: funktional, nicht strikt, modular, deklarativ Erscheinungsjahr …   Deutsch Wikipedia

  • Funktionale Programmiersprache — Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung. Funktionale Programmierung ist ein Programmierparadigma. Programme… …   Deutsch Wikipedia

  • Funktionale Programmierung — ist ein Programmierstil, bei dem Programme ausschließlich aus Funktionen bestehen. Dadurch werden die aus der imperativen Programmierung bekannten Nebenwirkungen vermieden. Die funktionale Programmierung entspringt der akademischen Forschung. In… …   Deutsch Wikipedia

  • Funktionionale Programmierung — Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung. Funktionale Programmierung ist ein Programmierparadigma. Programme… …   Deutsch Wikipedia

  • Auswertung (Informatik) — Auswertung (engl. evaluation als Beschreibung, Analyse und Bewertung) bezeichnet in der Informatik den Vorgang, der einem Ausdruck (eventuell in einem gegebenen Kontext von Variablenbindungen) einen Wert zuordnet. Programmiersprachen sind nach… …   Deutsch Wikipedia

  • Strikte Auswertung — Auswertung (engl. evaluation als Beschreibung, Analyse und Bewertung) bezeichnet in der Informatik den Vorgang, der einem Ausdruck (eventuell in einem gegebenen Kontext von Variablenbindungen) einen Wert zuordnet. Programmiersprachen sind nach… …   Deutsch Wikipedia

  • Strenge Funktion — Dieser Artikel wurde aufgrund von inhaltlichen Mängeln auf der Qualitätssicherungsseite der Redaktion Informatik eingetragen. Dies geschieht, um die Qualität der Artikel aus dem Themengebiet Informatik auf ein akzeptables Niveau zu bringen. Hilf… …   Deutsch Wikipedia

  • Strikte Funktion — In der Informatik heißt eine Funktion streng, wenn gilt: Ist eines der Argumente undefiniert ( , bottom), so ist das Funktionsresultat ebenfalls undefiniert. Beispiel In vielen Programmiersprachen ist es möglich, über nicht strenge Verknüpfungen… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”