68 votes

pièges / inconvénients de la programmation fonctionnelle

Quand vous ne souhaitez PAS utiliser la programmation fonctionnelle? Qu'est-ce que cela ne soit pas bon?

Je suis plus à la recherche pour les inconvénients du paradigme dans son ensemble, et non pas des choses comme "ne sont pas largement utilisés", ou "pas bon débogueur disponibles". Ces réponses peuvent être correctes maintenant, mais ils traitent avec de la FP est un nouveau concept (un incontournable question) et non pas toutes les qualités inhérentes.

Connexes:

46voto

Norman Ramsey Points 115730

Il est difficile pour moi de penser à de nombreux inconvénients à la programmation fonctionnelle. Puis de nouveau, je suis un ancien président de la Conférence Internationale sur la Programmation Fonctionnelle, de sorte que vous pouvez supposer que je suis partial.

Je pense que les principaux inconvénients d'avoir à faire avec l'isolement et avec des barrières à l'entrée. Apprendre à écrire de bons programmes fonctionnels, c'est apprendre à penser différemment, et de le faire bien nécessite un investissement important de temps et d'efforts. Il est difficile d'apprendre sans professeur. Ces propriétés conduisent à quelques inconvénients:

  • Il est probable qu'un programme fonctionnel écrit par un nouvel arrivant sera inutilement lent—plus probable que, disons, un programme C écrit par un nouveau venu à C. d'autre part, il est tout aussi probable qu'un programme C++ écrit par un nouvel arrivant sera inutilement lent. (Toutes ces brillantes fonctionnalités...).

    Généralement, les experts n'ont aucune difficulté à l'écriture rapide de programmes fonctionnels; et en fait, certaines des plus performants en matière de programmes parallèles sur 8 et 16 processeurs sont maintenant écrit en Haskell.

  • Il est plus probable que quelqu'un débutant en programmation fonctionnelle donner avant de réaliser la promesse de gains de productivité que quelqu'un commençant, disons, Python ou Visual Basic. Il n'y a pas autant de soutien sous la forme de livres et d'outils de développement.

  • Il y a moins de personnes à qui parler. Stackoverflow est un bon exemple; relativement peu de Haskell programmeurs visiter le site régulièrement (même si une partie de cela est que Haskell programmeurs ont leurs propres animé des forums qui sont beaucoup plus anciens et les mieux établis que Stackoverflow).

    Il est également vrai que vous ne pouvez pas parler à votre voisin très facilement, car la fonctionnelle-les concepts de la programmation sont plus difficiles à enseigner et plus difficile à apprendre que les concepts orientés objet derrière des langages comme Smalltalk, Ruby et C++. Et aussi, orientée objet, la communauté a passé des années à développer de bonnes explications pour ce qu'ils font, alors que la fonctionnelle de la programmation communautaire semblent penser que leur truc est évidemment très intéressant et ne nécessite pas de toute spéciale de métaphores ou de vocabulaire pour les explications. (Ils ont tort. Je suis toujours en attente pour le premier grand livre de la Conception Fonctionnelle des Modèles.)

  • Bien connu de baisse de paresseux de la programmation fonctionnelle (s'applique à Haskell ou Propre, mais pas de ML ou de Régime ou Clojure) est qu' il est très difficile de prédire le temps et dans l'espace des coûts de l'évaluation d'un paresseux programme fonctionnel—même les experts ne peuvent pas le faire. Ce problème est fondamental de paradigme et ne va pas plus loin. Il existe d'excellents outils pour la découverte de l'espace et le temps le comportement post facto, mais pour les utiliser efficacement, vous devez être expert déjà.

30voto

Jon Harrop Points 26951

Je pense que la connerie environnant les langages fonctionnels est le plus gros problème avec la programmation fonctionnelle. Quand j'ai commencé à l'aide de la programmation fonctionnelle en colère, un gros obstacle pour moi a été de comprendre pourquoi beaucoup de la très évolué arguments mis en avant par la communauté Lisp (par exemple, à propos des macros et homoiconic syntaxe) étaient erronées. Aujourd'hui, je vois beaucoup de gens d'être trompé par le Haskell communauté à l'égard de la programmation parallèle.

En fait, vous n'avez pas à chercher plus loin que ce très thread pour voir certains de il:

"En général, les experts ont pas de difficulté de l'écriture rapide de programmes fonctionnels; et en fait, certaines des plus performants en matière de programmes parallèles sur 8 et 16 processeurs sont maintenant écrit en Haskell."

Des déclarations comme celle-ci peut vous donner l'impression que les experts ont choisir Haskell, car il peut être très bon pour le parallélisme, mais la vérité est que Haskell performance suce et le mythe que Haskell est bon pour le multicœur parallélisme est perpétué par Haskell chercheurs avec peu ou pas de connaissances sur le parallélisme qui évitent réel d'examen par les pairs que par la publication de l'intérieur de la zone de confort de revues et de conférences, sous le contrôle de leur propre clique. Haskell est invisible dans le vrai monde parallèle/multicore/HPC précisément parce qu'il aspire à la programmation parallèle.

Plus précisément, le vrai défi de la programmation multicœur, c'est profiter des caches CPU à assurez-vous que les cœurs ne sont pas affamés de données, un problème qui n'a jamais été abordée dans le contexte de Haskell. Charles Leiserson du groupe au MIT ont fait un excellent travail d'expliquer et de résoudre ce problème en utilisant leurs propres Cilk langue qui allait devenir l'épine dorsale du monde réel de la programmation parallèle pour multicores dans les deux Intel TBB et de Microsoft de TPL .NET 4. Il y a une superbe description de la façon dont cette technique peut être utilisée pour écrire élégant de haut niveau de l' impératif de code qui compile à évolutive haute performance code dans le livre de 2008 Le cache de la complexité de multithread cache inconscient algorithmes. J'ai expliqué cela dans mon examen de certains de l'état-of-the-art en Parallèle Haskell recherche.

Ce qui laisse un gros point d'interrogation sur l'aspect purement fonctionnel paradigme de programmation. C'est le prix à payer pour l'abstraction du temps et de l'espace, qui a toujours été la principale motivation derrière ce paradigme déclaratif.

EDIT: Texas Multicœur Technologies ont récemment trouvé une Haskell être décevante dans le contexte de multicœur parallélisme.

29voto

Chuck Points 138930

Un gros désavantage à la programmation fonctionnelle, c'est que sur un plan théorique, il ne correspond pas au matériel ainsi que la plupart des langages impératifs. (C'est le revers de la médaille de l'un de ses avantages évidents, d'être en mesure d'exprimer ce que vous voulez faire, plutôt que de la façon dont vous souhaitez que l'ordinateur de le faire.)

