Choisir un langage de programmation fonctionnel [fermé]

48

J'ai récemment lu beaucoup de discussions sur les langages de programmation fonctionnels (presque au cours de la dernière année). J'aimerais vraiment en choisir un et l'apprendre à fond.

Le dernier semestre, j'ai été initié au programme. Je l'ai aimé. J'ai adoré l'extrême simplicité de la syntaxe, le principe d' homoiconicité , les macros ( hygiéniques et non hygiéniques), la n-arité des procédures, etc.

Le problème avec Scheme est que c'est une langue académique. Je ne pense pas qu'il soit vraiment utilisé dans les environnements de production. Je ne crois pas non plus qu'il soit particulièrement bon d'avoir notre CV. J'ai donc cherché des solutions de rechange. Ils sont nombreux et semblent avoir un niveau de popularité similaire.

Quelques réflexions sur d'autres langages fonctionnels que j'ai déjà envisagés:

  • Clojure: Cela a l'air génial car il permet d'accéder au monde Java, il est orienté vers l'évolutivité et la concurrence, mais le monde Java n'est-il pas à la pointe de la technologie? Je connais déjà assez bien Java, mais serait-il sage d'ajouter encore plus d'énergie en fonction de la JVM?
  • Haskell: Cela semble être une langue très appréciée, mais d'après ce que j'ai lu, c'est aussi une langue plus académique.
  • Lisp: Il existe depuis toujours. Il semble y avoir l'essentiel de ce que j'aime chez Scheme. Il a une grande communauté. Pour ce que je [pense que je sais], c'est probablement le langage de programmation fonctionnel le plus largement utilisé dans l'industrie (?).
  • F #: Je ne l'ai pas vraiment envisagé. Je ne suis pas un grand fan de la SP. Je n'ai pas l'argent pour payer leurs logiciels (je pourrais les avoir libérés des alliances universitaires, mais je suis plus enclin à opter pour des solutions axées sur la communauté). Bien que ... je suppose que ce serait le meilleur choix orienté vers une carrière.

Ce soir, je me penche vers Lisp. Il y a une semaine, c'était Haskell. Avant cela, c'était Clojure. Au cours de la dernière année, je faisais quelque chose pour le plaisir que de ne pas le pousser pour la raison que vous connaissez. Maintenant, j'aimerais être sérieux (pour en apprendre un, pour faire de vrais projets avec cela, pour éventuellement travailler de manière professionnelle avec). Mon problème est que j'aurais besoin de les apprendre tous en profondeur avant de pouvoir en choisir un.

Joanis
la source
5
Quoi que vous choisissiez, écrivez beaucoup de code que vous utilisez pour quelque chose.
8
Vous n'avez pas pensé à Scala ?
Ykombinator
@ykombinator: J'en ai entendu parler, mais je n'ai pas cherché plus loin. Je ne sais pas si cela aurait quelque chose à offrir sur ceux que j'ai énumérés, ou peut-être que cela apporterait une combinaison d'options intéressantes de chacune d'entre elles ... Je ne sais pas. Cela me semble être une langue assez discrète, même si elle semble gagner en popularité.
Joanis
1
Je ne sais pas où vous avez entendu dire que le monde Java est "au bord" - il est en train de renaître, en grande partie grâce à a) OpenJDK qui devient l'implémentation standard b) de nouveaux langages JVM comme Scala et Clojure et c) Le fait que les projets big data / cloud prennent de plus en plus en place en choisissant la machine virtuelle Java comme plate-forme cible et d) Android. Au début de 2012, il s'agit probablement de la plate-forme la plus excitante .....
mikera
1
@ Mikera: D'accord. Cela fait plus d'un an, juste après l'acquisition de Sun Microsystems par Oracle, il y avait de quoi s'inquiéter et spéculer sur le fait que l'avenir de Java serait compromis par une société plus contrôlant qui prendrait le contrôle ... La machine virtuelle semble bien sûre pour le moment, heureusement!
Joanis

Réponses:

35

Puisque vous voulez une  langue pratique :

texte alternatif

Notez que Haskell et Lisp sont plus utilisés que les autres dans l’industrie, bien que Clojure et F # aient suscité un certain intérêt récemment.

Mais regardez ce qui se passe lorsque nous ajoutons Scheme au mélange:

texte alternatif

Hmm, ça ne ressemble pas tellement à une langue académique maintenant, n'est-ce pas?

En réalité, le graphique ci-dessus est probablement un mensonge; le mot "schéma" peut apparaître dans les annonces d’aide dans d’autres contextes que les langages de programmation. :)

Voici donc un autre graphique probablement (un peu) plus représentatif:

texte alternatif

Si vous voulez explorer un dialecte vraiment génial de Scheme, jetez un œil à Racket.

