Frage

Was den Begriff tut Referenz Transparenz das? Ich habe gehört, es als „es bedeutet, dass Sie ersetzen können gleich mit Gleichen“, aber dies scheint wie eine unzureichende Erklärung.

War es hilfreich?

Lösung

Der Begriff „Referenz Transparenz“ kommt von analytischer Philosophie , der Zweig der Philosophie, die Natur Analysen Sprachkonstrukte, Aussagen und Argumente basieren auf den Methoden der Logik und Mathematik. Mit anderen Worten ist es das nächstgelegene Objekt außerhalb der Informatik zu dem, was wir nennen Programmiersprache Semantik . Der Philosoph Willard Quine war verantwortlich für das Konzept der referentiellen Transparenz initiieren, aber es war auch implizit in der Ansätze von Bertrand Russell und Alfred Whitehead.

Im Kern „referentielle Transparenz“ ist eine sehr einfache und klare Vorstellung. Der Begriff „referent“ wird in der analytischen Philosophie verwendet, darüber zu sprechen das, was ein Ausdruck bezieht sich auf . Es ist in etwa das gleiche wie das, was wir mit „Sinn“ oder „Bezeichnung“ in Programmiersprache Semantik bedeuten. Mit Andrew Birkett dem Beispiel ( Blog-Post ) bezieht sich der Begriff „die Hauptstadt von Schottland“ an die Stadt Edinburgh. Das ist ein einfaches Beispiel für einen „referenten“.

Ein Kontext in einem Satz ist „referentiell transparent“, wenn sie von einem anderen Begriff einen Begriff in diesem Zusammenhang zu ersetzen, dass auf die gleiche Einheit bezieht sich nicht die Bedeutung verändern. Zum Beispiel

  

Das schottische Parlament trifft sich in der Hauptstadt von Schottland.

bedeutet dasselbe wie

  

Das schottische Parlament trifft sich in Edinburgh.

So ist der Kontext „Das schottische Parlament trifft sich in ...“ ist ein referentiell transparent Kontext. Wir können „um die Hauptstadt von Schottland“ mit „Edinburgh“ ersetzen, ohne den Sinn zu verändern. Anders ausgedrückt, nur der Kontext kümmert sich um, was der Begriff bezieht sich auf und nichts anderes. Das ist der Sinn, in dem der Kontext „referentiell transparent.“

Auf der anderen Seite, in dem Satz:

  

Edinburgh ist seit 1999 die Hauptstadt von Schottland gewesen.

Wir können einen solchen Austausch nicht tun. Wenn wir das täten, würden wir „Edinburgh war Edinburgh seit 1999“, erhalten, die ein nussig, was zu sagen, und nicht die gleiche Bedeutung wie der ursprünglichen Satz vermitteln. So scheint es, dass der Kontext „Edinburgh ist seit ... seit 1999“ referenziell undurchsichtig ist (das Gegenteil von referentiell transparent). Es kümmert sich offenbar über etwas mehr als das, was der Begriff bezieht. Was ist das?

Dinge wie „die Hauptstadt von Schottland“ genannt bestimmte Begriffe und sie gaben keine magere Menge an Kopfschmerzen zu Logiker und Philosophen für eine lange Zeit. Russell und Quine sortierten sich aus sagen, dass sie nicht wirklich „referentielle“ sind, das heißt, es ist ein Fehler, dass die obigen Beispiele zu denken verwendet werden, um Einheiten zu beziehen. Der richtige Weg „Edinburgh war die Hauptstadt von Schottland seit 1999“ heißt

zu verstehen
  

Schottland ist seit 1999 Hauptstadt hat und dass das Kapital Edinburgh.

Dieser Satz kann nicht auf einen nussigen verwandelt werden. Problem gelöst! Der Punkt von Quine war zu sagen, dass natürliche Sprache ist etwas chaotisch, oder zumindest kompliziert, weil es gemacht wird bequem für den praktischen Gebrauch zu sein, aber Philosophen und Logiker sollte Klarheit bringen, indem sie auf die richtige Art und Weise zu verstehen. Bezugs Transparenz ist ein Werkzeug verwendet werden soll für die Erhebung solcher Klarheit der Bedeutung .

