27 votes

Pourquoi les fonctions "pures" sont-elles appelées "pures" ?

Une fonction pure est une fonction qui n'a pas d'effets secondaires - elle ne peut effectuer aucun type d'entrée/sortie et ne peut modifier l'état de quoi que ce soit - et qui est transparente sur le plan référentiel - lorsqu'elle est appelée plusieurs fois avec les mêmes entrées, elle donne toujours les mêmes sorties.

Pourquoi le mot "pur" est-il utilisé pour décrire des fonctions ayant ces propriétés ? Qui a été le premier à utiliser le mot "pur" de cette manière, et quand ? Existe-t-il d'autres mots qui signifient à peu près la même chose ?

22voto

Porges Points 17745

Pour répondre à votre première question, les fonctions mathématiques ont souvent été décrites comme "pures" en termes de certaines variables spécifiées, par exemple :

le premier terme est une fonction pure de x et le second terme est une fonction pure de y

Pour cette raison, je ne pense pas que vous trouverez une véritable "première" occurrence.

Pour les langages de programmation, une petite recherche montre que Ada 95 ( pragma Pure ), Fortran haute performance (1993) ( PURE ) et VHDL-93 ( pure ) contiennent toutes des notions formelles de "fonctions pures".

Haskell (1990) est assez évident, mais la pureté n'est pas explicite. Le C de GCC a divers attributs de fonction pour différents niveaux de "pureté".

Quelques livres : Raison d'être du langage de programmation C (1990) utilise ce terme, tout comme Les langages de programmation et leurs définitions (1984). Cependant, tous deux ne l'utilisent apparemment qu'une seule fois ! Programmation de l'ordinateur personnel IBM, Pascal (également 1984) utilise ce terme, mais la vue restreinte de Google ne permet pas de savoir si le compilateur Pascal le prenait en charge ou non. (Je soupçonne que non.)

Une note intéressante est que Green, le prédécesseur d'Ada, avait en fait une définition assez stricte de la "fonction". - même l'allocation de mémoire n'était pas autorisée. Cependant, ceci a été abandonné avant de devenir Ada, où les fonctions peuvent avoir des effets secondaires (E/S ou variables globales), mais ne peuvent pas modifier leurs arguments.

C28-6571-3 (le premier manuel de référence PL/I, écrit avant le compilateur) montre que le PL/I avait un support pour les fonctions pures, sous la forme de la fonction REDUCIBLE (= pur), dès 1966, date de la première version du compilateur. (Cela répond également à votre troisième question).

Ce dernier document indique spécifiquement qu'il comprend REDUCIBLE comme une nouvelle modification depuis le document C28-6571-2. Donc REDUCIBLE qui est probablement la première incarnation des fonctions pures formelles dans les langages de programmation, est apparu quelque part entre janvier et juillet 1966.

Mise à jour : la première occurrence de "fonction pure" sur Google Groups dans ce sens. est de 1988 ce qui est facilement postérieur aux références du livre.

13voto

Uday Reddy Points 2042

Quelques mythes :

  • L'expression "fonction pure" ne vient pas des mathématiques, où toutes les fonctions sont par nature "pures" et où, par conséquent, il n'y a jamais eu besoin d'appeler quoi que ce soit "fonction pure".

  • Le terme ne vient pas de la programmation impérative. Les premiers langages de programmation impérative, Fortran, Algol 60, Pascal, etc., comportaient toujours deux types d'abstractions : les "fonctions" qui produisaient des résultats en fonction de leurs entrées et les "procédures" qui prenaient certaines entrées et effectuaient une action. Il était considéré comme une bonne pratique de programmation que les "fonctions" n'aient pas d'effets secondaires. Il n'était pas nécessaire qu'elles aient des effets secondaires car on pouvait toujours utiliser des procédures à la place.

Alors, d'où pourrait provenir le terme "fonctionnel pur" ? La réponse est - en quelque sorte - évidente. Il provient des langages de programmation fonctionnels impurs, le plus important d'entre eux étant Lisp. Lisp a été conçu entre 1958 et 1960 (entre le premier et le deuxième rapport d'Algol 60, dont McCarthy a participé à la conception, mais dont il n'était pas satisfait). La conception de Lisp était basée fondamentalement sur la programmation fonctionnelle. Cependant, il autorisait également les effets de bord par choix pragmatique. Il n'y avait pas de notion de commande ou de procédure. Ainsi, en Lisp, on écrivait principalement des "fonctions pures", mais occasionnellement, on écrivait des "fonctions impures", c'est-à-dire des fonctions avec des effets secondaires, pour obtenir quelque chose. Les termes "Lisp pur" ou "sous-ensemble purement fonctionnel de Lisp" sont utilisés depuis longtemps. Lentement, par osmose, cette idée de "pureté" en est venue à envahir tout notre espace.