Robert Harvey
la source
Wow, bon post. J'utilise exactement la raquette ... PLT-Scheme était son nom quand j'ai commencé à l'apprendre. Cette ligne rouge dans le dernier graphique me trouble. Jamais pensé Scheme pourrait être utilisé autant. Et Clojure semble bien décoller. Hmm ...
Joanis
@M. Joanis: Prenez les deux derniers graphiques avec un grain de sel; le look d'escalier et la volatilité du dernier graphique suggèrent qu'il n'y a pas beaucoup de points de données dans le graphique, bien que cela indique que quelqu'un pense que les langues valent la peine d'être payées.
Robert Harvey
@ Robert Harvey, qu'est-ce qui a changé du deuxième au troisième graphique?
systemovich
@ Geoffrey: Regardez les légendes; J'ai ajouté le mot "développeur" aux termes de recherche.
Robert Harvey
Notez que Haskell et Lisp sont également des homonymes et que les données de Indeed ne se généralisent pas au reste du monde. ITJobsWatch répertorie 79 emplois Scala, 55 emplois F #, 47 Haskell, 30 emplois Lisp et 7 emplois Clojure.
Jon Harrop
17

Si vous souhaitez apprendre la programmation fonctionnelle, il serait peut-être préférable de commencer par apprendre Haskell, puis utilisez la langue de votre choix. Vous pouvez apprendre la programmation fonctionnelle en utilisant les autres langages, mais ils permettent tout de même un code impératif et orienté objet. Si vous écrivez un vrai programme en Haskell, vous apprendrez la programmation fonctionnelle plus rapidement car les autres paradigmes ne seront pas disponibles.

Après avoir écrit votre programme Haskell, vous aurez des outils tels que des monades et des techniques telles que le codage sans points à appliquer à la langue de votre choix. Les concepts semblent particulièrement bien correspondre à Scheme.

Larry Coleman
la source
Je pense que vous avez raison de choisir d'abord un langage purement fonctionnel. Je serais très intéressé de voir une commande de langages fonctionnels par pureté.
Joanis
@M. Joanis: Parmi les langues énumérées dans votre question, je dirais que Haskell est la plus pure, suivi de Clojure, F # et Lisp.
Larry Coleman
15

En fait, si vous pouviez implémenter un système relativement complexe dans Scheme, vous seriez assez désirable dans les entreprises où vous voudriez probablement travailler. Plus tôt dans ma carrière, j'ai rencontré des étudiants qui avaient effectué pas mal de travaux dans Scheme, et le seul inconvénient de ce programme était qu'ils ne pouvaient pas expliquer leur travail ou ne le comprenaient pas assez bien pour mettre en œuvre les données de base. structures et algorithmes dans un délai raisonnable. Je laisse toujours les candidats répondre à ces questions dans la langue de leur choix; J'ai rencontré des personnes qui pensaient être les meilleures chez Scheme et qui ont réussi à se débattre un peu avec des choses qui devraient être faciles, comme ajouter un élément à une liste chaînée, ce qui m'a mystifié.

Mais si vous parveniez à "obtenir" Scheme assez bien pour écrire même une application web moyenne, ce serait un très bon argument de vente pour les entreprises de logiciels les plus sérieuses.

Si vous interviewiez dans un magasin "blub" et que les développeurs pensaient que vous étiez étrange à cause de votre maîtrise de Scheme, Haskell ou F #, vous ne voudriez probablement pas travailler là-bas. Dans la plupart des cas, les développeurs compétents obtiennent leur choix de concerts. Ne transpirez donc pas avec "l'aspect pratique", à moins que les seules options que vous puissiez imaginer pour l'avenir soient celles des entreprises. Travaillez pour être compétent, flexible et résoudre les problèmes.

College n'est pas une question de praticité. Il s'agit de créer un environnement sûr à explorer et à apprendre. C’est utile, même si vous écrivez un logiciel ordinaire pour le reste de votre carrière.

Cela étant dit, je ne vois pas pourquoi vous voudriez vous limiter à un seul de ces choix si tôt. Vous pouvez facilement vous familiariser avec les quatre langues en 4 semaines environ, puis en choisir une pour vous concentrer sur les aspects les plus appropriés de vos caprices actuels. Revenez ensuite à une autre de vos options et essayez d'implémenter quelque chose de similaire. Passez à quelque chose de plus complexe et réfléchissez à nouveau à vos options. L'expérimentation est bonne. Sauf si vous essayez de gagner votre vie le mois prochain, vous n'avez pas encore besoin de devenir spécialiste.

