Wirkung (Informatik)

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Seiteneffekt)
Wechseln zu: Navigation, Suche

In der theoretischen Informatik bezeichnet Wirkung die Veränderung des Zustands, in dem sich eine abstrakte Maschine befindet.[1] Beispiele sind das Verändern von Inhalten des Speichers. Wirkungen in diesem Sinn werden auch Nebeneffekt genannt. Manchmal wird auch von Seiteneffekt gesprochen, eine Bezeichnung, die auf eine falsche Rückübersetzung des englischen side effect zurückgeht.

Sprachliche Aspekte[Bearbeiten]

Die Bezeichnungen „Nebenwirkung“, „Nebeneffekt“[2][3] oder „Seiteneffekt“ sind irreführend, da es nicht um die Abgrenzung gegenüber irgendeiner „Haupt“-Wirkung geht. Daher ist das Wort „Wirkung“[4] zu bevorzugen.

Spezifizierte Wirkungen[Bearbeiten]

Eine Variable repräsentiert zu jedem Zeitpunkt des Programmablaufes einen ganz bestimmten Wert. Die Gesamtheit aller Variablen und ihrer Werte definiert den Programmzustand einer abstrakten Maschine (siehe operationale Semantik). Operationen mit spezifizierten Wirkungen können ihn verändern.[1]

Von diesen spezifizierten Wirkungen zu unterscheiden sind die unspezifizierten Wirkungen, die außerhalb der Betrachtung des Systems liegen. Dazu kann beispielsweise, je nach Definition, auch die Bildschirmausgabe gehören. Für die abstrakte Maschine werden diese Effekte ggf. nicht berücksichtigt.

Programmiersprachen[Bearbeiten]

In den meisten Programmiersprachen kann die Auswertung eines Ausdrucks eine spezifizierte Wirkung haben. Ausdrücke und Funktionen können entweder wirkungsbehaftet oder wirkungsfrei sein. Zur Gruppe der Funktionen mit Wirkung gehören beispielsweise in der Regel alle, die mit der Ein- oder Ausgabe von Daten zu tun haben. Wirkungsfreie Funktionen in Hochsprachen sind etwa mathematische Funktionen wie Sinus, Kosinus oder Quadratwurzel.

Wirkungsfreiheit in der rein funktionalen Programmierung[Bearbeiten]

In rein funktionalen Programmiersprachen hat die Auswertung eines Ausdrucks im Unterschied zu anderen Programmiersprachen niemals eine spezifizierte Wirkung. Es gibt in solchen Sprachen keine Anweisungen, sondern nur Ausdrücke. Es werden keine Variablen und keine Wertezuweisungen verwendet. Eine Wirkung in Form der Ausgabe eines Ergebnisses ist in diesem Fall keine spezifizierte Wirkung. In der rein funktionalen Programmierung treten deshalb keine Zustandsänderungen im Sinne der obigen Definition und somit auch keine Wirkungen auf.[2] Die Programmiersprache ist zustandslos und wirkungsfrei.[3]

Diese Eigenschaft einer Programmiersprache wird als referenzielle Transparenz bezeichnet. Sie besagt, dass der Wert eines Ausdrucks nur von seiner Umgebung abhängt und nicht vom Zeitpunkt oder einer bestimmten Reihenfolge der Auswertung.[5] Beispiele für gänzlich wirkungsfreie Sprachen sind die rein funktionalen Programmiersprachen Haskell oder reines Lisp (pure Lisp).

In anderen funktionalen Programmiersprachen wie etwa Scheme können Prozeduraufrufe die Werte von Variablen verändern oder Bildschirmausgaben auslösen. Die referenzielle Transparenz geht verloren und Scheme ist damit keine rein funktionale Sprache.[5] Um diese Eigenschaft in der für Lehrzwecke eingesetzten Sprache Scheme hervorzuheben, werden mit Wirkungen behaftete Prozeduren mit einem Ausrufezeichen gekennzeichnet, zum Beispiel in der Variablenzuweisung (set! a 2).

Beispiel[Bearbeiten]

Das folgende, mit seinen Klammern und der Präfixnotation für eine Sprache wie Lisp oder Scheme typische Beispielprogramm liefert abhängig von einer Bedingung eines von zwei möglichen Berechnungsergebnissen zurück.

(if (= a 0)
  (+ a 1)
  (* a 2))

Die Zuweisung des Ergebnisses zu einer Variable findet nicht statt. Insbesondere aber hat die Reihenfolge der Auswertung der einzelnen Funktionen (if, =, + und *) keinerlei Einfluss auf das Ergebnis. Jeder Ausdruck kann an jeder Stelle durch seinen Wert ersetzt werden. Das ist die referenzielle Transparenz.