Was hat das alles mit der Programmierung zu tun? Nicht sehr viel, eigentlich. Wie gesagt, ist referentielle Transparenz ein Werkzeug in Verstehen von Sprache verwendet werden soll, das heißt, bei der Zuordnung von bedeutet . grundlegende Konzepte in Programmiersprachen ", die im Internet verfügbar ist . es ist ein schönes Papier und jeder kann es lesen und verstehen also, tun Sie dies bitte Sie viel erleuchtet sein wird, führt er den Begriff „Referenz Transparenz“ in diesem Absatz:...

  

Eine der nützlichsten Eigenschaften von Ausdrücken, die von Quine Referenz aufgerufen   Transparenz. Im Wesentlichen bedeutet dies, dass, wenn wir fi nden Sie den Wert eines Ausdrucks wollen die   enthält einen Unterausdruck, wir das einzige, was müssen über die Unterausdruck wissen ist, seine   Wert. Alle anderen Merkmale der Unterausdruck, wie seine innere Struktur, die Anzahl   und die Art ihrer Komponenten, die Reihenfolge, in der sie ausgewertet werden oder die Farbe der Tinte   in der sie geschrieben, wird auf den Wert des Haupt Ausdrucks irrelevant.

Die Verwendung von „im Wesentlichen“ legt nahe, dass Strachey es um paraphrasiert es in einfachen Worten zu erklären. Funktionale Programmierer scheinen diesen Absatz auf ihre eigene Weise zu verstehen. Es gibt 9 weitere Vorkommen von „referentielle Transparenz“ in dem Papier, aber sie scheinen nicht über alle anderen zu stören. In der Tat wird das gesamte Papier von Strachey gewidmet Erklärung die Bedeutung von imperativen Programmiersprachen . Aber heute, funktionale Programmierer behaupten, dass imperativen Programmiersprachen sind nicht referentiell transparent. Strachey würde sich im Grab umdrehen.

Wir können die Situation retten. Wir sagten, dass natürliche Sprache „chaotisch, oder zumindest kompliziert“ ist, weil es gemacht ist für den praktischen Gebrauch bequem. Programmiersprachen sind die gleiche Weise. Sie sind „chaotisch, oder zumindest kompliziert“, weil sie gemacht werden für den praktischen Gebrauch bequem. Das bedeutet nicht, dass sie uns verwirren müssen. Sie haben genau die richtige Art und Weise zu verstehen, eine Meta-Sprache, die referentiell transparent ist, so dass wir Klarheit Bedeutung haben. In dem Papier, das ich zitierte, tut Strachey genau das. Er erklärt die Bedeutung von imperativen Programmiersprachen, indem sie nach unten in elementare Konzepte zu brechen, nie überall Klarheit zu verlieren. Ein wichtiger Teil seiner Analyse darauf hin, dass Ausdrücke in Programmiersprachen hat zwei Arten von „Werten“, die so genannten l-Werte und r-Werte . Vor Stracheys Papier wurde nicht verstanden und Verwirrung herrschte. Heute ist die Definition von C erwähnt sie routinemäßig und jeder C-Programmierer versteht die Auszeichnung. (Ob die Programmierer in anderen Sprachen verstehen es ebenso gut ist schwer zu sagen.)

Sowohl Quine und Strachey wurden mit der Bedeutung von Sprachkonstrukten besorgt darüber, dass irgendeine Form von Kontextabhängigkeit beinhalten. Zum Beispiel unseres Beispiel „Edinburgh ist seit 1999 die Hauptstadt von Schottland gewesen“ bedeutet die Tatsache, dass „Hauptstadt von Schottland“ auf den Zeitpunkt, an den es hängt davon betrachtet wird. Solche Kontextabhängigkeit ist eine Realität, die beide in natürlichen Sprachen und Programmiersprachen. Auch in der funktionalen Programmierung, sind freie und gebundene Variablen in Bezug auf den Kontext interpretiert werden, in dem sie erscheinen in. Kontextabhängigkeit jeglicher Art Blöcke Referenz Transparenz in irgendeiner Weise oder die andere. Wenn Sie versuchen, die Bedeutung von Begriffen, ohne Rücksicht auf die Kontexte zu verstehen, sie hängen von, würden Sie wieder mit Verwirrung enden. Quine wurde mit der Bedeutung der modalen Logik betroffen. Er hielt, dass Modallogik war referenziell undurchsichtig und es sollte durch das Übersetzen gereinigt werden in ein referenziell transparent Rahmen (beispielsweise durch die Notwendigkeit, wie in Bezug auf provability). Er verlor weitgehend diese Debatte. Logiker und Philosophen gefunden gleichermaßen möglich Welt Semantik der Kripke vollkommen ausreichend zu sein. Ähnliche Situation herrscht auch mit imperativen Programmierung. Staatlich Abhängigkeit erklärt von Strachey und Speicher-Abhängigkeit erklärt Reynolds (in ähnlicher Weise wie in Kripkes möglicher Welt Semantik) ist vollkommen ausreichend. Funktionale Programmierer wissen nicht viel von dieser Forschung. Ihre Ideen auf referentielle Transparenz sind mit einem großen Körnchen Salz genommen werden.

