2013-02-16 10 views
14

Aus Wikipedia:Irgendwelche Unterschiede zwischen Lazy-Auswertung und Kurzschlussauswertung?

Lazy evaluation ist:

In Programmiersprache Theorie ist faul Auswertung oder Call-by-need eine Evaluierungsstrategie, welche die Auswertung eines Ausdrucks bis der Wert verzögert ist benötigt

Short-circuit evaluation ist:

Kurzschlussauswertung, minimale Auswertung oder McCarthy Auswertung bezeichnet die Semantik von einigen Booleschen Operatoren in einigen Programmier Sprachen, in denen das zweite Argument nur oder ausgewertet wird ausgeführt, wenn das erste Argument nicht zu bestimmen, genügt die Wert des Ausdruck

Also, was ist der Unterschied zwischen ihnen zum Beispiel, wenn ich:

if(false && true && true) { 
    //boo 
} 

Soweit ich weiß, führt der Compiler keine Ausdrücke nach false aus, weil ich && habe, so dass der ganze Ausdruck schließlich false wird. (Rechts?)

So ist das Verhalten Verzögerte Auswertung oder Kurzschlussauswertung genannt?

+0

Sie haben ein gewisses Missverständnis darüber, was [Parsing] (http://en.wikipedia.org/wiki/Parsing) eigentlich betrifft. – Gumbo

+0

@Gumbo Bearbeitet, ich denke, "Ausführen" ist das richtige Wort, nicht wahr? –

Antwort

16

Der Unterschied ist, dass im Falle einer verzögerten Auswertung ein Ausdruck nur dann ausgewertet wird, wenn er benötigt wird, während im Falle einer Kurzschlussauswertung die Ausdruckauswertung gleich nach dem Erkennen des Ergebnisses endet. Es ist eine Art von orthogonalen Vorstellungen.

Lazy-Auswertung kann auf jede Berechnung angewendet werden (Kurzschlussschema wird normalerweise nur mit Bools verwendet). Es schneidet nicht nutzlose Berechnungen ab, sondern verzögert die gesamte Berechnung, bis das Ergebnis benötigt wird.

variable = bigAndSlowFunc() or evenSlowerFnc() 
if (carry out heavy computations) 
    print "Here it is: ", variable 
else 
    print "As you wish :-)" 

Wenn Auswertung faul ist, wird variable nur berechnet werden, wenn wir gehen in den ersten (then) Zweig der if wählen, sonst wird es nicht. In der Auswertungsstufe (wenn wir Argumente für print vorbereiten) kann das Kurzschlussschema verwendet werden, um zu entscheiden, ob wir evenSlowerFnc aufrufen müssen.

Also in Ihrem Beispiel ist es Kurzschlussauswertung, da keine Verzögerung der Berechnung passieren.

+0

Tatsächlich kann die Verwendung von Lazy Evaluation * manchmal * dazu führen, dass nutzlose Berechnungen abgeschnitten werden. Wenn Sie zum Beispiel mit [Django-Abfragesätzen] (https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy) arbeiten, können Sie filter (oder exclude) verwenden, um das anzupassen Filterkriterien so oft wie nötig: Die eigentliche SQL-Abfrage wird nur ausgeführt, wenn Sie auf das Ergebnis zugreifen. – aruseni

+3

Wie der erste Satz sagt, wird ein Ausdruck bei der Lazy-Evaluierung nur ausgewertet, wenn sein Wert benötigt wird. Daraus folgt, dass der Ausdruck nie ausgewertet wird, wenn der Wert eines Ausdrucks nie benötigt wird. Betrachte 'f() & & g()';, wenn der Wert dieses Ausdrucks benötigt wird, wenn' f() 'zu 'wahr' auswertet, wird die Berechnung des Wertes von 'g()' verzögert, bis es benötigt wird. Außerdem wird 'g()' überhaupt nicht berechnet, außer es wird benötigt. Die Kurzschlussauswertung ist ein einfacher Fall einer faulen Auswertung. –

+0

@TheodoreNorvell, im Falle einer Kurzschlussauswertung wird 'g()' entweder ausgewertet oder nicht. Es ist überhaupt nicht verspätet. Nun, okay, es wird nicht ausgeführt, bis 'f()' endet, aber diese Ausführung von links nach rechts ist das, was man erwarten würde, wenn man 'f() && g()' schreibt. –