Referenzielle Transparenz

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

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. das Endergebnis) von einem impliziten Zustand (z. B. dem 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, wird dort aber nicht als Gleichung, sondern als Zuweisung verstanden: Je nachdem, was in der Speicherzelle für x steht, wird die rechte Seite berechnet und das Ergebnis der linken Seite zugewiesen.

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 Variable main, deren Wert eine Aktionsbeschreibung des gesamten Programms ist. Aktionen können ausgeführt werden, indem ihre Beschreibung in den Wert von main eingebettet wird.