Artikel-Schlagworte: „Applikativ“

Auswertungsreihenfolge

Mittwoch, 28. Oktober 2009

Es gibt zwei verschiedene Reihenfolgen wie Ausdrücke ausgewertet – also abgearbeitet – werden können. Ich möchte die beiden Reihenfolgen an folgendem (nicht ganz sinnvollem) Beispiel erklären:

(define (quadrat-negativ zahl) (- (* zahl zahl)))
(define (quadrat-positiv zahl) (* zahl zahl))
  • Applikative Auswertungsreihenfolge
    Bei derApplikative Auswertungsreihenfolge werden zuerst die höchstwertigen Klammern ausgewertet, bis man zur Hauptklammer gelangt.

    ((quadrat-negativ (quadrat-positiv (+ 2 3)))
    (quadrat-negativ (quadrat-positiv 5))
    (quadrat-negativ (* 5 5))
    (quadrat-negativ 25)
    (- (* 25 25))
    (- 625)

    Wie man sehen kann, werden die Zahlen erst ausgerechnet, wenn sie wirklich an der Reihe sind. Genau so wird auch mit Funktionen verfahren. Sie werden erst “eingesetzt”, wenn es nötig wird.

  • Normale Auswertungsreihenfolge
    Bei der Normale Auswertungsreihenfolge ist es genau umgedreht. Es wird der Gesamtausdruck einfach von Anfang an abgegangen, und sobald ein gerade gelesener Ausdruck ausführbar ist, wird er ausgeführt. Genau so wird auch mit Funktionen verfahren:

    ((quadrat-negativ (quadrat-positiv (+ 2 3)))
    (- (* (quadrat-positiv (+ 2 3)) (quadrat-positiv (+ 2 3))))
    (- (* (* (+ 2 3) (+ 2 3)) (quadrat-positiv (+ 2 3))))
    (- (* (* 5 (+ 2 3)) (quadrat-positiv (+ 2 3))))
    (- (* (* 5 5) (quadrat-positiv (+ 2 3))))
    (- (* 25 (quadrat-positiv (+ 2 3))))
    (- (* 25 (* (+ 2 3) (+ 2 3))))
    (- (* 25 (* 5 (+ 2 3))))
    (- (* 25 (* 5 5)))
    (- (* 25 25))
    (- 625)

    Natürlich liefert auch diese Auswertungsreihenfolge das gleiche Ergebnis wie die Normale, aber es ist in diesem Beispiel viel aufwendiger und unübersichtlicher.

In Scheme und vielen anderen Programmiersprachen wird die applikative Auswertungsreihenfolge verwendet – mit der Ausnahme von ifs, conds, ands, … Der Vorteil ist, das wenn man z.B. eine if-Bedingung hat:

(if
   (AND
      (= 4 9)
      (sehr-aufwendige-funktion params)
   )
   ...
)

und man bemerkt schon bei der ersten Bedingung (= 4 9) dass die Aussage falsch ist, dann kann die gesamte Bedingung nicht mehr true werden, da sie mit einem AND Verknüpft ist. Deshalb kann man sich das Ausführen der Funktion (sehr-aufwendige-funktion params) sparen und direkt ins else springen.

Bemerk für mich: Foliensatz T4, Folien 2-5 und Übung 1, Aufgabe 5.

PDF Drucker    Sende Artikel als PDF an