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.
Réponses:
Puisque vous voulez une langue pratique :
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:
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:
Si vous voulez explorer un dialecte vraiment génial de Scheme, jetez un œil à Racket.
la source
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.
la source
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.
la source
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
la source
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!
la source
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.
la source