Verweisungsdurchsichtigkeit (Informatik)

Verweisungsdurchsichtigkeit und Verweisungsundurchsichtigkeit sind Eigenschaften von Teilen von Computerprogrammen. Wie man sagt, ist ein Ausdruck Verweisungs-durchsichtig, wenn er durch seinen Wert ersetzt werden kann, ohne das Verhalten eines Programms zu ändern (mit anderen Worten, ein Programm nachgebend, das dieselben Effekten und Produktion auf demselben Eingang hat). Der entgegengesetzte Begriff ist Verweisungs-undurchsichtig.

Während in der Mathematik alle Funktionsanwendungen Verweisungs-durchsichtig sind, in der Programmierung davon ist nicht immer der Fall. Die Wichtigkeit von der Verweisungsdurchsichtigkeit besteht darin, dass sie dem Programmierer und dem Bearbeiter erlaubt, über das Programm-Verhalten vernünftig zu urteilen. Das kann im Beweis der Genauigkeit, der Vereinfachung eines Algorithmus, der Unterstützung beim Ändern des Codes helfen, ohne es zu brechen, oder Code mittels memoization, allgemeiner Subausdruck-Beseitigung oder parallelization zu optimieren.

Verweisungsdurchsichtigkeit ist einer der Grundsätze der funktionellen Programmierung; nur Verweisungs-durchsichtige Funktionen können memoized sein (umgestaltet in gleichwertige Funktionen, welches geheimes Lager resultiert). Einige Programmiersprachen stellen Mittel zur Verfügung, Verweisungsdurchsichtigkeit zu versichern.

Einige funktionelle Programmiersprachen machen Verweisungsdurchsichtigkeit für alle Funktionen geltend.

Da Verweisungsdurchsichtigkeit dieselben Ergebnisse für einen gegebenen Satz von Eingängen an jedem Punkt rechtzeitig verlangt, ist ein Verweisungs-durchsichtiger Ausdruck deshalb definitionsgemäß deterministisch.

Beispiele und Gegenbeispiele

Wenn alle am Ausdruck beteiligten Funktionen reine Funktionen sind, dann ist der Ausdruck Verweisungs-durchsichtig. Außerdem können einige unreine Funktionen in den Ausdruck eingeschlossen werden, wenn ihre Werte verworfen werden und ihre Nebenwirkungen unbedeutend sind.

Nehmen Sie eine Funktion, die keinen Rahmen- und Rückeingang von der Tastatur nimmt. Ein Anruf zu dieser Funktion könnte sein. Der Rückwert hängt davon ab, was der Benutzer eintippt, so können vielfache Anrufe mit identischen Rahmen (die leere Liste) verschiedene Ergebnisse zurückgeben. Deshalb, ist weder deterministisch noch Verweisungs-durchsichtig.

Ein feineres Beispiel ist das einer Funktion, die eine globale Variable (oder dynamisch scoped Variable oder ein lexikalischer Verschluss) verwendet, um ihm zu helfen, seine Ergebnisse zu schätzen. Da diese Variable als ein Parameter nicht passiert wird, aber verändert werden kann, können sich die Ergebnisse von nachfolgenden Anrufen zur Funktion unterscheiden, selbst wenn die Rahmen identisch sind. In der reinen funktionellen Programmierung wird zerstörender Anweisung nicht erlaubt; so kann eine Funktion, die global (oder dynamisch scoped) Variablen verwendet, oder kann je nachdem nicht Verweisungs-durchsichtig sein, ob die globalen Variablen unveränderlich sind.

Arithmetische Operationen sind Verweisungs-durchsichtig: Kann durch zum Beispiel ersetzt werden. Tatsächlich sind alle Funktionen im mathematischen Sinn Verweisungs-durchsichtig: Ist durchsichtig, da es immer dasselbe Ergebnis für jede Einzelheit geben wird.

Anweisungen sind nicht durchsichtig. Zum Beispiel ändert der C Ausdruck den der Variable zugeteilten Wert. Das Annehmen hat am Anfang Wert, zwei Konsekutiveinschätzungen des Ausdruck-Ertrags beziehungsweise, und. Klar gibt das Ersetzen entweder durch oder ein Programm mit der verschiedenen Bedeutung, und so ist der Ausdruck nicht Verweisungs-durchsichtig. Jedoch, eine Funktion nennend, die durchsichtig ist, weil sie den Eingang x nicht implizit ändern wird und so keine solche Nebenwirkungen hat.

ist

nicht durchsichtig, als ob Sie es bewerten und es durch seinen Wert ersetzen (sagen Sie "Jan 1, 2001"), Sie bekommen dasselbe Ergebnis nicht, wie Sie werden, wenn Sie es Morgen führen. Das ist, weil es von einem Staat (die Zeit) abhängt.

Unähnlichkeit zur befehlenden Programmierung

Wenn der Ersatz eines Ausdrucks mit seinem Wert nur an einem bestimmten Punkt in der Ausführung des Programms gültig ist, dann ist der Ausdruck nicht Verweisungs-durchsichtig. Die Definition und Einrichtung dieser Folge-Punkte sind das theoretische Fundament der befehlenden Programmierung und der Teil der Semantik einer befehlenden Programmiersprache.

