Eine Semantik eines Programms ist ein Modell seines Verhaltens, das wie jedes wissenschaftliche Modell Aspekte ignoriert, die Sie nicht studieren möchten.
Ein äußerst detailliertes Modell der Ausführung eines Programms würde das physikalische Verhalten des Computers modellieren, der es ausführt, einschließlich der Ausführungszeit, des Stromverbrauchs, der elektromagnetischen Strahlung usw. Solche Aspekte werden sehr selten berücksichtigt, da sie sehr selten relevant sind. Trotzdem spielen sie manchmal eine Rolle: Ein nützliches Modell eines Flugzeugautopiloten muss Laufzeitinformationen enthalten, ein nützliches Modell der Sicherheit einer Kreditkarte muss elektromagnetische Strahlung enthalten, ...
In der typischen Semantik werden Nebenwirkungen wie Timing und Stromverbrauch ignoriert. Selbst wenn Sie in einer alltäglichen Umgebung einen Ausdruck an einer Haskell-Interpreter-Eingabeaufforderung eingeben, ist das Drucken des Ergebnisses ein Nebeneffekt (wenn Sie versuchen, ein unendliches Objekt auszudrucken, ist dies wichtig). Wenn dem Haskell-Interpreter der Speicher ausgeht, ist dies auch ein beobachtbarer Nebeneffekt in einem "realen" Modell, jedoch nicht in einem idealisierten Modell von Haskell, das effektiv unbegrenzte Berechnungen ermöglicht.
Ein beobachtbarer Nebeneffekt ist einer, der in der Semantik modelliert wird. In typischen Modellen von Programmiersprachen wird der Speicherverbrauch nicht modelliert, sodass eine Berechnung, die 1 TB Speicher erfordert, rein sein kann, auch wenn Sie versuchen, sie auf Ihrem PC auszuführen, würde dies beobachtbar fehlschlagen.
Eine andere Art von nicht beobachtbaren Nebenwirkungen ist eine Funktion, die innerhalb der Funktion liegt. Ich denke, das würden die meisten Semantiker denken, wenn sie über nicht beobachtbare Nebenwirkungen sprechen. Stellen Sie sich eine Berechnung vor, die veränderbare Daten intern verwendet, diese veränderlichen Daten jedoch nicht mit anderen Teilen des Programms teilt. Beispielsweise listet eine Listensortierfunktion, die ein Array mit denselben Elementen wie die Liste erstellt, das Array an Ort und Stelle sortiert und eine Liste zurück, die die Elemente als Array in ihrer endgültigen Reihenfolge enthält: Ein semantisches Modell von Unterausdrücken dieser Funktion weist eine Seite auf Effekte (Modifikationen des Arrays), aber die Funktion selbst hat keine externen Nebenwirkungen, so dass sie rein ist.
Betrachten Sie für ein subtileres Beispiel eine Funktion, die einige Daten in eine temporäre Datei schreibt und nach sich selbst bereinigt. In einer Semantik, in der immer genügend Platz für temporäre Dateien vorhanden ist und Programme keine temporären Dateien gemeinsam nutzen, hat die Funktion keine Nebenwirkungen. Die temporäre Datei fungiert als zusätzlicher Speicher, der von der Funktion verwendet wird. In einer Semantik, die die vollständigen Bedingungen des Dateisystems berücksichtigt, hat die Funktion einen Nebeneffekt - sie kann aufgrund äußerer Umstände fehlschlagen. In einer Semantik, die einen Absturz der Maschine ermöglicht, hat die Funktion einen Nebeneffekt: Wenn während der Ausführung der Funktion ein Absturz auftritt, wird die temporäre Datei möglicherweise zurückgelassen. In einer Semantik, die es gleichzeitig ausgeführten Programmen ermöglicht, die temporäre Datei anzuzeigen und möglicherweise zu ändern, hat die Funktion einen Nebeneffekt.