197 votes

Pourquoi la programmation fonctionnelle n'a-t-elle pas encore pris le dessus ?

J'ai lu quelques textes sur la programmation déclarative/fonctionnelle (langages), j'ai essayé Haskell et j'en ai écrit un moi-même. D'après ce que j'ai vu, la programmation fonctionnelle présente plusieurs avantages par rapport au style impératif classique :

  • Programmes apatrides ; pas d'effets secondaires

  • Concurrence ; joue très bien avec la technologie multi-core en plein essor.

  • Les programmes sont généralement plus courts et, dans certains cas, plus faciles à lire.

  • La productivité augmente (exemple : Erlang)

  • La programmation impérative est un très vieux paradigme (pour autant que je sache) et n'est peut-être pas adaptée au 21e siècle.

Pourquoi les entreprises utilisant ou les programmes écrits en langage fonctionnel sont-ils encore si "rares" ?

Pourquoi, au vu des avantages de la programmation fonctionnelle, utilisons-nous encore des langages de programmation impératifs ?

C'était peut-être trop tôt pour ça en 1990, mais aujourd'hui ?

530voto

Eric Lippert Points 300275

Car tous ces avantages sont aussi des inconvénients.

Programmes apatrides ; pas d'effets secondaires

Les programmes du monde réel ne connaissent que des effets secondaires et des mutations. Lorsque l'utilisateur appuie sur un bouton, c'est parce qu'il veut que quelque chose se produise. Lorsqu'il tape quelque chose, il veut que cet état remplace celui qui existait auparavant. Lorsque Jane Smith, comptable, se marie et change son nom en Jane Jones, la base de données qui soutient le processus métier qui imprime son chèque de paie a intérêt à pouvoir gérer ce type de mutation. Lorsque vous tirez avec la mitrailleuse sur l'extraterrestre, la plupart des gens ne modélisent pas mentalement cela comme la construction d'un nouvel extraterrestre avec moins de points de vie ; ils modélisent cela comme une mutation des propriétés d'un extraterrestre existant.

Lorsque les concepts du langage de programmation vont fondamentalement à l'encontre du domaine à modéliser, il est difficile de justifier l'utilisation de ce langage.

Concurrence ; joue très bien avec la technologie multi-core en plein essor.

Le problème est simplement repoussé. Avec des structures de données immuables, vous avez une sécurité de thread bon marché au prix d'un travail possible avec des données périmées. Avec des structures de données mutables, vous avez l'avantage de toujours travailler sur des données fraîches au prix de devoir écrire une logique compliquée pour garder les données cohérentes. Ce n'est pas comme si l'une d'entre elles était manifestement meilleure que l'autre.

Les programmes sont généralement plus courts et, dans certains cas, plus faciles à lire.

Sauf dans les cas où ils sont plus longs et plus difficiles à lire. Apprendre à lire des programmes écrits dans un style fonctionnel est une compétence difficile ; les gens semblent bien plus aptes à concevoir les programmes comme une série d'étapes à suivre, comme une recette, plutôt que comme une série de calculs à effectuer.

La productivité augmente (exemple : Erlang)

La productivité doit augmenter considérablement pour justifier les dépenses massives liées à l'embauche de programmeurs qui savent programmer dans un style fonctionnel.

Et n'oubliez pas que vous ne voulez pas jeter un système qui fonctionne ; la plupart des programmeurs ne construisent pas de nouveaux systèmes à partir de zéro, mais assurent plutôt la maintenance de systèmes existants, dont la plupart ont été construits dans des langages non fonctionnels. Imaginez que vous deviez justifier cela auprès des actionnaires. Pourquoi avez-vous mis au rebut votre système de paie existant et fonctionnel pour en construire un nouveau, au prix de millions de dollars ? "Parce que la programmation fonctionnelle est géniale" a peu de chances de ravir les actionnaires.

La programmation impérative est un paradigme très ancien (pour autant que je sache) et peut-être pas adapté au 21ème siècle.

La programmation fonctionnelle est également très ancienne. Je ne vois pas en quoi l'ancienneté du concept est pertinente.

Ne vous méprenez pas. J'aime la programmation fonctionnelle, j'ai rejoint cette équipe parce que je voulais aider à introduire les concepts de la programmation fonctionnelle dans C#, et je pense que la programmation dans un style immuable est la voie de l'avenir. Mais il y a coûts énormes à la programmation dans un style fonctionnel qu'on ne peut pas simplement souhaiter. L'évolution vers un style plus fonctionnel va se faire lentement et progressivement sur plusieurs décennies. Et c'est ce qu'il sera : une évolution vers un style plus fonctionnel, et non pas une adoption en bloc de la pureté et de la beauté de Haskell et l'abandon de C++.

