Zum Inhalt springen

Wirkung (Informatik)

aus Wikipedia, der freien Enzyklopädie

In der theoretischen Informatik bezeichnet eine (spezifizierte) Wirkung die Veränderung des Zustands, in dem sich eine abstrakte Maschine befindet.<ref name="Appelrath1999" /> Manchmal wird auch von Seiteneffekt gesprochen, eine Bezeichnung, die auf eine Rückübersetzung des englischen side effect (deutsch: Nebenwirkung) zurückgeht.

Ausdrücke und Funktionen können sein:

Spezifizierte Wirkungen

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). Dieser Zustand kann nur durch Operationen mit spezifizierten Wirkungen verändert werden.<ref name="Appelrath1999" />

Unspezifizierte Wirkungen

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

Wirkungsfreiheit der rein funktionalen Programmierung

In rein funktionalen Programmiersprachen hat die Auswertung eines Ausdrucks im Unterschied zu anderen Programmiersprachen niemals eine spezifizierte Wirkung (eine Wirkung in Form der Ausgabe eines Ergebnisses ist in diesem Fall keine spezifizierte Wirkung). Es gibt in solchen Sprachen keine Anweisungen, daher auch keine Variablen oder Wertezuweisungen, sondern nur Ausdrücke. In der rein funktionalen Programmierung treten deshalb keine Zustandsänderungen im Sinne der obigen Definition und somit auch keine Wirkungen auf;<ref name="Informatik-Handbuch" /> die Programmiersprache ist zustandslos und wirkungsfrei.<ref name="Informatik-Handbuch">P. Rechenberg, G. Pomberger: Informatik-Handbuch. Carl Hanser Verlag, München/Wien 2006, ISBN 978-3-446-40185-3.</ref><ref name="Wagenknecht">C. Wagenknecht: Programmierparadigmen. Teubner, Wiesbaden 2004, ISBN 978-3-519-00512-4.</ref><ref name="Wagenknecht" />

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.<ref name="Schiedermeier">C. Schiedermeier: <templatestyles src="Webarchiv/styles.css" />{{#if:20050522010631

      | {{#ifeq: 20050522010631 | *
    | Vorlage:Webarchiv/Wartung/Stern{{#if: Funktionales Programmieren. | {{#invoke:WLink|getEscapedTitle|Funktionales Programmieren.}} | {{#invoke:Webarchiv|getdomain|http://www.informatik.fh-nuernberg.de/Professors/Schiedermeier/SS_2002/FunProg/Vorlesung/FunProg_SS2002.pdf}} }} (Archivversionen)
    | {{#iferror: {{#time: j. F Y|20050522010631}}
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/DatumDer Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
         | {{#if: Funktionales Programmieren. | {{#invoke:WLink|getEscapedTitle|Funktionales Programmieren.}} | {{#invoke:Webarchiv|getdomain|http://www.informatik.fh-nuernberg.de/Professors/Schiedermeier/SS_2002/FunProg/Vorlesung/FunProg_SS2002.pdf}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y|20050522010631}} im Internet Archive{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
      }}
  }}
      | {{#if:
          | {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
    | {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
       | 16= {{#if: Funktionales Programmieren. | {{#invoke:WLink|getEscapedTitle|Funktionales Programmieren.}} | {{#invoke:Webarchiv|getdomain|http://www.informatik.fh-nuernberg.de/Professors/Schiedermeier/SS_2002/FunProg/Vorlesung/FunProg_SS2002.pdf}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | 9 = {{#if: Funktionales Programmieren. | {{#invoke:WLink|getEscapedTitle|Funktionales Programmieren.}} | {{#invoke:Webarchiv|getdomain|http://www.informatik.fh-nuernberg.de/Professors/Schiedermeier/SS_2002/FunProg/Vorlesung/FunProg_SS2002.pdf}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!Vorlage:Webarchiv/Wartung/webcitation{{#if:  || }}
      }}
    | c|{{{webciteID}}}}} {{#if: Funktionales Programmieren. | {{#invoke:WLink|getEscapedTitle|Funktionales Programmieren.}} | {{#invoke:Webarchiv|getdomain|http://www.informatik.fh-nuernberg.de/Professors/Schiedermeier/SS_2002/FunProg/Vorlesung/FunProg_SS2002.pdf}} }} (Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
  }}
          | {{#if: 
              | Vorlage:Webarchiv/Today
              | {{#if:
                      | Vorlage:Webarchiv/Generisch
                      | {{#if: Funktionales Programmieren. | {{#invoke:WLink|getEscapedTitle|Funktionales Programmieren.}} | {{#invoke:Webarchiv|getdomain|http://www.informatik.fh-nuernberg.de/Professors/Schiedermeier/SS_2002/FunProg/Vorlesung/FunProg_SS2002.pdf}} }}  
                 }}}}}}}}{{#if:
    | Vorlage:Webarchiv/archiv-bot
  }}{{#invoke:TemplatePar|check
     |all      = url=
     |opt      = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
     |cat      = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
     |errNS    = 0
     |template = Vorlage:Webarchiv
     |format   = *
     |preview  = 1
  }}{{#ifexpr: {{#if:20050522010631|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
  }}{{#if: 
    | {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
        | web.archive.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}} 
        | webcitation.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}} 
        | archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
      }}{{#if: 
         | {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
             | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
          |  }} 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
      }}
    | {{#if: 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
      }}
  }}{{#if:{{#invoke:URLutil|isHostPathResource|http://www.informatik.fh-nuernberg.de/Professors/Schiedermeier/SS_2002/FunProg/Vorlesung/FunProg_SS2002.pdf}}
    || {{#if:  || }}
  }}{{#if: Funktionales Programmieren.
    | {{#if: {{#invoke:WLink|isBracketedLink|Funktionales Programmieren.}}
        | {{#if:  || }}
      }}
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Linktext_fehlt
  }}{{#switch: 
    |addlarchives|addlpages= {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/Parameter}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
  }}{{#ifeq: {{#invoke:Str|find|http://www.informatik.fh-nuernberg.de/Professors/Schiedermeier/SS_2002/FunProg/Vorlesung/FunProg_SS2002.pdf%7Carchiv}} |-1
    || {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://www.informatik.fh-nuernberg.de/Professors/Schiedermeier/SS_2002/FunProg/Vorlesung/FunProg_SS2002.pdf%7C4}}%7Chttp}} |-1
         || {{#switch: {{#invoke:Webarchiv|getdomain|http://www.informatik.fh-nuernberg.de/Professors/Schiedermeier/SS_2002/FunProg/Vorlesung/FunProg_SS2002.pdf }}
              | abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org = 
              | #default = {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/URL}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
            }} 
       }}
  }} (PDF) Nürnberg 2002.</ref> Beispiele für gänzlich wirkungsfreie Sprachen sind die rein funktionalen Programmiersprachen Haskell, Elm oder reines Lisp (pure Lisp).

Beispiel

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:

<syntaxhighlight lang="Lisp"> (if (= a 0)

 (+ a 1)
 (* a 2))

</syntaxhighlight>

Es findet keine Zuweisung des Ergebnisses zu einer Variable statt. Insbesondere hat die Reihenfolge der Auswertung der einzelnen Funktionen (if, =, + und *) keinen Einfluss auf das Ergebnis: jeder Ausdruck kann an jeder Stelle durch seinen Wert ersetzt werden; das ist die referenzielle Transparenz.

Funktionale, aber nicht rein funktionale Programmierung

In anderen funktionalen Programmiersprachen wie etwa Scheme können Prozeduraufrufe die Werte von Variablen verändern (spezifizierte Wirkung) oder Bildschirmausgaben auslösen (unspezifizierte Wirkung). Dadurch geht die referenzielle Transparenz verloren, und Scheme ist damit keine rein funktionale, sondern „nur“ eine funktionale Sprache.<ref name="Schiedermeier" /> Um diese Eigenschaft in der für Lehrzwecke eingesetzten Sprache Scheme hervorzuheben, werden wirkungsbehaftete Prozeduren mit einem Ausrufezeichen gekennzeichnet, z. B. in der Variablenzuweisung (set! a 2).

Einzelnachweise

<references> <ref name="Appelrath1999"> Hans-Jürgen Appelrath, Jochen Ludewig: Skriptum Informatik - eine konventionelle Einführung. Version vom 11. Februar 1999; Archiv vom 20. Mai 2018 </ref> </references>