Belege zu Begriffen und Aussagen[Bearbeiten]

Belege zur Definition des Begriffs „Wirkung“[Bearbeiten]

Die Bedeutung des Begriffs „Wirkung“ in der Informatik stimmt im Allgemeinen mit der Bedeutung dieses Wortes in der Umgangssprache überein (wobei man aber stillschweigend immer nur eine spezifizierte Wirkung meint). In der Umgangssprache sind die Wirkungen eines Vorgangs ja die von diesem hervorgerufenen Veränderungen, also seine Folgen. Etwaige Definitionen in der Literatur der Informatik geben dies nur manchmal etwas formaler oder auf gerade relevante Spezialfälle eingeschränkt wieder. Oft wird der Begriff aber ohne ausdrückliche Definition verwendet, wenn die Bedeutung des Wortes gemeint ist, die es auch im Alltag hat.

  • „Wenn ZP also die Menge aller möglichen Zustände ist, die bei der Ausführung eines Programms P durchlaufen werden können (formal: ZP ⊂ W(v₁) × W(v₂) × … × W(vn), wobei v₁, …, vn die in P auftretenden Variablen und W(vi) der Wertebereich von vi, d.h. die Menge aller Werte, die vi annehmen kann, sind), dann ist die Wirkung einer Anweisung a ∈ P eine Abbildung F [a] : ZP → ZP, die einem Zustand z ∈ ZP einen Folgezustand z' ∈ ZP zuordnet. Beispiel: Sei V = {x, y} und P = "…; x ≔ y + 1; …". Falls vor Erreichen der Zuweisung der Zustand z = (x = ⊥, y = 5) gilt, gilt nach der Anweisung der Zustand z' = (x = 6, y = 5). Formal: F[x ≔ y + 1] (⊥, 5) = (6, 5).“[1]

Belege zur Verwendung des Begriffs „Wirkung“[Bearbeiten]

  • „Beschreibung der Wirkung, die Anweisungen auf Zustände (=Variablenbelegungen) haben. [...] Dann ist die Wirkung der Anweisung m := n + 1 wie folgt [...]“[4].
  • „Zu jeder Operation sind folgende Angaben zu machen: [...] eine Beschreibung der Wirkung der Operation“[6].
  • Auch in der englischsprachigen Fachliteratur der Informatik wird der Begriff „Wirkung“ (engl. effect, also nicht etwa nur „Nebenwirkung“, engl. side effect) oft verwendet. Beispielsweise findet man in der Norm der Programmiersprache C++[7] Verwendungen wie: „the effect of dereferencing the null pointer“ („Die Wirkung einer Dereferenzierung des Nullzeigers“). Der Begriff wird zur Beschreibung der Wirkung von Anweisungen verwendet, wie in „A return statement in main has the effect of leaving the main function“ („Eine return-Anweisung in main hat die Wirkung des Verlassens der main-Funktion“). Er wird an einer Stelle für Funktionen ausdrücklich definiert: „Effects: the actions performed by the function“ („Wirkung: die von der Funktion durchgeführten Aktionen“). Danach ist bei der Beschreibung jeder Funktion ein Abschnitt mit „Effects:“ („Wirkungen:“) etikettiert, der die Wirkungen der beschriebenen Funktion angibt, wie in „atexit … Effects: The atexit() functions register the function pointed to by f ….“ („atexit … Wirkungen: Die Funktion atexit() registriert die Funktion, auf die f zeigt ….“).

Einzelnachweise[Bearbeiten]

  1. a b c Hans-Jürgen Appelrath und Jochen Ludewig, Skriptum Informatik - eine konventionelle Einführung, Version 11.02.1999, (Abgerufen am 10. August 2008)
  2. a b P. Rechenberg, G. Pomberger: Informatik-Handbuch. Carl Hanser Verlag, München/Wien 2006, ISBN 978-3-446-40185-3.
  3. a b C. Wagenknecht: Programmierparadigmen. Teubner, Wiesbaden 2004, ISBN 978-3-519-00512-4.
  4. a b Alois Knoll, Einführung in die Informatik 2 (PDF), Sommersemester 2006, Seite 18. (Abgerufen am 9. August 2008)
  5. a b C. Schiedermeier: Funktionales Programmieren. Nürnberg 2002.
  6. Udo Kelter, Objektorientierter Entwurf (ps.gz; 70 kB), Universität Siegen, 2003, Seite 11. (Abgerufen am 9. August 2008)
  7. ISO/IEC 14882:2003(E)