Je construis des compilateurs pour gagner ma vie et nous adoptons définitivement un style fonctionnel pour la prochaine génération d'outils de compilation. La raison en est que la programmation fonctionnelle est fondamentalement adaptée au type de problèmes auxquels nous sommes confrontés. Nos problèmes consistent à prendre des informations brutes - chaînes de caractères et métadonnées - et à les transformer en chaînes de caractères et métadonnées différentes. Dans les situations où des mutations se produisent, comme lorsque quelqu'un tape dans l'IDE, l'espace du problème se prête intrinsèquement à des techniques fonctionnelles telles que la reconstruction incrémentale des seules parties de l'arbre qui ont changé. De nombreux domaines ne possèdent pas ces belles propriétés qui les rendent manifestement accessibles à un style fonctionnel. .

38voto

Nick Dandoulakis Points 26809

Les maîtres de la programmation : Conversations avec les créateurs des principaux langages de programmation

[Haskell]

Pourquoi pensez-vous qu'aucun langage de programmation fonctionnel ne s'est imposé ?

John Hughes : Mauvais marketing ! Je ne parle pas de propagande, nous en avons eu beaucoup. Je veux dire un choix minutieux d'une niche de marché cible à dominer, suivi d'un effort déterminé pour faire de la programmation fonctionnelle de loin le moyen le plus efficace d'aborder cette niche. Dans les jours heureux des années 80, nous pensions que la programmation fonctionnelle était bonne pour tout - mais dire d'une nouvelle technologie qu'elle est "bonne pour tout" revient à dire qu'elle est "particulièrement bonne à rien". Quelle doit être la marque ? C'est un problème que John Launchbury a décrit très clairement dans son exposé invité à l'ICFP. Galois Connections a failli faire faillite lorsque sa marque était "logiciel dans les langages fonctionnels", mais elle est devenue de plus en plus forte depuis qu'elle s'est concentrée sur les "logiciels de haute sécurité".

De nombreuses personnes n'ont aucune idée de la façon dont l'innovation technologique se produit et s'attendent à ce qu'une meilleure technologie devienne simplement dominante d'elle-même (les "meilleure souricière" ), mais le monde n'est pas comme ça.

27voto

Greg Points 4537

La réponse générale est que ni l'un ni l'autre ne remplacera ou ne devrait remplacer l'autre - ce sont des outils différents qui présentent des avantages et des inconvénients différents, et l'approche qui aura l'avantage sera différente selon le projet et d'autres questions "douces" comme le réservoir de talents disponible.

Je pense que vous avez raison de dire que la croissance de la concurrence due au multicœur augmentera le pourcentage (de l'ensemble des projets de développement) où la programmation fonctionnelle est choisie plutôt que d'autres styles.

Je pense que c'est rare aujourd'hui parce que la majorité du vivier de talents professionnels est plus à l'aise avec les technologies impératives et orientées objet. Par exemple, j'ai plus d'une fois choisi Java comme langage pour un projet commercial parce qu'il était suffisamment bon, non controversé, et que je sais que je ne manquerai jamais de personnes capables de programmer (suffisamment bien) dans ce langage.

26voto

Robert Harvey Points 103562

Malgré les avantages de la programmation fonctionnelle, la programmation impérative et orientée objet ne disparaîtra jamais complètement.

La programmation impérative et orientée objet est une description étape par étape du problème et de sa solution. En tant que telle, elle peut être plus facile à comprendre. La programmation fonctionnelle peut être un peu obscure.

En fin de compte, un programme utile aura toujours des effets secondaires (comme fournir une sortie réelle à l'utilisateur pour consommation), de sorte que le plus pur des langages fonctionnels aura toujours besoin d'un moyen d'entrer dans le monde impératif de temps en temps.

L'état actuel des choses est que les langages impératifs (comme C#) empruntent des caractéristiques au monde fonctionnel (comme les instructions lambda) et vice-versa.

21voto

Ken Points 1706

N'est-ce pas ?

Smalltalk était un excellent système orienté objet à l'époque. Pourquoi la programmation orientée objet n'a-t-elle pas pris le dessus ? Et bien, elle l'a fait. Mais elle ne ressemble pas à Smalltalk. Les langages traditionnels deviennent de plus en plus proches de Smalltalk avec C++, Java, C#, etc. La mode et le style changent plus lentement que n'importe quoi d'autre, donc quand l'OO est devenu courant, nous l'avons obtenu en collant des parties de l'OO aux anciens langages pour qu'il ressemble suffisamment au C pour être avalé.

Il en va de même pour la fonction. Haskell était un grand langage fonctionnel. Mais la masse des programmeurs grand public qui utilisent une syntaxe de type C est encore plus importante aujourd'hui qu'il y a 20 ans. Il doit donc ressembler au C. C'est fait : regardez n'importe quelle expression LINQ et dites-moi qu'elle n'est pas fonctionnelle.

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