Par exemple, la programmation fonctionnelle, fait un usage intensif de la récursivité. C'est bien dans la pure lambda calcul, parce que les mathématiques' "pile" est illimitée. Bien sûr, sur du matériel réel, la pile est très bien finie. Naïvement recursing sur un ensemble de données volumineux peut rendre votre programme go boom. La plupart des langages fonctionnels optimiser la queue de récursivité, de sorte que cela ne se produise pas, mais en faire un algorithme de queue récursive peut vous forcer à faire quelque plutôt unbeautiful code de gymnastique (par exemple, une queue-récursif de la fonction map crée une rétrospective de liste ou doit construire une différence de liste, de sorte qu'il a à faire un travail supplémentaire pour obtenir le retour à la normale mappé liste dans l'ordre correct par rapport à la non-queue-une version récursive).

(Merci à Jared Updike pour la différence de la liste de suggestion.)

23voto

Brian Points 82719

Si votre langue n'est pas bien les mécanismes à l'aplomb de l'état/exception comportement par le biais de votre programme (par exemple, la syntaxe de sucre pour monadique lie), alors toute tâche impliquant etat/exceptions devient une corvée. (Même avec ces sucres, certaines personnes pourraient trouver qu'il est plus difficile de traiter avec l'état/les exceptions en matière de PF.)

Fonctionnelle idiomes souvent faire beaucoup de l'inversion de contrôle ou de la paresse, qui a souvent un impact négatif sur le débogage (à l'aide d'un débogueur). (Ce qui est quelque peu compensée par FP étant beaucoup moins de risques d'erreurs en raison de l'immutabilité/référentiel de transparence, ce qui signifie que vous aurez besoin de déboguer moins souvent.)

13voto

Jared Updike Points 3946

Philip Wadler a écrit un papier à ce sujet (appelé Pourquoi personne N'Utilise les Langages de Programmation Fonctionnelle) et adressé à la pratique pièges cesser utilisation de la PF langues:

Mise à jour: inaccessible ancien lien pour ceux avec ACM accès:

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