- Referenzielle Transparenz
-
Die Referenzielle Transparenz besagt, dass der Wert eines Ausdrucks in einem Quelltext nur von seiner Umgebung abhängt und nicht vom Zeitpunkt seiner Auswertung. Dies ist eine wichtige Eigenschaft des deklarativen Programmierparadigmas.
In der Mathematik gilt, dass ein und dieselbe Variable an verschiedenen Stellen ihres Geltungsbereichs immer den gleichen Wert hat. Dies gilt in imperativen Programmiersprachen nicht, da die Programmsemantik (z. B. Endergebnis) von einem impliziten Zustand (z. B. Speicherinhalt) abhängt.
x = x + 1
Formal analysiert ist diese Gleichung eine nicht lösbare Aussage, was heißt, es existiert kein x, das die Gleichung wahr macht. Trotzdem ist diese Zeile in imperativen Programmiersprachen möglich. Je nachdem, was in der Speicherzelle für x steht, wird die rechte Seite damit erzeugt und die linke Seite berechnet.
Möchte man aber Programmeigenschaften mathematisch beweisen (z. B. liefert das Programm wirklich das, was es soll), dann dürfen solche Nebeneffekte nicht auftreten. In der deklarativen Programmierung gilt hingegen das Prinzip der referenziellen Transparenz und als Konsequenz daraus das Substitutionsprinzip. Danach kann ein Ausdruck immer durch einen anderen gleichen Wertes ersetzt werden ohne dass dies Auswirkungen auf die Programmsemantik hat. Das Ziel von solchen Programmtransformationen ist die Ersetzung von aufwändig durch einfach zu berechnende Ausdrücke.
Das Prinzip der referenziellen Transparenz wirft aber auch Probleme auf. So ist das einfache Auslesen eines mit der Tastatur eingegeben Zeichens nicht direkt möglich; solch eine Funktion - wie
getchar
in C - ist nicht erlaubt. Jedes Mal wäre der Rückgabewert abhängig von der Eingabe des Benutzers. Damit entstünden Kommunikationsprobleme mit der Umgebung.So werden z. B. in Haskell Aktionen, die mit der Umgebung interagieren können, als Werte des Datentyps
IO
beschrieben. Mittels spezieller Operatoren können aus elementaren Aktionsbeschreibungen komplexe Beschreibungen konstruiert werden. Jedes Haskell-Programm definiert eine Variablemain
, deren Wert eine Aktionsbeschreibung des gesamten Programms ist. Aktionen können ausgeführt werden, indem ihre Beschreibung in den Wert vonmain
eingebettet wird.
Wikimedia Foundation.