[Zusätzliche Anmerkung: Die obigen Beispiele zeigen, dass ein einfacher Satz wie „Hauptstadt von Schottland“ mehrere Bedeutungsebenen hat. Auf einer Ebene, könnten wir über die Hauptstadt zum jetzigen Zeitpunkt sprechen. Auf einer anderen Ebene könnten sprechen wir über alle möglichen Kapitelle, die Schottland könnte durch den Lauf der Zeit hat. Wir können „Zoom in“ einem bestimmten Kontext und „Verkleinern“, um alle Zusammenhänge in der normalen Praxis ganz leicht zu überbrücken. Die Effizienz der natürlichen Sprache nutzt unsere Fähigkeit, dies zu tun. Imperativen Programmiersprachen sind effizient in sehr viel die gleiche Weise. Wir können eine Variable x auf der rechten Seite einer Zuweisung (den r-Wert ) über seinen Wert in einem bestimmten Zustand zu sprechen. Oder könnten wir über seinen l-Wert sprechen, die alle Staaten erstreckt. Die Menschen sind durch solche Dinge selten verwirrt. Jedoch können sie oder nicht in der Lage sein, genau die Schichten alle inhärenten zu erklären Bedeutungs in Sprachkonstrukte. Alle diese Schichten von Bedeutung sind nicht notwendigerweise ‚offensichtlich‘, und es ist eine Frage der Wissenschaft, sie richtig zu studieren. die Sprachlosigkeit der gewöhnlichen Menschen jedoch solche Schicht Bedeutungen zu erklären, bedeutet nicht, dass sie über sie verwirrt sind.]

Eine separate "Postscript" unten bezieht sich diese Diskussion auf die Anliegen der funktionalen und imperativen Programmierung .

Andere Tipps

Referenz Transparenz, ein Begriff, der häufig in der funktionalen Programmierung verwendet wird, bedeutet, dass eine Funktion gegeben und ein Eingabewert, werden Sie immer die gleiche Leistung erhalten. Das heißt es gibt keinen externen Zustand in der Funktion verwendet.

Hier ist ein Beispiel einer Referenz transparent Funktion:

int plusOne(int x)
{
  return x+1;
}

Mit einer Referenz transparent Funktion, der einen Eingang und eine Funktion gegeben, könnte man es mit einem Wert ersetzen, anstatt die Funktion aufrufen. Anstatt also PlusOne mit einem Parameter von 5 zu nennen, könnten wir einfach ersetzen, die mit 6.

Ein weiteres gutes Beispiel ist die Mathematik im Allgemeinen. In der Mathematik eine Funktion und einen Eingangswert gegeben, wird es auf den gleichen Ausgangswert abzubilden immer. f (x) = x + 1. Daher Funktionen in Mathematik sind referenziell transparent.

Dieses Konzept ist wichtig für Forscher, weil es bedeutet, dass, wenn Sie eine referentiell transparente Funktion haben, es selbst zu einfacher automatischer Parallelisierung und Caching verleiht.

Referenz Transparenz wird immer in funktionalen Sprachen wie Haskell verwendet.

-

Im Gegensatz gibt es das Konzept von Referenz Undurchsichtigkeit. Dies bedeutet das Gegenteil. Aufruf der Funktion erzeugen kann nicht immer die gleiche Leistung.

//global G
int G = 10;

