Le terme "référentiel de transparence" vient de la philosophie analytique, la branche de la philosophie qui analyse en langage naturel des constructions, des déclarations et des arguments fondés sur les méthodes de la logique et des mathématiques. En d'autres termes, il est le plus proche de l'objet à l'extérieur de l'informatique à ce que nous appelons le langage de programmation sémantique. Le philosophe Quine a été chargé de lancer le concept de la transparence référentielle, mais il est également implicite dans les approches de Bertrand Russell et Alfred Whitehead.
À la base, le "référentiel de la transparence" est très simple et claire idée. Le terme "référence" est utilisé dans la philosophie analytique de parler de la chose que l'expression se réfère. Il est à peu près la même chose que ce que nous entendons par "sens" ou de "dénotation" dans le langage de programmation sémantique. À l'aide de Andrew Birkett de l'exemple (billet de blog), le terme "la capitale de l'Ecosse" se réfère à la ville d'Edimbourg. C'est un exemple simple de "référence".
Un contexte dans une phrase est "referentially transparent" si le remplacement d'un terme dans ce contexte par un autre terme qui fait référence à la même entité ne pas modifier le sens. Par exemple
Le Parlement Écossais se réunit dans la capitale de l'Ecosse.
signifie la même chose que
Le Parlement Écossais répond à Edimbourg.
De sorte que le contexte "Le Parlement Écossais se réunit en ..." est un referentially cadre transparent. Nous pouvons remplacer "la capitale de l'Ecosse" avec "Édimbourg" sans en altérer le sens. Mettre une autre manière, le contexte se soucie uniquement de ce que le terme se réfère à et rien d'autre. C'est le sens dans lequel le contexte est "referentially transparent."
En revanche, dans la phrase,
Edimbourg est la capitale de l'Écosse depuis 1999.
nous ne pouvons pas faire ce remplacement. Si nous le faisions, nous serions "Édimbourg a été Edimbourg depuis 1999", qui est une noisette chose à dire, et ne rend pas le même sens que la phrase d'origine. Il semblerait donc que le contexte "d'Edimbourg a été ... depuis 1999" est referentially opaque (à l'opposé de referentially transparent). Apparemment, il se soucie de quelque chose de plus que ce que le terme se réfère. Quel est-il?
Des choses comme "la capitale de l'Ecosse" sont appelés des conditions qui sont définies et ils n'ont donné aucune maigre quantité de maux de tête pour les logiciens et les philosophes depuis un long moment. Russell et Quine triées en disant qu'ils ne sont pas réellement "référentiel", c'est à dire, c'est une erreur de penser que la sont utilisés pour se référer à des entités. La bonne façon de comprendre la phrase ci-dessus est-à-dire
L'ecosse a eu un capital depuis 1999 et que le capital est d'Édimbourg.
Cette phrase ne peut pas être transformée en une noisette. Problème résolu! Le point de Quine est-à-dire que le langage naturel est en désordre, ou au moins compliquée, car il est fait pour être pratique pour un usage pratique, mais les philosophes et les logiciens devrait apporter de la clarté par la compréhension dans le droit chemin. La transparence référentielle est un outil à utiliser pour parvenir à la clarté du sens.
Est-ce que tout cela a à voir avec la programmation? Pas beaucoup, en fait. Comme nous l'avons dit, la transparence référentielle est un outil à utiliser dans la compréhension de la langue, c'est à dire, dans l'attribution de sens. Christopher Strachey, qui a fondé le domaine du langage de programmation sémantique, l'a utilisée dans son étude de la signification. Son fondateur papier "concepts Fondamentaux des langages de programmation" est disponible sur le web. C'est un beau papier et tout le monde peut le lire et le comprendre. Donc, merci de le faire. Vous serez beaucoup éclairé. Il introduit le terme "référentiel de transparence" dans ce paragraphe:
L'un des plus utiles propriétés des expressions est appelé par Quine [4] référentielle
de la transparence. En substance, cela signifie que si nous voulons trouver la valeur d'une expression qui
contient une sous-expression, la seule chose que nous avons besoin de savoir à propos de la sous-expression est sa
de la valeur. Toutes les autres caractéristiques de la sous-expression, telles que sa structure interne, le nombre
et la nature de ses composants, l'ordre dans lequel ils sont évalués ou la couleur de l'encre
dans laquelle ils sont écrits, ne sont pas pertinents à la valeur de l'expression principale.
L'utilisation du "essence" suggère que Strachey est de la paraphrase dans le but d'expliquer en termes simples. Fonctionnelle programmeurs semblent comprendre ce paragraphe dans leur propre chemin. Il y a 9 autres occurrences de "référentiel de transparence" dans le papier, mais ils ne semblent pas se préoccuper de tous les autres. En fait, l'ensemble du document de Strachey est consacrée à l'explication du sens de l' impératif langages de programmation. Mais, aujourd'hui, fonctionnelle programmeurs demande que l'impératif de langages de programmation sont pas referentially transparent. Strachey serait retourner dans sa tombe.
Nous pouvons sauver la situation. Nous avons dit que le langage naturel est "bordélique, ou au moins compliquée" parce qu'il est fait pour être pratique pour un usage pratique. Les langages de programmation sont de la même manière. Ils sont "en désordre, ou au moins compliquée" car elles sont faites pour être pratique pour un usage pratique. Cela ne signifie pas qu'ils ont besoin de nous confondre. Ils ont juste à être compris le droit chemin, à l'aide d'un méta-langage qui est referentially transparent, de sorte que nous avons la clarté du sens. Dans le document que j'ai cité, Strachey est exactement ce que fait. Il explique la signification de la programmation impérative langues en les décomposant en concepts élémentaires, en ne perdant jamais de clarté n'importe où. Une partie importante de son analyse est de mettre en évidence que les variables dans les langages de programmation ont deux sortes de "valeurs", appelé l-valeurs et r-valeurs. Avant de Strachey, du papier, ce n'était pas compris et la confusion régnait en maître. Aujourd'hui, la définition de C mentionne régulièrement et chaque programmeur C comprend la distinction. (Si les programmeurs dans d'autres langues le comprendre aussi bien est difficile à dire.)
Les deux Quine et Strachey, étaient préoccupés par le sens de la langue des constructions qui impliquent une certaine forme de contexte de dépendance. Par exemple, notre "Edimbourg est la capitale de l'Écosse depuis 1999" signifie le fait que "la capitale de l'Ecosse" dépend de l'heure à laquelle il est envisagé. Ce contexte, la dépendance est une réalité, à la fois dans les langues naturelles et langages de programmation. Même dans la programmation fonctionnelle, libre et liée variables doivent être interprétés en ce qui concerne le contexte dans lequel ils apparaissent. Contexte de la dépendance de tout type de blocs de transparence référentielle, d'une certaine façon ou de l'autre. Si vous essayez de comprendre le sens des termes, sans égard aux contextes qu'ils dépendent de l', vous serait à nouveau jusqu'à la fin avec confusion. Quine était préoccupé par le sens de la logique modale. Il a jugé que la logique modale a été referentially opaque et il doit être nettoyé en le traduisant dans un referentially cadre transparent (par exemple, en considérant l'état de nécessité comme provability). Il a largement perdu de ce débat. Les logiciens et les philosophes semblables trouvé Kripke de monde possible sémantique être parfaitement adéquat. Situation similaire a également règne avec la programmation impérative. L'état de dépendance explique par Strachey et stockez-la dépendance explique par Reynolds (d'une manière similaire à Kripke est possible mot "sémantique") sont parfaitement adéquates. Fonctionnelle programmeurs ne savent pas beaucoup de cette recherche. Leurs idées sur la transparence référentielle sont à prendre avec un gros grain de sel.
[Remarque: Les exemples ci-dessus montrent que dans une phrase simple comme "la capitale de l'Ecosse" a plusieurs niveaux de sens. À un certain niveau, on peut parler de la capitale, à l'heure actuelle. À un autre niveau, on peut parler de tous les possibles capitales que l'Ecosse pourrait avoir eu à travers le temps. On peut "zoomer" dans un contexte particulier et "zoom arrière" pour étendre à tous les contextes assez facilement dans la pratique normale. L'efficacité de la langue naturelle rend l'utilisation de notre capacité à le faire. Impératif de langages de programmation sont efficaces dans beaucoup de la même manière. Nous pouvons utiliser une variable x sur le côté droit de cession ( valeur r) pour parler de sa valeur dans un état particulier. Ou, nous pourrions parler de sa l-valeur qui s'étend à tous les états. Les adultes sont rarement confus par ce genre de choses. Cependant, ils peuvent ou peuvent ne pas être en mesure d'expliquer toutes les couches de sens inhérente au langage des constructions. Toutes ces couches de sens ne sont pas forcément évidentes et c'est une question de science pour étudier correctement. Cependant, la inarticulacy des gens ordinaires pour expliquer de telles couches de significations ne signifie pas qu'ils sont confus au sujet de eux.]
Un "post-scriptum" ci-dessous se rapporte à cette discussion pour les préoccupations fonctionnelles et de programmation impératif.
1 votes
Wow je me demande pourquoi la popularité de cette question a soudainement augmenté...
1 votes
Je ne peux pas le dire avec certitude, mais r/haskell s'est répandue et beaucoup ont eu l'impression qu'Uday, bien qu'il soit tout à fait exact, se moquait un peu de la communauté.
7 votes
@efrey Une raillerie, peut-être que c'en était une. Mais, lorsque les programmeurs fonctionnels descendent les langages de programmation impératifs et les langages fonctionnels à effet de bord (comme Lisp et ML) en prétendant qu'ils ne sont pas transparents référentiellement, ne sont-ils pas en train de faire une remarque ? Ne devraient-ils pas au moins vérifier les faits avant de le faire ?
2 votes
@Claudiu Je l'ai posté sur le Reddit Haskell et Conal l'a tweeté. J'ai trouvé la discussion intéressante et j'ai pensé qu'elle méritait une discussion plus large. J'ai attiré l'attention sur la plaisanterie d'Uday pour stimuler la discussion. Je suis d'accord pour dire que nous, les FPers, pouvons parfois nous reposer sur nos lauriers et avons besoin d'un bon coup de pouce - bravo à Uday pour l'avoir fait !
0 votes
@efrey Je pense qu'il y aura inévitablement des tensions entre les FPers et les défenseurs des langages impératifs -- les programmes fonctionnels "purs" sont par définition non procéduraux, donc les défenseurs des FP ne peuvent qu'offenser les défenseurs de la programmation procédurale en s'expliquant simplement (et vice versa).
9 votes
@efrey. En effet, c'est la raison pour laquelle j'ai choisi de citer Bird et Wadler (sémanticiens ?) dans mon deuxième post. Les personnes bien informées savent que la conception populaire de la transparence référentielle est vague et peut-être incohérente. Mais elle n'a jamais été expliquée correctement à la communauté des programmeurs. J'espère que mes écrits ici feront la différence.
0 votes
J'ai vraiment aimé la définition du wiki haskell ( wiki.haskell.org/Transparence_référentielle ) et j'ai cherché d'autres sources, dont le résultat est ici : pedrorijo.com/blog/fp-concepts
1 votes
@pedrorijo91 Avez-vous lu les réponses d'UdayReddy ? Elles expliquent comment vos deux liens FP sont faux. '[L]a "valeur" dont parlaient les premiers sémanticiens n'est pas le résultat d'une évaluation ou la sortie d'une fonction ou quelque chose du genre. Il s'agit de la dénotation du terme.''