Nebenwirkung (Informatik)

Im Informatik, eine Operation, Funktion oder Ausdruck soll eine haben Nebeneffekt Wenn es einige modifiziert Zustand Variabler Wert (en) außerhalb seiner lokalen Umgebung, dh wenn er einen anderen beobachtbaren Effekt hat als der primäre Effekt der Rückgabe eines Wertes an den Invoker des Betriebs. Beispiel Nebenwirkungen umfassen das Ändern von a Nicht-lokale Variable, modifizieren a Statische lokale Variableein veränderliches Argument modifizieren durch Referenz bestanden, Leistung I/o oder andere Funktionen mit Nebenwirkungen aufrufen.[1] In Gegenwart von Nebenwirkungen kann das Verhalten eines Programms von der Geschichte abhängen. Das heißt, die Reihenfolge der Bewertung ist wichtig. Das Verständnis und Debuggen einer Funktion mit Nebenwirkungen erfordert Kenntnisse über den Kontext und seine möglichen Geschichten.[2][3]

Nebenwirkungen spielen eine wichtige Rolle bei der Gestaltung und Analyse von Programmiersprachen. Der Grad, in dem Nebenwirkungen verwendet werden, hängt vom Programmierparadigma ab. Zum Beispiel, Imperative Programmierung wird üblicherweise zur Erzeugung von Nebenwirkungen und zur Aktualisierung des Status eines Systems verwendet. Im Gegensatz, deklarative Programmierung wird üblicherweise verwendet, um über den Systemzustand ohne Nebenwirkungen zu berichten.

Funktionelle Programmierung Ziel ist es, Nebenwirkungen zu minimieren oder zu beseitigen. Das Fehlen von Nebenwirkungen erleichtert es einfacher zu tun formelle Überprüfung eines Programms. Die funktionale Sprache Haskell eliminiert Nebenwirkungen wie z. I/o und andere staatliche Berechnungen, indem sie sie durch ersetzen monadisch Aktionen.[4][5] Funktionale Sprachen wie z. Standard ml, Planen und Scala Beschränken Sie die Nebenwirkungen nicht, aber es ist üblich, dass Programmierer sie vermeiden.[6]

Montagesprache Programmierer müssen sich dessen bewusst sein versteckt Nebenwirkungen - Instruktionen, die Teile des Prozessorzustands modifizieren, die in der Mnemonik der Anweisung nicht erwähnt werden. Ein klassisches Beispiel für einen versteckten Nebeneffekt ist eine arithmetische Anweisung, die implizit ändert Bedingungscodes (ein versteckter Nebeneffekt), während es explizit a ändert a registrieren (die beabsichtigte Wirkung). Ein potenzieller Nachteil von a Befehlssatz Bei versteckten Nebenwirkungen ist es, dass, wenn viele Anweisungen Nebenwirkungen auf ein einzelnes Zustand wie Bedingungscodes haben, die Logik, die erforderlich ist, um diesen Zustand nacheinander zu aktualisieren, zu einem Leistungsengpass werden kann. Das Problem ist besonders akut bei einigen Prozessoren, die mit entworfenen Prozessoren entworfen wurden Pipelining (seit 1990) oder mit Ausführende Ausführung. Ein solcher Prozessor kann zusätzliche Steuerschaltungen benötigen, um versteckte Nebenwirkungen zu erkennen und die Pipeline zu beschränken, wenn der nächste Anweisungen von den Ergebnissen dieser Effekte abhängt.

Referenztransparenz

Das Fehlen von Nebenwirkungen ist eine notwendige, aber nicht ausreichende Bedingung für die Referenztransparenz. Referenztransparenz bedeutet, dass ein Ausdruck (z. B. einen Funktionsaufruf) durch seinen Wert ersetzt werden kann. Dies erfordert, dass der Ausdruck ist rein, das heißt, der Ausdruck muss sein deterministisch (Geben Sie immer das gleiche Wert für die gleiche Eingabe) und Nebeneffekt frei.

Zeitliche Nebenwirkungen

Nebenwirkungen, die durch die Zeit, die für eine Operation zur Ausführung benötigt wird, verursacht werden, werden normalerweise bei der Diskussion von Nebenwirkungen und Referenztransparenz ignoriert. Es gibt einige Fälle, z. Schlaf (5000) oder für (int i = 0; i <10000; ++ i) {}. Diese Anweisungen ändern den Zustand nicht, als sich eine Menge Zeit zu nehmen, um fertig zu werden.