int plusG(int x)
{//G can be modified externally returning different values.
  return x + G;
}

Ein weiteres Beispiel ist eine Elementfunktion in einer objektorientierten Programmiersprache. Member-Funktionen arbeiten üblicherweise auf seinen Mitgliedsvariablen und daher wären Referenz undurchsichtig. Member-Funktionen allerdings können natürlich referentiell transparent sein.

Ein weiteres Beispiel ist eine Funktion, die aus einer Textdatei liest und druckt die Ausgabe. Diese externe Textdatei kann jederzeit geändert werden, so dass die Funktion referenziell undurchsichtig sein würde.

A referenziell transparent Funktion ist eine, die nur an seinem Eingang abhängt.

[Dies ist ein Nachtrag zu meiner Antwort vom 25. März, in dem Bemühen, die Diskussion zu bringen, näher an die Belange der Funktions- / imperative Programmierung.]

Die funktionalen Programmierer Idee von Referenz Transparenz scheint aus der Standard-Vorstellung auf drei Arten zu unterscheiden:

  • Während die Philosophen / Logiker Begriffe wie "Referenz" verwenden, "denotation", "Designatum" und " bedeutung " (Freges deutscher Begriff), funktionale Programmierer verwenden den Begriff "Wert" . (Dies ist nicht ganz ihr zu tun. Ich stelle fest, dass Landin, Strachey und deren Nachkommen auch den Begriff „Wert“ verwendet, um Referenz / denotation zu sprechen. Es mag sein, nur eine terminologische Vereinfachung, die Landin und Strachey eingeführt, aber es scheint ein machen großer Unterschied, wenn sie in einer naiven Art und Weise verwendet wird.)

  • Functional Programmierer scheinen zu glauben, dass diese „Werte“ gibt es innerhalb der Programmiersprache, nicht außerhalb. Dabei unterscheiden sie sich von den beiden Philosophen und die Programmiersprache Semantikern.

  • Sie scheinen zu glauben, dass diese "Werte" sollen durch Auswertung zu erhalten.

Zum Beispiel des Wikipedia-Artikel über referentielle Transparenz sagt, an diesem Morgen:

  

Ein Ausdruck gesagt wird referenziell transparent sein, wenn es ohne Änderung des Verhaltens eines Programms mit seinem Wert ersetzt werden kann (mit anderen Worten, wodurch man ein Programm, das die gleichen Wirkungen und Ausgang am gleichen Eingang hat).

Das ist völlig im Widerspruch mit dem, was die Philosophen / Logiker sagen. Sie sagen, dass ein Kontext Referenz oder referentiell transparent, wenn ein Ausdruck in diesem Zusammenhang durch eine andere ersetzt werden kann, Ausdruck , die auf dasselbe hinaus bezieht sich (a coreferential Ausdruck). Wer sind diese Philosophen / Logiker? Dazu gehören Frege , Russell , Whitehead , Carnap , Quine , Landin :

  

(a) jeder Ausdruck hat ein   Verschachtelung subexpression Struktur, (b) jeder subexpression    bezeichnet etwas (in der Regel eine Zahl, Wahrheitswert oder   numerische Funktion) , (c) die Sache ein Ausdruck bezeichnet,   das heißt, hängt nur von den Werten seiner sub-, sein „Wert“   Ausdrücke, nicht auf andere Eigenschaften von ihnen. [Hervorhebungen]

Stoy :

  

Das einzige, was zu einem Ausdruck zählt, ist sein Wert, und jede subexpression kann sein   von anderen gleichen Wert [Hervorhebungen] ersetzt. Darüber hinaus ist der Wert eines Ausdrucks, in gewissen Grenzen, das gleiche, wenn es auftritt“.

Vogel und Wadler :

  

den Wert eines Ausdrucks hängt nur von den Werten seiner konstituierenden   Ausdrücke (falls vorhanden), und diese Teilausdrücke können frei von andere ersetzt werden   besitzt den gleichen Wert [Hervorhebungen].

