Was genau bedeutet "semantisch beobachtbare" Nebenwirkung?

11

Ich habe Fragen zu reinen Funktionen. Laut Wikipedia-Seite ist eine der Voraussetzungen für eine reine Funktion:

Die Auswertung des Ergebnisses verursacht keine semantisch beobachtbaren Nebenwirkungen oder Ausgaben, wie z. B. die Mutation veränderlicher Objekte oder die Ausgabe an E / A-Geräte.

Was bedeutet das nun wirklich? Oder wie kann ich einen Nebeneffekt erzielen, der semantisch nicht beobachtbar ist?

Henrik Sommerland
quelle
2
Sie sollten nicht zu viel Gewicht auf handwelliges Material legen, das Sie einmal auf Wikipedia gefunden haben.
Andrej Bauer
1
@AndrejBauer Huh? Was ist daran handgewellt? Vielleicht nicht auf Forschungsebene (es macht mir nichts aus, wenn dies auf Informatik migriert wird ) - obwohl angesichts Ihrer Reaktion vielleicht nicht.
Gilles 'SO - hör auf böse zu sein'
Ich glaube, ich mag den Ausdruck "semantisch beobachtbar" einfach nicht.
Andrej Bauer
1
Lassen Sie es mich anders sagen: Was ist der Unterschied zwischen "semantisch beobachtbar" und "beobachtbar"? "Semantisch" ist nur ein Schlagwort, das hier keinen Sinn ergibt.
Andrej Bauer
"semantisch" scheint in verschiedenen Bereichen der Programmiertheorie eine besondere Bedeutung zu haben, möglicherweise importiert aus der Linguistik / Philosophie, wo es Jahrzehnte zurückreicht, auch bekannt als "Syntax vs Semantik" .... vielleicht ist das genau dort eine andere Frage ....
vzn

Antworten:

11

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.

Gilles 'SO - hör auf böse zu sein'
quelle