Das andere Extrem ist, dass zwei Programme gleichwertig sind, wenn sie dieselbe Funktion berechnen (oder dasselbe beobachtbare Verhalten in ähnlichen Umgebungen zeigen). Aber das ist nicht gut: Nicht alle Programme, die die Primalität prüfen, sind gleich. Wir können eine Codezeile hinzufügen, die sich nicht auf das Ergebnis auswirkt, und betrachten sie dennoch als dasselbe Programm.
Dies ist kein Extrem: Die Programmäquivalenz muss in Bezug auf einen Beobachtungsbegriff definiert werden.
Die gebräuchlichste Definition in der PL-Forschung ist die kontextbezogene Äquivalenz. In der kontextuellen Äquivalenz besteht die Idee darin, dass wir Programme beobachten, indem wir sie als Komponenten größerer Programme (den Kontext) verwenden. Wenn also zwei Programme für alle Kontexte den gleichen Endwert berechnen, werden sie als gleich bewertet. Da diese Definition über alle möglichen Programmkontexte quantifiziert, ist es schwierig, direkt damit zu arbeiten. Ein typisches Forschungsprogramm in PL ist es daher, kompositorische Argumentationsprinzipien zu finden, die eine kontextuelle Äquivalenz implizieren.
Dies ist jedoch nicht der einzig mögliche Begriff der Beobachtung. Zum Beispiel können wir leicht sagen, dass das Speicher-, Zeit- oder Leistungsverhalten eines Programms beobachtbar ist. In diesem Fall gelten weniger Programmäquivalenzen, da mehr Programme unterschieden werden können (z. B. Mergesort kann jetzt von Quicksort unterschieden werden). Wenn Sie Sprachen entwickeln möchten, die immun gegen Timing-Channel-Angriffe sind, oder wenn Sie raumbegrenzte Programmiersprachen entwickeln möchten, müssen Sie dies tun.
Wir können auch beschließen, einige der Zwischenzustände einer Berechnung als beobachtbar zu beurteilen. Dies geschieht aufgrund der Möglichkeit von Interferenzen immer für gleichzeitige Sprachen. Sie können diese Ansicht aber auch für sequentielle Sprachen verwenden. Wenn Sie beispielsweise sicherstellen möchten, dass keine Berechnungen unverschlüsselte Daten im Hauptspeicher speichern, müssen Sie das Schreiben in den Hauptspeicher als beobachtbar betrachten.
Grundsätzlich gibt es keinen einheitlichen Begriff der Programmäquivalenz. es ist immer relativ zu dem Begriff der Beobachtung, den Sie auswählen, und das hängt von der Anwendung ab, die Sie im Auge haben.