So im Nachhinein die Bemühungen von Landin und Strachey die Terminologie zu vereinfachen, indem „Referenz“ / „denotation“ mit „Wert“ ersetzen könnte unklug gewesen sein. Sobald man von einem „Wert“ hört, gibt es eine Versuchung eines Evaluierungsprozesses zu denken, die er führt. Ebenso ist es verlockend zu denken, was auch immer die Auswertung erzeugt als „Wert“, auch wenn es ganz klar, könnte sein, dass das nicht die denotation ist. Das ist, was ich sammeln in den Augen der funktionellen Programmierer auf das Konzept der „referentiellen Transparenz“ geschehen sein. Aber der „Wert“, die von den frühen Semantikern gesprochen wurde ist nicht das Ergebnis einer Auswertung oder die Ausgabe einer Funktion oder einer solchen Sache. Es ist die Bezeichnung des Begriffs.

Sobald wir den so genannten „Wert“ ein Ausdrucks ( „Referenz“ oder „Bezeichnung“ in der klassischen Philosophen Diskurs) als komplexes mathematisches / konzeptionelles Objekt, alle Arten von Möglichkeiten verstehen zu erschließen.

  • Strachey interpretiert Variablen in imperativen Programmiersprachen wie L-Werte , wie in meiner 25. März Antwort erwähnt, die ein hoch entwickelte konzeptionelles Objekt, das keine direkte Vertretung in der Syntax einer Programmiersprache hat .
  • Er interpretiert auch Befehle in Sprachen wie Staat zu Staat Funktionen, eine andere Instanz eines komplexen mathematischen Objekt, das kein „Wert“ in der Syntax.
  • Selbst eine Seite Bewirkung Funktionsaufruf in C hat einen gut definierte „Wert“ als Zustandsübertrager, die Zustände auf Paare von Zuständen und Werten (die sogenannten „monadisch“ in funktionellem Programmierer Terminologie) abbildet.

Die Zurückhaltung der funktionellen Programmierer solche Sprachen zu nennen „referentiell transparent“ bedeutet lediglich, dass sie nur ungern solche komplexe mathematische / konzeptuellen Objekte zugeben als „Werte“. Auf der anderen Seite scheinen sie durchaus bereit, einen „Wert“ einen Zustand Transformator zu rufen, wenn sie in ihrer eigenen Lieblings-Syntax und gekleidet mit einem Schlagwort wie „Monade“ gesetzt wird. Ich muss sagen, dass sie völlig unvereinbar sind zu sein, auch wenn wir es ihnen gewähren, dass ihre Idee der „referentiellen Transparenz“ eine gewisse Kohärenz hat.

Ein wenig Geschichte könnte etwas Licht auf werfen, wie diese Verwirrungen entstanden ist. Der Zeitraum zwischen 1962 bis 1967 war ein sehr intensiver ein für Christopher Strachey. Zwischen 1962-1965 nahm er einen Teilzeitjob als wissenschaftlicher Mitarbeiter mit Maurice Wilkes zu entwerfen und die Programmiersprache zu implementieren, die als CPL bekannt wurde. Dies war eine imperative Programmiersprache, aber gemeint war, als auch leistungsstarke funktionale Programmiersprache Fähigkeiten zu haben. Landin, der einen Mitarbeiter von Strachey in seiner Beratungsfirma war, hatte einen großen Einfluss auf Stracheys Ansicht von Programmiersprachen. Im Grenzstein 1965 Papier „ Next 700 Programmiersprachen “, ungeniert Landin funktionalen Programmiersprachen (nannte sie fördert denotativen Sprachen) und beschreibt imperativen Programmiersprachen als „Gegenpol“. In der anschließenden Diskussion finden wir Strachey Zweifel an Landin des starken Position zu erhöhen.

  

... DLs Form   eine Teilmenge aller Sprachen. Sie sind eine interessante Untergruppe, sondern ein   Das ist unbequem zu verwenden, wenn Sie es gewohnt sind. Wir brauchen   sie, weil zur Zeit wir nicht wissen, wie zu konstruieren   Beweise mit Sprachen, die Imperative und Sprünge enthalten. [Hervorhebungen]