Idempotenz

A Subroutine mit Nebenwirkungen ist idempotent, wenn mehrere Anwendungen der Unterroutine den gleichen Effekt auf den Systemzustand haben wie eine einzelne Anwendung, mit anderen Worten, wenn die Funktion vom Systemzustandsraum zu sich selbst, der mit der Unterroutine zugeordnet ist mathematischer Sinn. Betrachten Sie beispielsweise Folgendes Python Programm:

x = 0 def setx(n):  global x  x = n setx(3) behaupten x == 3 setx(3) behaupten x == 3 

setx ist idempotent, weil die zweite Anwendung von setx bis 3 hat den gleichen Effekt auf den Systemzustand wie die erste Anwendung: x wurde nach der ersten Anwendung bereits auf 3 gesetzt und ist nach der zweiten Anwendung immer noch auf 3 gesetzt.

A reine Funktion ist idempotent, wenn es in der idempotent ist mathematischer Sinn. Betrachten Sie beispielsweise das folgende Python -Programm:

def Abs(n):  Rückkehr -n wenn n < 0 anders n behaupten Abs(Abs(-3)) == Abs(-3) 

Abs ist idempotent, weil die zweite Anwendung von Abs zum Rückgabewert der ersten Anwendung auf -3 gibt den gleichen Wert wie die erste Anwendung auf -3 zurück.

Beispiel

Eine häufige Demonstration des Nebeneffektverhaltens ist das der der Aufgabenverwalter in C. Die Zuordnung a = b ist ein Ausdruck, der den gleichen Wert wie der Ausdruck bewertet bmit dem Nebeneffekt, die zu speichern R-Wert von b in die L-Wert von a. Dies ermöglicht mehrere Zuweisungen:

a = (b = 3);  // b = 3 bewertet 3, was dann a zugewiesen wird 

Weil der Bediener Rechte MitarbeiterDies entspricht der

a = b = 3; 

Dies stellt ein potenzielles Aufhängen für Anfängerprogrammierer dar, die sich möglicherweise verwirren

während (b == 3) {}  // Tests, wenn B auf 3 bewertet wird 

mit

während (b = 3) {}  // b = 3 bewertet 3, was dann zu True wirft, sodass die Schleife unendlich ist 

Siehe auch

Verweise

  1. ^ Spuler, David A.; Sajeev, A. S. M. (Januar 1994). Compiler -Erkennung von Funktionsaufruf Nebenwirkungen. James Cook University. Citeseerx 10.1.1.70.2096. Der Begriff Nebeneffekt bezieht sich auf die Modifikation der nichtlokalen Umgebung. Im Allgemeinen geschieht dies, wenn eine Funktion (oder eine Prozedur) eine globale Variable oder Argumente verändert, die von Referenzparametern übergeben wurden. Aber hier sind andere Möglichkeiten, wie die nichtlokale Umgebung geändert werden kann. Wir betrachten die folgenden Ursachen von Nebenwirkungen durch einen Funktionsaufruf: 1. Durchführen von E/A. 2. Globale Variablen ändern. 3. Modifizierung lokaler permanenter Variablen (wie statische Variablen in C). 4. Ändern eines Arguments, das von Bezug genommen wurde. 5. Ändern einer lokalen Variablen, entweder automatisch oder statisch, einer Funktion höher in der Funktionsaufrufsequenz (normalerweise über einen Zeiger).
  2. ^ Turner, D., ed.(1990). Forschungsthemen in der funktionalen Programmierung. Addison-Wesley.S. 17–42. Über Hughes, John. "Warum funktionale Programmierungen wichtig sind" (PDF).
  3. ^ Collberg. "CSC 520 Prinzipien der Programmiersprachen". Abteilung für Computerwissenschaften, Universität von Arizona.
  4. ^ "Haskell 98 Bericht". 1998.
  5. ^ Jones, Simon Peyton;Wadler, Phil (1993). Imperative funktionelle Programmierung.Konferenzaufzeichnung des 20. jährlichen ACM -Symposiums über Prinzipien von Programmiersprachen.S. 71–84.
  6. ^ Fellisen, Matthias;et al. "Wie man Programme entwirft" ". MIT Press.