J'en ai écrit dans Scheme, Fa #, Emacs Lisp et Common Lisp, et j'ai lu au moins un peu de Haskell, au moins de temps en temps au cours des dernières années. Je ne peux pas dire que je suis un expert dans l'une d'elles, mais chaque excursion dans ces langues m'a été bénéfique dans toutes les autres langues dans lesquelles je travaille professionnellement (C #, Java, Ruby et occasionnellement Boo, Perl et Python). La curiosité vous construira une carrière plus durable et épanouissante qu'autre chose.

JasonTrue
la source
2
"La curiosité va vous construire une carrière plus durable et épanouissante qu'autre chose." Cette déclaration est très inspirante. Vous avez raison. Je suis trop pressé. J'ai toujours l'impression que tout cela prendra trop de temps à apprendre ... Si je pouvais remonter 12 ans en arrière, quand je commencerais, je saurais ne pas perdre tout mon temps en VB et C ++. J'ai l'impression que ces années ont été très mal gâchées. Je n'étais pas assez curieux. Je voulais coder des choses. Utiliser les langues que je connaissais était suffisant. Je pensais à cette époque que je connaissais pas mal de choses, mais ce n’était pas si horrible.
Joanis
10

J'ai plongé dans Haskell pendant un moment, mais la conclusion à laquelle je suis arrivé était que c'était un peu trop académique. Il était très difficile de faire quelque chose de concret. Dans un langage purement fonctionnel, des choses comme IO ne s'intègrent pas tout à fait dans le modèle, vous devez donc traiter avec des monades. J'ai décidé que je devrais consacrer énormément de temps pour être à peine compétent, alors je suis passé à autre chose.

J'ai fait Scheme au collège. Cela peut sembler trivial, mais tous les parens sont vraiment distrayants / ennuyeux. Difficile de revenir à cela après avoir utilisé des langages comme Python.

Récemment, j'ai exploré F #. Il est fonctionnel, mais peut aussi être impératif et orienté objet lorsque vous le souhaitez. Ceci, en plus de pouvoir utiliser n’importe quelle bibliothèque .NET, permet de mélanger facilement vos parties fonctionnelles pures avec des éléments plus pratiques tels que les interfaces graphiques, les E / S et les réseaux. Vous pouvez obtenir une version autonome de F #.

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en

Erik
la source
Le fait que F # et Clojure ne soient pas purement fonctionnels joue un rôle important en leur faveur. Peut-être que F # pourrait être mon point d’entrée dans la famille .Net un jour ...
Joanis
1
@MJoanis, vous avez indiqué le coût en tant que point contre F #, mais comme le souligne Erik, vous pouvez l'obtenir totalement gratuitement.
Benjol
Si je comprends bien les termes, vous l’obtenez gratuitement à condition de ne pas l’utiliser (ou d’acheter des licences). Mais je comprends que cela peut toujours être une très bonne chose à apprendre au cas où je me retrouverais dans une entreprise utilisant Visual Studio. Je vais probablement essayer une fois que je serai fonctionnel avec un langage de programmation fonctionnel plus libre.
Joanis
1
@M. Joanis: Non, F # est même open source et vous pouvez essayer de courir sur Mono sur d'autres plateformes.
Jon Harrop
Les temps ont peut-être changé depuis 2010, mais en tant que personne qui a commencé à apprendre le haskell au cours des derniers mois, je ne pense pas qu'il soit difficile de faire l'IO dans haskell. Pour les choses de base, vous avez juste besoin d’apprendre une nouvelle syntaxe de do. Obtenir la vraie compréhension fondamentale prend quelques semaines au maximum, mais je ne vois vraiment pas ce que le fuzz est de la monade. Je ne pense pas qu'ils aient été plus difficiles à apprendre que les classes, les instances, les membres statiques et tous les autres jazz liés à l'État dans OOP.
Sara
9

J'ai évalué tous les principaux langages fonctionnels il y a un ou deux ans, dans la perspective de vouloir un langage de programmation fonctionnel pratique à usage général.

J'ai finalement choisi Clojure , qui s'est révélé par la suite un excellent choix.