Im Jahr 1965 nahm Strachey die postulierenIon eines Reader in Oxford und scheint eine Theorie der Imperative auf die Entwicklung und springt im Wesentlichen Vollzeit gearbeitet zu haben. Bis 1967 war er mit einer Theorie bereit, die er in seinem Kurs „ Grundlegende Konzepte in der Programmierung gelehrt Sprachen “in einer Sommerschule Kopenhagen. Die Skriptum sollten veröffentlicht wurden, aber „leider wegen säumig Bearbeitung, das Verfahren nie verwirklicht; mögen viel, aber die Strachey in Oxford Arbeit, die Papier hatte einen einflussreichen privaten Umlauf.“( Martin Campbell-Kelly )

Die Schwierigkeit Stracheys Schriften zu erhalten, auf die Verwirrungen geführt haben könnte propagiert, mit Leuten auf sekundären Quellen und Hörensagen verlassen. Aber jetzt, dass „ Grundlegende Konzepte “ im Web leicht verfügbar ist, gibt es keine müssen greifen Arbeit zu erraten. Wir sollten es lesen und unsere eigene Meinung bilden, was Strachey gemeint. Insbesondere gilt Folgendes:

  • In Abschnitt 3.2 befasst er sich mit „Ausdrücke“, wo er über „R-Wert Bezugs Transparenz“ spricht.
  • Sein Abschnitt 3.3 befasst sich mit „Befehle“, wo er über „L-Wert Bezugs Transparenz“ spricht.
  • In Abschnitt 3.4.5, spricht er über „Funktionen und Routinen“ und erklärt, dass „jede Abweichung von R-Wert Bezug Transparenz in einem R-Wert Zusammenhang sollte entweder durch Zersetzen des Ausdrucks in mehrere Befehle eliminiert und einfacher Ausdrücke, oder, wenn dies erweist sich als schwierig, die Gegenstand eines Kommentars. "

Jede Rede von „referentielle Transparenz“, ohne die Unterscheidung zwischen L-Werten zu verstehen, R-Werten und anderen komplexen Objekten, die der Imperativs Programmierer konzeptuelle Universum bevölkern ist grundsätzlich falsch.

Ein Ausdruck ist referenziell transparent, wenn er mit seinem Wert ersetzt werden kann, ohne den Algorithmus zu ändern, wodurch man einen Algorithmus, der die gleichen Wirkungen und Ausgang am gleichen Eingang hat.

Eine referentiell transparente Funktion ist eine, die wie eine mathematische Funktion wirkt; die gleichen Eingänge gegeben, es wird immer die gleichen Ausgänge erzeugen. Es impliziert, dass der übergebene Zustand nicht geändert wird, und dass die Funktion hat keinen eigenen Staat.

Wenn Sie in der Etymologie interessiert sind (dh., Warum hat dieses Konzept diesen besonderen Namen), hat einen Blick auf meinem Blog-Post zum Thema. Die Terminologie stammt aus dem Philosophen / Logiker Quine.

Für diejenigen in der Notwendigkeit einer prägnanten Erklärung werde ich eine Gefahr (aber lesen Sie die Offenlegung unten).

Referenz Transparenz in einer Programmiersprache fördert equational Argumentation - je mehr Referenz Transparenz haben Sie die einfacher ist es equational Argumentation zu tun. Z.B. mit einer (pseudo-) Funktionsdefinition,

f x = x + x,

die Leichtigkeit, mit der Sie (sicher) f (foo) mit foo + foo in den Rahmen dieser Definition ersetzen, ohne zu viele Einschränkungen, auf dem Sie diese Reduktion durchführen kann, ein guter Indikator dafür, wie viel referentielle Transparenz Ihre Programmiersprache hat.

Zum Beispiel, wenn foo waren x ++ in der Programmiersprache C Sinn, dann können Sie nicht diese Reduktion durchführen sicher (was zu sagen ist, wenn man diese Reduktion durchzuführen waren Sie könnte nicht mit dem gleichen Programm beenden, die Sie begann mit) .

In der Praxis Programmiersprachen Sie werden nicht perfekt Referenz Transparenz sehen, aber funktionale Programmierer kümmern sich um mehr als die meisten (cf Haskell, wo es ein Kernziel ist).

(vollständige Offenlegung. Ich bin ein Funktions-Programmierer so von oben Antwort Sie diese Erklärung mit einem Körnchen Salz nehmen sollen)

  1. Denotationelle-Semantik basiert auf Modellierungssprachen von Domänen aufzubauen, die denotable Werte dar.
  2. Funktions Programmierer verwenden den Begriff Wert , um die Konvergenz einer Berechnung auf der Rewrite-Regeln der Sprache, dh basierend zu beschreiben. seine operationale Semantik.

