2011-01-08 12 views
14

Soweit ich weiß, evaluiert Eager Bewertung/applicative Reihenfolge alle Argumente zu einer Funktion vor der Anwendung, auf der anderen Seite, faulen Bewertung/normalen Reihenfolge wertet die Argumente nur aus erforderlich.Eager Bewertung/applicative Reihenfolge und faule Bewertung/normale Reihenfolge

Also, was sind die Unterschiede zwischen dem Begriffspaar eifrig Auswertung und applicative um und lazy evaluation und normale Reihenfolge?

Danke.

Antwort

8

Faule Bewertung bewertet einen Begriff höchstens einmal, während normale Reihenfolge würde es so oft wie es scheint auswerten. Wenn Sie zum Beispiel f(x) = x+x haben und es als f(g(42)) bezeichnen, dann wird g(42) einmal unter fauler Bewertung oder anwendbarer Reihenfolge aufgerufen, aber zweimal in normaler Reihenfolge.

Eager Bewertung und anwendbare Reihenfolge sind auch, zumindest bei der Verwendung der Definition der anwendbaren Reihenfolge in Struktur und Interpretation von Computerprogrammen gefunden, die zu Ihnen passt. (Wikipedia definiert anwendungsbezogene Reihenfolge ein bisschen anders und hat es als Sonderfall eifriger Auswertung).

+1

Ja, ich lese * SICP *. Ich folgte dem Wikipedia-Link und fand dies in [Lazy evaluation] (http://en.wikipedia.org/wiki/Lazy_evaluation): "Der Ausdruck wird nie mehr als einmal ausgewertet, die Auswertung der applikativen Reihenfolge." Das bedeutet, dass die anwendbare Ordnung auch als Untertyp der Lazy Evaluation verwendet werden könnte. Ich bin ein bisschen verwirrt. –

+2

@Ryan: Anscheinend verwendet die Seite "Lazy Evaluation" eine andere Definition der Anwendungsreihenfolge als die Seite "Evaluation strategie". Ich denke in diesem Fall ist es am besten, Wikipedia einfach zu ignorieren und mit dem zu gehen, was SICP sagt. – sepp2k

+0

Danke für Ihre Erklärung. –

5

Ich lese auch SICP, und ich war neugierig nach der Definition der normalen Reihenfolge von den Autoren gegeben. Es schien mir Lazy Evaluation ziemlich ähnlich zu sein, also suchte ich nach mehr Informationen bezüglich beider.

Ich weiß, diese Frage wurde vor langer Zeit gestellt, aber ich schaute auf die FAQ und fand keine Erwähnung der Beantwortung alter Fragen, also dachte ich, ich würde das, was ich hier gefunden habe, so dass andere Leute es verwenden können die Zukunft.

Dies ist, was ich gefunden habe, und ich bin geneigt, mit denen sich einig:

Ich würde argumentieren, (wie andere haben), dass lazy evaluation und NormalOrderEvaluation sind zwei verschiedene Dinge; Der Unterschied ist oben angedeutet. In der faulen Bewertung wird die Bewertung des Arguments zurückgestellt, bis es benötigt wird, an diesem Punkt wird das Argument ausgewertet und sein Ergebnis gespeichert (Memo). Weitere Verwendungen des Arguments in der -Funktion verwenden den berechneten Wert. Die C/C++ Operatoren ||, & &, und? : sind beide Beispiele fauler Bewertung. (Es sei denn einigen Neuling C/C++ Programmierer sind genug bescheuert, um eine Überlastung & & oder ||, in welchem ​​Fall der ladenen Versionen in strikter Reihenfolge ausgewertet werden, weshalb die & & ist und || Betreiber sollten nie in C überlastet werden ++).

Mit anderen Worten, jedes Argument wird höchstens einmal ausgewertet, möglicherweise nicht überhaupt.

NormalOrderEvaluation hingegen wertet den Ausdruck bei jeder Verwendung neu aus. Denken Sie an C-Makros, CallByName in Sprachen, die unterstützen, und die Semantik von Schleifenkontrollstrukturen, etc. Normal-Reihenfolge Auswertung kann viel länger dauern als die Anwendung Auswertung, und kann dazu führen, dass Nebenwirkungen mehr als einmal passieren. (Weswegen, natürlich, Aussagen mit Nebenwirkungen im Allgemeinen sollte nicht als Argument für Makros in C/C++ gegeben werden)

Wenn das Argument unveränderlich ist und keine Nebenwirkungen hat, den einzigen Unterschied zwischen den beide ist Leistung. Tatsächlich kann Lazy-Eval in einer rein funktionalen Sprache als eine Optimierung der Normal-Ordnungs-Auswertung angesehen werden. Mit den vorhandenen Nebeneffekten oder den Ausdrücken , die einen anderen Wert zurückgeben können, wenn neu ausgewertet, haben die zwei unterschiedliches Verhalten; normale Reihenfolge eval insbesondere hat einen schlechten Ruf in prozeduralen Sprachen wegen der Schwierigkeit der Argumentation über solche Programme ohne ReferentialTransparency

sollte auch beachtet werden, dass strenge Ordnung Bewertung (sowie faul Auswertung) kann dadurch erreicht werden, eine Sprache, die normale Bewertung durch explizites Memoing unterstützt. Das Gegenteil ist nicht wahr; es erfordert übergibt Thunks, Funktionen oder Objekte, die aufgerufen werden können/Nachrichten , um die Auswertung zu verzögern/zu wiederholen.

Und

Verzögerte Auswertung kombiniert normale Ordnung Auswertung und den Austausch:

• Niemals etwas bewerten, bis Sie zu (normal Ordnung) haben

• Niemals etwas mehr bewerten als einmal (teilen)

http://c2.com/cgi/wiki?LazyEvaluation

http://cs.anu.edu.au/student/comp3610/lectures/Lazy.pdf