Les langages de programmation impératifs auraient pu résister à cette tendance. Mais, une fois que C a décidé d'abolir l'idée de "procédures" et de les appeler "fonctions vides" à la place, ils n'ont plus eu beaucoup d'arguments à faire valoir.

6voto

Cela vient de la définition mathématique de "fonction", où il est impossible que les fonctions aient des effets secondaires.

4voto

Dan Burton Points 26639

Pourquoi le mot "pur" est-il utilisé pour décrire des fonctions ayant ces propriétés ?

Desde Wiktionnaire > pur # adjectif

  • exempt de défauts ou d'imperfections ; non souillé
  • exempts de matières étrangères ou de polluants
  • exempt de comportement ou de qualités immorales ; propre
  • d'une branche de la science, faite pour elle-même au lieu de servir une autre branche de la science.

Il devrait être évident qu'il est plus facile de raisonner sur le comportement des fonctions en interaction lorsqu'elles ne sont influencées que par leurs entrées, et qu'elles n'influencent elles-mêmes que leurs sorties. Il est donc inévitable que ce type de fonctions soit remarqué et classé. Maintenant, quel mot pourrions-nous utiliser pour décrire une fonction ayant de telles propriétés ? "Exempt de matières étrangères ou de polluants" et "exempt de comportement ou de qualités immorales" semblent plutôt bien décrire la situation.

Qui a été le premier à utiliser le mot "pur" dans ce sens, et quand ?

Je suis bien trop jeune pour répondre à cette question avec un quelconque degré de confiance. Je soutiens, cependant, qu'il était inévitable que le mot pur (ou un synonyme très proche) serait utilisé pour décrire les fonctions qui se comportent de cette manière.

Existe-t-il d'autres mots qui signifient à peu près la même chose ?

Vous l'avez dit vous-même : "référentiellement transparent". Cependant, vous semblez suggérer que la "transparence référentielle" ne recouvre qu'une partie du sens de l'expression "fonction pure". Je ne suis pas d'accord ; je pense que c'est entièrement synonyme. Tiré de Wikipédia > Transparence référentielle :

Une expression est dite transparente sur le plan référentiel si elle peut être remplacée par sa valeur sans changer le comportement d'un programme . (c'est moi qui souligne)

La communauté Haskell utilise parfois l'adjectif "sûr" de manière similaire. (Voir le Sécurité faite pour éviter de lancer des exceptions. À l'inverse unsafePerformIO )

Je ne peux pas penser à d'autres synonymes pour le moment.

2voto

Ben Points 22160

Le concept de fonction trouve son origine dans les mathématiques. Le concept mathématique d'une fonction est plus ou moins une correspondance d'un ensemble à un autre. En ce sens, il est impossible que les fonctions aient des effets secondaires ; non pas parce qu'elles sont "meilleures" de cette façon ou parce qu'elles sont spécifiquement définies pour ne pas avoir d'effets secondaires, mais parce que le concept "d'effets secondaires" n'a aucun sens avec cette définition d'une fonction. Les fonctions mathématiques ne sont pas une série d'étapes qui s'exécutent, alors comment ces étapes pourraient-elles d'une manière ou d'une autre "affecter" les autres objets mathématiques dont vous parlez ?

Quand les gens ont commencé à étudier calcul Ils se sont intéressés aux algorithmes implémentables par les machines pour calculer les valeurs des fonctions mathématiques en fonction de leurs entrées. Les gens ont commencé à parler de fonctions calculables . Mais les fonctions tel que mis en œuvre dans un ordinateur (dans les langages impératifs du moins, qui sont ceux avec lesquels les programmeurs ont d'abord travaillé) sont une série d'étapes exécutables, qui évidemment peut ont des effets secondaires.

Il est donc devenu naturel pour les programmeurs de considérer les fonctions comme des algorithmes, et non comme des fonctions mathématiques. Ainsi, une pur est une fonction purement mathématique, à laquelle s'appliquent toutes les centaines d'années de théorie sur les fonctions, par opposition à la fonction généralisée du programmeur, qui ne peut pas être raisonnée de cette manière.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X