In 1 gibt es eine Klarheit von zwei Sprachen in Frage:

  • die ein Vorbild ist, die Objektsprache
  • die Sprache der Modellierung, die Metasprache

In 2 dank der Nähe des Objekts und Metasprachen, können sie verwechselt werden.

Als Sprache Implementierer, finde ich, dass ich diese Unterscheidung immer wieder erinnern müssen.

So Prof. Reddy kann ich paraphrasieren Sie also: -)

  

In den Kontexten der funktionalen Programmierung und Semantik, der Begriff Referenz   Transparenz ist nicht referentiell transparent.

Die folgende Antwort, die ich hoffe, ergänzt und qualifiziert die umstrittene 1. und 3. Antworten.

Lassen Sie uns gewähren, dass ein Ausdruck bezeichnet oder bezieht sich auf einige referent. Allerdings ist die Frage, ob diese referents isomorph als Teil von Ausdrücken codiert werden können selbst solche Ausdrücke ‚Werte‘ nennen. Zum Beispiel wörtliche Zahlenwerte eine Teilmenge der Menge von arithmetischen Ausdrücken sind, sind Wahrheitswerte eine Teilmenge der Menge von Booleschen Ausdrücken usw. Die Idee, einen Ausdruck zu seinem Wert zu bewerten ist (wenn sie eine hat). So wird das Wort ‚Wert‘ auf eine denotation beziehen oder auf einem aufstrebenden Element des Satzes von Ausdrücken. Aber wenn es ein Isomorphismus (eine Bijektion) zwischen dem referenten und dem Wert, den wir kann sagen, dass sie die gleiche Sache sind. (Dieser sagt, muss man vorsichtig sein, zu definieren, die Referenten und der Isomorphismus, wie sie durch das Gebiet der denotational bewährt Semantik. Um ein Beispiel zu setzen, indem Antworten auf die dritte Antwort erwähnt, die algebraische Datentypdefinition data Nat = Zero | Suc Nat nicht entsprechen in Bezug auf die Menge der natürlichen Zahlen zu erwarten.)

Lassen Sie uns E[·] für einen Ausdruck mit einem Loch schreiben, auch in einigen Kreisen bekannt als ‚Kontext‘. Zwei Kontext Beispiele für C-ähnliche Ausdrücke sind [·]+1 und [·]++.

Lassen Sie uns [[·]] für die Funktion schreiben, die einen Ausdruck (ohne Loch) nimmt und liefert seine Bedeutung (referent, denotation, etc.) in einigen Sinn Bereitstellung Universum. (Ich borgen Notation aus dem Bereich von denotational Semantik.)

Lassen Sie uns Quines Definition etwas formal anzupassen, wie folgt: a Kontext E[·] referentiell transparent ist alle zwei Ausdrücke E1 und E2 (keine Löcher iff gegeben es), so dass [[E1]] = [[E2]] (d.h. die Ausdrücke bezeichnen / Refer-To des gleiche referent) dann ist es der Fall, dass [[E[E1]]] = [[E[E2]]] (d.h. Ausfüllung in das Loch mit entweder E1 oder E2 Ergebnissen in Ausdrücken, die auch das gleiche bezeichnen referent).

Leibniz-Regel von substituierenden gleich für equals typischerweise als ‚ausgedrückt wird, wenn E1 = E2 dann E[E1] = E[E2]‘, die besagt, dass E[·] eine Funktion ist. Eine Funktion (Oder in diesem Fall ein Programm, das Berechnen der Funktion) ist eine Abbildung von a Quelle zu einem Ziel, so dass es höchstens ein Zielelement für jede Quelle Element. Nicht-deterministische Funktionen sind misnomers, sie entweder Beziehungen sind, Funktionen liefern Sätze usw. Wenn in Leibniz-Regel der Gleichheit = ist denotational dann die Doppel Klammern werden einfach als selbstverständlich angesehen und elided. So ein referentiell transparenter Kontext ist eine Funktion. Und Leibniz-Regel ist der Hauptbestandteil von equational Argumentation, so equational Argumentation ist auf jedem Fall im Zusammenhang Transparenz auf referenzielle.