Jedoch, weil ein Verweisungs-durchsichtiger Ausdruck jederzeit bewertet werden kann, ist es nicht notwendig, Folge-Punkte noch jede Garantie der Ordnung der Einschätzung überhaupt zu definieren. Die Programmierung ausgekommen diese Rücksichten wird rein funktionelle Programmierung genannt.

Ein Vorteil, Code in einem Verweisungs-durchsichtigen Stil zu schreiben, ist das gegeben ein intelligenter Bearbeiter, statische Codeanalyse ist leichter, und bessere codeverbessernde Transformationen sind automatisch möglich. Zum Beispiel, wenn es in C programmieren wird, wird es eine Leistungsstrafe für das Umfassen eines Anrufes zu einer teuren Funktion innerhalb einer Schleife geben, selbst wenn der Funktionsanruf außerhalb der Schleife bewegt werden konnte, ohne die Ergebnisse des Programms zu ändern. Der Programmierer würde gezwungen, manuelle Codebewegung des Anrufs vielleicht auf Kosten der Quellcodelesbarkeit durchzuführen. Jedoch, wenn der Bearbeiter im Stande ist zu beschließen, dass der Funktionsanruf Verweisungs-durchsichtig ist, kann es diese Transformation automatisch durchführen.

Der primäre Nachteil von Sprachen, die Verweisungsdurchsichtigkeit geltend machen, ist, dass sie den Ausdruck von Operationen macht, die natürlich eine Befehlsform der Folge Schritte Programmierung des Stils ungeschickter und weniger kurz passen. Solche Sprachen vereinigen häufig Mechanismen, diese Aufgaben leichter zu machen, während sie die rein funktionelle Qualität der Sprache, wie bestimmte Klausel-Grammatiken und monads behalten.

Mit der Verweisungsdurchsichtigkeit wird kein Unterschied gemacht oder zwischen einer Verweisung auf ein Ding und dem entsprechenden Ding selbst anerkannt. Ohne Verweisungsdurchsichtigkeit kann solcher Unterschied leicht gemacht und in Programmen verwertet werden.

Ein anderes Beispiel

Als ein Beispiel, wollen wir zwei Funktionen, diejenige verwenden, die, und der andere Verweisungs-undurchsichtig ist, der Verweisungs-durchsichtig ist:

globalValue = 0;

Funktion der ganzen Zahl rq (ganze Zahl x)

beginnen Sie

globalValue = globalValue + 1;

geben Sie x + globalValue zurück;

Ende

Funktion der ganzen Zahl rt (ganze Zahl x)

beginnen Sie

geben Sie x + 1 zurück;

Ende</pre>

Die Funktion ist Verweisungs-durchsichtig, was das wenn bedeutet. Zum Beispiel, und so weiter. Jedoch können wir kein solches Ding dafür sagen, weil es eine globale Variable verwendet, die es modifiziert.

Die Verweisungsundurchsichtigkeit dessen macht das Denken über Programme schwieriger. Sagen Sie zum Beispiel, dass wir über die folgende Behauptung vernünftig urteilen möchten:

ganze Zahl p = rq (x) + rq (y) * (rq (x) - rq (x));

Man kann geneigt sein, diese Behauptung zu vereinfachen, zu:

ganze Zahl p = rq (x) + rq (y) * (0);

ganze Zahl p = rq (x) + 0;

ganze Zahl p = rq (x);

Jedoch wird das dafür nicht arbeiten, weil jedes Ereignis dessen zu einem verschiedenen Wert bewertet. Erinnern Sie sich, dass der Rückwert dessen auf einem globalen Wert basiert, der in nicht passiert wird, und der auf jedem Anruf modifiziert wird. Das bedeutet, dass mathematische Identität solcher als nicht mehr hält.

Solche mathematische Identität wird für Verweisungs-durchsichtige Funktionen solchen als halten.

Jedoch kann eine hoch entwickeltere Analyse verwendet werden, um die Behauptung zu vereinfachen, zu:

ganze Zahl = globalValue; ganze Zahl p = x + + 1 + (y + + 2) * (x + + 3 - (x + + 4)); globalValue = globalValue + 4;

ganze Zahl = globalValue; ganze Zahl p = x + + 1 + (y + + 2) * (x + + 3 - x - - 4)); globalValue = globalValue + 4;

ganze Zahl = globalValue; ganze Zahl p = x + + 1 + (y + + 2) *-1; globalValue = globalValue + 4;

ganze Zahl = globalValue; ganze Zahl p = x + + 1 - y - - 2; globalValue = globalValue + 4;

ganze Zahl p = x - y - 1; globalValue = globalValue + 4;

Das macht mehr Schritte und verlangt einen Grad der Scharfsinnigkeit in den für die Bearbeiter-Optimierung unausführbaren Code.

Deshalb erlaubt Verweisungsdurchsichtigkeit uns, über unseren Code vernünftig zu urteilen, der zu robusteren Programmen, der Möglichkeit führen wird, Programmfehler zu finden, die wir nicht hoffen konnten zu finden, indem wir, und die Möglichkeit geprüft haben, Gelegenheiten für die Optimierung zu sehen.

Siehe auch


Schelm / Reaganomics
Impressum & Datenschutz