Referenzielle Transparenz ist ein Merkmal von Teilen von Computerprogrammen. Ein Teil eines Programms wird als "referentiell transparent" bezeichnet, wenn er durch den Wert ersetzt werden kann, den er zurückgibt, ohne das Verhalten des Programms zu verändern. Eine referentiell transparente Funktion muss rein sein - sie muss immer die gleiche Ausgabe liefern, wenn sie die gleiche Eingabe nimmt, und sie darf keine Nebeneffekte haben - Teile des Programms, die eine andere Aktion ausführen als die Rückgabe eines Wertes. Das Gegenteil von referentieller Transparenz ist referentielle Opazität.

In der Mathematik sind alle Funktionen referentiell transparent, weil eine mathematische Funktion nur Werte aufnehmen und einen Wert ausspucken kann. In der Programmierung ist dies nicht immer richtig - eine Funktion könnte auch herausfinden, welcher Tag des Jahres es ist, oder eine Nachricht auf dem Bildschirm ausgeben. Wegen dieses Unterschieds verwenden einige Leute andere Namen für Funktionen in der Programmierung, wie z.B. Prozeduren.

Die referentielle Transparenz lässt Programmierer und Compiler Code als ein Umschreibungssystem betrachten - etwas, das einen Ausdruck nimmt und ihn durch etwas anderes ersetzt. Dies kann bei verschiedenen Aufgaben hilfreich sein, wie zum Beispiel

  • Der Beweis, dass das Programm oder der Code korrekt ist - dass es genau das tut, was es tun soll, egal was passiert.
  • Einen Algorithmus einfacher machen.
  • Das macht es einfacher, den Code zu ändern und trotzdem sicher zu sein, dass er das tut, was er tun soll.
  • Den Code schneller oder auf eine Art und Weise laufen zu lassen, die weniger Speicher verbraucht.

Es gibt verschiedene Möglichkeiten, die letzte Aufgabe zu erledigen - die bekanntesten sind Memoisierung (Speichern von Antworten nach dem ersten Mal), Eliminierung von Unterausdrücken (herausfinden, ob es sich lohnt, zwei gleiche Teile des Codes zu kombinieren), faule Auswertung (die Antwort erst dann finden, wenn der Code sie wirklich braucht) und Parallelisierung (gleichzeitiges Arbeiten an mehreren Problemen).