De manière générale, les principales raisons étaient les suivantes:

  • Écosystème de bibliothèques - pour qu'un langage soit utile, vous devez avoir accès à de bonnes bibliothèques. Faire partie de la JVM signifie que vous avez un accès facile à la plus grande bibliothèque open source et à l'écosystème d'outils. Par conséquent, opter pour un langage JVM était une évidence du point de vue pragmatique. Scala a également obtenu d'excellents résultats ici.

  • Macrométaprogrammation - Cet aspect de Lisp m'a toujours interpellé, d'autant plus que je pensais créer un peu de code. J'ai beaucoup apprécié les arguments avancés dans le court essai de Paul Graham " Beating The Averages ". Les différents Lisps ont tous marqué des points ici.

  • Les performances étaient "suffisantes" - Clojure est toujours compilé et bénéficie des avantages de l'optimiseur JVM JIT et de l'excellent GC. Comme toujours, l'utilisation d'un langage fonctionnel présente un surcoût, mais avec Clojure, il était clair que chacun pouvait se rapprocher de la vitesse de Java avec un peu d'effort (Clojure prend en charge les primitives Java et le typage statique optionnel dans les situations où vous en avez besoin). Mon estimation est que Clojure est environ deux à cinq fois plus lent que ce que vous pourriez obtenir avec un code Java ou C ++ optimisé, ce qui est cohérent avec ce que vous voyez dans les points de repère erronés , et avec le temps, cet écart devrait se réduire davantage. En outre, il est assez facile d'écrire du code particulièrement sensible aux performances en Java pur et de l'appeler depuis Clojure.

  • Concurrence - Clojure a une approche assez unique et puissante de la concurrence, en particulier pour la concurrence extrêmement multicœur. C'est un peu difficile à expliquer, mais cette vidéo est excellente pour donner un aperçu des principes. Je pense que Clojure a actuellement la meilleure réponse à la question épineuse "comment gérer des états partagés, simultanés et mutables dans un langage de programmation fonctionnel?".

  • Conception de langage - Clojure est un logiciel de conception de langage très bien conçu par l’OMI. Par exemple, les littéraux vector [] et map {} s'ajoutent aux parenthèses Lisp habituelles, l'utilisation de structures de données persistantes immuables, la paresse dans la langue via l'abstraction de séquence et la fourniture au programmeur de diverses fonctionnalités orthogonales pour résoudre différents problèmes . Voir l'art de l'abstraction et simple rendu facile .

  • Communauté - toujours subjective, mais j'ai aimé ce que j'ai vu dans la communauté Clojure. L'attitude était très utile, constructive et pragmatique. Il y a un fort accent mis sur le "faire avancer les choses", ce qui reflète peut-être le fait qu'un grand nombre de membres de Clojure (y compris Rich Hickey lui-même) viennent de la création de systèmes d'entreprise complexes. Le fait que la communauté Clojure ait également des liens étroits avec la communauté Java était important pour me convaincre que Clojure ne courrait pas le risque de rester coincé dans une "niche".

Si je devais nommer quelques inconvénients mineurs de Clojure, ceux-ci seraient:

  • Le typage dynamique est souvent un avantage en termes de productivité, mais en moyenne, je pense que je l’échangerais contre un contrôle de type et une inférence plus solides. La plupart du temps, cela est atténué par une bonne suite de tests automatisés, mais si vous aimez vos types validés statiquement par le compilateur, alors Haskell ou Scala seront peut-être davantage votre tasse de thé.

  • À la fine pointe - Clojure se développe très rapidement et beaucoup d’innovations sont en cours. L’inconvénient, c’est qu’il ya beaucoup d’expérimentation, que certaines bibliothèques et certains outils sont encore immatures et qu’il y a parfois des changements radicaux entre les versions majeures de Clojure. besoin de garder un oeil sur.

Mais dans l’ensemble, je ne pense pas que vous pouvez vous tromper avec Clojure si vous voulez un langage fonctionnel moderne, excellent et pragmatique!

Mikera
la source
1
Merci! Très bonne publication! J'étais justement en train de penser à l'utiliser pour un projet interne à la société qui sera fortement basé sur les arbres et la récursivité. De plus, nous avons beaucoup de code Java que nous pouvons réutiliser avec Clojure.
Joanis
6

On dirait que vous avez fait vos devoirs, alors vous le savez probablement déjà, mais Scheme est un dialecte de Lisp, tout comme Common Lisp. Si vous aimez beaucoup de choses à propos de Scheme, mais que vous n'aimez pas sa nature académique, essayez Common Lisp. Selon l' indice TIOBE , il s'agit de la 13ème langue la plus populaire contre Scheme à la 26ème position.

Quelques-unes des langues que vous avez mentionnées apparaissent dans les descriptions de travail que j'ai vues récemment, bien que cela puisse être mon petit échantillon. Personnellement, j'apprendrai Haskell, même si je ne compte pas utiliser cette langue directement dans mon travail. Les concepts de programmation fonctionnelle me sont plus précieux pour la conception de programmes futurs que la possibilité de commercialisation directe du langage lui-même.

Zeke
la source
Merci pour le lien TIOBE, c’est une référence intéressante. Je suppose que vous choisissez Haskell pour sa pureté en terme de programmation fonctionnelle?
Joanis
1
@ M.Joanis: Assez bien, bien que je pense aussi à prendre Lisp plus tard. Voir programmers.stackexchange.com/questions/18838/…
Zeke
La réponse choisie a beaucoup de sens. La pureté semble être la voie à suivre jusqu'à ce que j'ai vraiment saisi toute la question du paradigme fonctionnel.
Joanis