Obwohl [[·]] ist eine Funktion von Ausdrücken Denotationen, könnte es sein, ein Funktion von Ausdrücken ‚Werte‘ verstanden als eine eingeschränkte Teilmenge von Ausdrücke und [[·]] als Auswertung verstanden werden.

Nun

, wenn E1 ist ein Ausdruck und E2 ist ein Wert, den wir haben, was ich denke, von den meisten Menschen gemeint, wenn in Bezug auf Ausdrücke, Werte und Auswertung Referenz Transparenz zu definieren. Aber wie durch die 1. und 3. Antworten auf dieser Seite dargestellt, ist dies eine inacurate Definition.

Das Problem mit Kontexten wie [·]++ ist nicht die Nebenwirkung, sondern dass ihr Wert nicht in C definiert ist isomorph zu seiner Bedeutung. Funktionen sind keine Werte (na ja, Zeiger auf Funktionen sind), während in funktionalen Programmiersprachen sie sind. Landin, Strachey, und die Pioniere der denotational Semantik waren sehr clever in mit Hilfe der funktionellen Welten Bedeutung zu schaffen.

Für zwingend notwendig, C-ähnliche Sprachen können wir (grob) bieten Semantik Ausdrücke der Funktion [[·]] : Expression -> (State -> State x Value) verwendet wird.

Value ist eine Teilmenge von Expression. State enthält Paare (Identifier, value). Die semantische Funktion nimmt einen Ausdruck und liefert als seine Bedeutung eine Funktion aus dem aktuellen Zustand zu dem Paar mit dem aktualisierten Zustand und ein Wert. Zum Beispiel ist die Funktion [[x]] vom aktuellen Zustand zu dem Paar, dessen erste Komponente ist der aktuelle Zustand und dessen zweiter Komponente ist der Wert von x. Im Gegensatz dazu ist [[x++]] die Funktion von der aktuellen Zustand zu dem Paar, dessen erste Komponente ist ein Zustand, in dem der Wert von x wird inkrementiert, und die zweite Komponente, die besteht darin, dass sehr Wert. In diesem Sinn ist der Kontext [·]++ referenziell transparent iff er die erfüllt oben angegebene Definition.

Ich denke, funktionale Programmierer sind berechtigt, referentielle Transparenz zu verwenden, in das Gefühl, dass sie von Natur aus [[·]] als Funktion von Ausdrücken auf Werte wiederherzustellen. Funktionen sind erstklassige Werte und der Staat kann auch ein Wert sein, nicht ein denotation. Der Zustand monadisch ist (teilweise) ein sauberer Mechanismus zur Weiterleitung (bzw. Threading) den Zustand.

Hinweis

, dass dieses Konzept der „Sinn“ ist etwas, das im Kopf des Betrachters geschieht. Somit kann die gleiche „Referenz“ bedeutet verschiedene Dinge für verschiedene Menschen. So zum Beispiel haben wir eine Edinburgh Scheidungs-Seite in der Wikipedia.

Ein verwandtes Thema, das im Zusammenhang mit der Programmierung auftauchen kann möglicherweise Polymorphismus sein.

Und vielleicht sollten wir einen Namen für den Spezialfall des Polymorphismus (oder vielleicht sogar Gießen), wo für unsere Zwecke der unterschiedlichen polymorphen Fälle semantisch äquivalent sind (im Gegensatz zu nur ähnlich ist zum Beispiel der Nummer 1 -. Das kann unter Verwendung eines integer-Typ dargestellt werden, oder einen komplexen Typ oder eine beliebige einer Vielzahl anderer Arten -. behandelt polymorph werden kann)

fand ich die Definition von Referenz Transparenz in dem Buch „ Struktur und Implementierung von Computerprogrammen “ (der Assistent Buch) nützlich, da sie durch eine Erklärung, wie ergänzt Referenz Transparenz durch die Einführung verletzt Zuweisungsoperation . Überprüfen Sie die folgende Folie Deck ich über das Thema gemacht: https://www.slideshare.net/pjschwarz/introducing-assignment-invalidates-the-substitution-model-of- Auswertung-and-gegen-Referenz-Transparenz-as-erläutert-in-SICP-the-wizard-Buch

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top