Nebenwirkung (Informatik)

In der Informatik, einer Funktion oder dem Ausdruck wird gesagt, eine Nebenwirkung zu haben, wenn, zusätzlich zum Zurückbringen eines Werts, es auch einen Staat modifiziert oder eine erkennbare Wechselwirkung mit dem Benennen von Funktionen oder der Außenwelt hat. Zum Beispiel könnte eine Funktion eine globale oder statische Variable modifizieren, eines seiner Argumente modifizieren, eine Ausnahme erheben, Daten einer Anzeige oder Datei zu schreiben, Daten zu lesen, oder andere seitenbewirkende Funktionen zu nennen. In Gegenwart von Nebenwirkungen hängt ein Verhalten eines Programms von Geschichte ab; d. h. die Ordnung von Einschätzungssachen. Das Verstehen eines Programms mit Nebenwirkungen verlangt Kenntnisse über den Zusammenhang und seine möglichen Geschichten; und ist deshalb hart, zu lesen, zu verstehen und die Fehler zu beseitigen.

Nebenwirkungen sind die allgemeinste Weise, einem Programm zu ermöglichen, mit der Außenwelt (Leute, filesystems, andere Computer in Netzen) aufeinander zu wirken. Aber der Grad, an den Nebenwirkungen gewöhnt sind, hängt vom Programmierparadigma ab. Befehlende Programmierung ist für seine häufige Anwendung von Nebenwirkungen bekannt. In der funktionellen Programmierung werden Nebenwirkungen selten verwendet. Funktionelle Sprachen wie Normaler ML und Schema schränken Nebenwirkungen nicht ein, aber es ist für Programmierer üblich, um sie zu vermeiden. Die funktionelle Sprache Haskell schränkt Nebenwirkungen mit einem statischen Typ-System ein; es verwendet das Konzept von monads, um stateful und IO Berechnung zu tun.

Zusammenbau-Sprachprogrammierer müssen von verborgenen Nebenwirkungen - Instruktionen bewusst sein, die Teile des Verarbeiter-Staates modifizieren, die in der mnemonischen Instruktion nicht erwähnt werden. Ein klassisches Beispiel einer verborgenen Nebenwirkung ist eine arithmetische Instruktion, die ausführlich ein Register (eine offene Wirkung) modifiziert und implizit Bedingungscodes (eine verborgene Nebenwirkung) modifiziert. Ein Defekt eines Befehlssatzes mit vielen verborgenen Nebenwirkungen besteht darin, dass, wenn viele Instruktionen Nebenwirkungen auf einem einzelnen Stück des Staates wie Bedingungscodes haben, dann kann die Logik, die erforderlich ist, diesen Staat folgend zu aktualisieren, ein Leistungsengpass werden. Das Problem ist auf Verarbeitern besonders akut, die mit pipelining (seit 1990) oder mit in Unordnung der Ausführung entworfen sind. Solch ein Verarbeiter kann verlangen, dass zusätzliches Kontrollschaltsystem verborgene Nebenwirkungen entdeckt und die Rohrleitung einstellt, wenn die folgende Instruktion von den Ergebnissen jener Effekten abhängt.

Verweisungsdurchsichtigkeit

Die Abwesenheit von Nebenwirkungen ist notwendig, aber für die Verweisungsdurchsichtigkeit nicht genügend. Verweisungsdurchsichtigkeit bedeutet, dass ein Ausdruck (wie ein Funktionsanruf) durch seinen Wert ersetzt werden kann; das verlangt, dass der Ausdruck keine Nebenwirkungen hat und rein ist (immer gibt dieselben Ergebnisse auf demselben Eingang zurück).

Zeitliche Nebenwirkungen

Nebenwirkungen wegen der für eine Operation genommenen Zeit, um durchzuführen, werden gewöhnlich ignoriert, wenn man Nebenwirkungen und Verweisungsdurchsichtigkeit bespricht. In den meisten Programmen ist es wünschenswert, eine lange Operation durch eine Entsprechung kürzer das ein z.B Ersetzen dadurch zu ersetzen. Es gibt einige Fälle, solcher als mit dem Hardware-Timing oder der Prüfung, wo Operationen spezifisch für ihre zeitlichen Nebenwirkungen z.B eingefügt werden oder

Idempotence

Eine Nebenwirkung freie Funktion f ist immer idempotent (unter der folgenden Komposition f; f, nicht fungieren Komposition f  f).

Beispiel

Eine allgemeine Demonstration des Nebenwirkungsverhaltens ist die des Anweisungsmaschinenbedieners in C ++. Zum Beispiel gibt der Anweisungsmaschinenbediener das Recht operand zurück und hat die Nebenwirkung des Zuweisens dieses Werts zu einer Variable. Das berücksichtigt syntaktisch saubere vielfache Anweisung:

interne Nummer i, j;

i = j = 3;

</Quelle>

Weil der C ++ Anweisungsmaschinenbediener-Recht-Partner, das zu gleichwertig

istinterne Nummer i, j;

i = (j = 3);//j = 3 Umsatz 3, der dann mir zugeteilt wird

</Quelle>

Wo das Ergebnis, 3 in "j" zuzuteilen, dann in "i" zugeteilt wird. Das ist ein Potenzial hangup für Anfänger-Programmierer, die passend sind, zu verwechseln

während (b == wahr) {};//Tests, wenn b zu wahrem bewertet

</Quelle>

mit

während (b = wahr) {};//ist Das Ergebnis der Anweisungsfunktion "wahr", so bewertet die Schleife bedingt immer zu wahrem

</Quelle>

Siehe auch

  • Folge-Punkt
  • Handlung in einer Entfernung (Informatik)

Statistische Physik / Liste von Sciencefictionsredakteuren
Impressum & Datenschutz