Je veux apprendre un langage fonctionnel qui sera utile pour construire des applications web à l'avenir. J'ai le choix entre Clojure et Haskell. Lequel est le meilleur choix pour mon objectif ?
Réponses
Trop de publicités?Je ne sais pas si c'est le cas pour Haskell, mais Clojure dispose de Compojure qui est un cadre web vaguement similaire à Rails. Clojure peut tirer parti de ce que Java apporte : des bibliothèques matures et stables pour de nombreux éléments orientés web, des servlets, etc. Jetty est un très bon serveur HTTP Java qui est facile à utiliser à partir de Clojure. La JVM est très mature, testée et multiplateforme. Elle fonctionne bien et est facile à installer presque partout. Clojure est également conçu avec le multi-threading en tête, ce qui est parfois pratique pour les applications web.
Un exemple de la raison pour laquelle un Lisp est bon pour le développement web est le grand nombre de bibliothèques sexp-to-HTML, qui est de loin le meilleur moyen que j'ai trouvé pour produire du HTML. (L'une d'entre elles est incluse dans Compojure, et il n'est pas non plus difficile de les écrire soi-même à partir de zéro).
Vous pouvez alors écrire votre HTML en Clojure directement sous forme de s-exps et laisser Clojure faire le sale boulot de fermer vos balises, d'indenter, de vérifier les fautes de frappe, etc. Vous pouvez convertir les styles de sortie XHTML ou HTML ou XML. Vous pouvez utiliser toute la puissance de Clojure pour faire des boucles, des " modèles " (via des appels de fonctions ou de macros), des substitutions de variables et autres. Il s'agit d'un modèle HTML bien conçu. C'est l'une des forces de Lisp : vous pouvez créer et utiliser de puissants langages spécifiques à un domaine, et faire tout votre codage directement en Lisp.
Tout d'abord, je voudrais ajouter que je ne suis pas sûr de ce que les gens veulent dire en disant que Haskell et Clojure ne sont pas adaptés à la programmation web. Ruby était-il adapté à la programmation web avant Rails ? SmallTalk était-il adapté à la programmation web avant Seaside ? Bien sûr qu'ils l'étaient, sinon les gens n'auraient pas pris le temps de construire ces bibliothèques !
Quoi qu'il en soit, il me semble que Clojure est fortement influencé par Haskell dans de nombreux aspects de sa conception (STM, disponibilité de certaines fonctions). L'interopérabilité avec Java et sa large base de bibliothèques lui confèrent également un avantage considérable. La décision de Rich Hickey d'importer de bonnes idées de Haskell dans son propre Lisp montre qu'il y a certaines caractéristiques de Lisp qui manquent à Haskell - un puissant environnement de développement incrémental (via SLIME), la modification de programmes en cours d'exécution à la volée, le typage dynamique, les macros, etc. Cette importation montre que l'on peut apprendre beaucoup de choses de The Haskell Way, mais si je devais parier sur le langage qui sera le plus pertinent pour le web, je parierais sur Clojure.
En tant que programmeur web professionnel indépendant, je pense que les seuls frameworks qui comptent vraiment à ce stade (dans une perspective d'avenir) sont Rails (et ses semblables), Django et Seaside (et ses semblables - Weblocks). Nous sommes à la fin de la domination de PHPs pour les hackers web indépendants (note, je n'ai aucune opinion sur les méthodologies de programmation web des entreprises). Django et Rails domineront pendant les 4-5 prochaines années, mais je crois que les frameworks de style Seaside sont le véritable avenir de la programmation web et Clojure semble être le mieux équipé pour supporter un framework de style Seaside.
Nous pourrions débattre du typage dynamique ou statique pendant des siècles sans jamais parvenir à une conclusion. Nous pourrions discuter des expressions s et des parenthèses ou de la nécessité d'une indentation correcte pour structurer le code, sans parvenir à une conclusion.
Mon frère et moi avons ce débat encore et encore. Il regarde Clojure et le trouve logique, beau, il adore le typage dynamique et est en grande partie d'accord avec toutes les décisions de conception prises par Rich. En fait, il fait un patch au langage sous-jacent pour modifier l'aspect paresseux du langage afin de résoudre une décision de méthodologie de conception qu'il utilise, mais à part cela, il le considère comme le langage parfait.
Je regarde Haskell et je le trouve logique, beau et j'aime le typage statique.
Pour lui, clojure ne fait que "cliquer", pour moi, haskell ne fait que "cliquer".
En fin de compte, il s'agit de langues très similaires, si bien qu'en appliquant la règle du 80/20, la langue que vous choisirez ne fera pas une grande différence pour vous.
Je pense que le fait d'utiliser tel ou tel langage détourne un peu l'attention du domaine. Mon frère développe principalement des applications web et dit que l'utilisation de jvm et des bibliothèques java est un énorme avantage, tandis que je développe des applications serveur et je trouve que haskell est un bon choix sans avoir à me soucier de la surcharge de jvm et à avoir accès à toutes les bibliothèques dont j'ai besoin.
Si vous souhaitez simplement apprendre un langage, choisissez celui qui vous convient le mieux, mais si vous souhaitez spécifiquement faire du développement web, je vous suggère Clojure.
Je ne vois ni l'un ni l'autre comme une grande plateforme pour le web. Mais Haskell est beaucoup plus mature et a beaucoup de cerveaux derrière lui. Consultez le travail de Peter Thiemann sur WASH et les outils connexes pour la programmation web en Haskell.
Comme les langages en général, Clojure est dynamique et fonctionne sur JVM. Haskell possède un système de types statique puissant (qui vous aide plutôt que de vous gêner) et possède à la fois des interprètes et des compilateurs de code natif. Il existe une infrastructure beaucoup plus mature pour Haskell, par exemple, des choses comme QuickCheck et SmallCheck pour des tests unitaires vraiment faciles.
Si votre application est appelée à évoluer vers quelque chose de grand, Haskell est probablement le bon choix. Si vous voulez la saveur dynamique de Lisp, vous serez plus heureux avec Clojure. Je dirais provisoirement que l'apprentissage de Haskell élargira davantage votre esprit et que vous serez en mesure de faire plus de choses, et des choses plus intéressantes, avec vos nouvelles connaissances.
Je vous encourage à regarder le Happstack un framework web en Haskell.
Il est très rapide (il peut gérer plus de 6000 reqs/seconde sur mon modeste ordinateur portable).
Le composant happstack-state est très intéressant. Il s'agit essentiellement d'un système de base de données qui utilise des types de données Haskell natifs et où les requêtes sont de pures fonctions Haskell. Vous n'avez pas besoin d'essayer d'adapter vos données à un ensemble limité de types de données (comme SQL). Au lieu de cela, vous pouvez utiliser des types de données algébriques expressifs et des structures de données telles que les arbres, les graphes, etc. Vos fonctions d'interrogation sont également du code Haskell natif. Vous bénéficiez donc de performances rapides et d'un langage de requête complet et très puissant (Haskell). Il est également protégé contre les attaques par injection de chaînes de caractères.
Pour une sécurité de type supplémentaire, vous pouvez utiliser des éléments tels que les formlets (pour un traitement de formulaire sécurisé) ou les web-routes (pour un routage d'url sécurisé).
Happstack est également conçu pour être flexible et ne pas vous obliger à une seule façon de faire les choses. Ainsi, vous pouvez toujours facilement parler aux bases de données SQL, etc. Et il supporte une grande variété d'options de modèles HTML/XML/etc.
D'après mon expérience, l'utilisation d'un langage à sécurité de type, comme Haskell, s'est avérée très utile pour le travail de développement web. Surtout lorsque l'on travaille en équipe. Lorsque vous effectuez un changement majeur dans votre code, vous obtenez de nombreuses erreurs de type au moment de la compilation. Une fois que vous les avez corrigées, les choses ont tendance à fonctionner à nouveau. En comparaison, si vous deviez utiliser un système dynamique avec SQL, lorsque votre base de données change, vous n'avez aucun moyen simple d'être sûr que toutes vos requêtes fonctionneront toujours avec le nouveau schéma.
- jeremy