Scala vs. Groovy vs. Clojure [fermé]

676

Quelqu'un peut-il expliquer les principales différences entre Scala, Groovy et Clojure. Je connais chacune de ces compilations à exécuter sur la machine virtuelle Java, mais je voudrais une comparaison simple entre elles.

James Fassett
la source

Réponses:

873

Groovy est un langage typé dynamiquement, dont la syntaxe est très proche de Java, avec un certain nombre d'améliorations de syntaxe qui permettent un code plus léger et moins passe-partout. Il peut passer par un interpréteur et être compilé, ce qui le rend bon pour le prototypage rapide, les scripts et l'apprentissage de langages dynamiques sans avoir à apprendre une nouvelle syntaxe (en supposant que vous connaissez Java). Depuis Groovy 2.0, il prend également en charge de plus en plus la compilation statique . Groovy prend en charge les fermetures et prend en charge la programmation dans un style quelque peu fonctionnel, bien qu'il soit encore assez loin de la définition traditionnelle de la programmation fonctionnelle.

Clojure est un dialecte de Lisp avec quelques fonctionnalités avancées comme la mémoire transactionnelle logicielle . Si vous aimez Lisp et souhaitez utiliser quelque chose comme ça sous la JVM, Clojure est pour vous. C'est peut-être le langage le plus fonctionnel sur la JVM, et certainement le plus célèbre. En outre, il met davantage l'accent sur l' immuabilité que les autres dialectes lispiens, ce qui le rapproche du cœur des amateurs de langage fonctionnel.

Scala est un langage entièrement orienté objet, plus que Java, avec l'un des systèmes de type les plus avancés disponibles sur les langages non destinés à la recherche, et certainement le système de type le plus avancé sur la JVM. Il combine également de nombreux concepts et caractéristiques des langages fonctionnels, sans compromettre l'orientation de l'objet, mais son compromis sur les caractéristiques du langage fonctionnel rebute certains passionnés de ce dernier.

Groovy a une bonne acceptation et un framework web populaire dans Grails. Il alimente également le système de construction Gradle, qui devient une alternative populaire à Maven. Personnellement, je pense que c'est un langage avec une utilité limitée, en particulier lorsque Jython et JRuby commencent à faire des incursions sur le terrain JVM, par rapport aux autres.

Clojure, même en écartant certaines fonctionnalités très intéressantes, a un fort attrait simplement en étant un dialecte Lisp sur JVM. Cela pourrait limiter sa popularité, certes, mais je m'attends à ce qu'il ait une communauté fidèle autour d'elle pendant longtemps.

Scala peut concurrencer directement Java et lui faire courir son argent sur presque tous les aspects. Il ne peut pas rivaliser en popularité pour le moment, bien sûr, et le manque d'un solide soutien des entreprises peut entraver son acceptation dans les environnements d'entreprise. C'est aussi un langage beaucoup plus dynamique que Java, dans le sens de son évolution. Du point de vue de la langue, c'est une bonne chose. Du point de vue des utilisateurs qui prévoient d’écrire des milliers de lignes de code, ce n’est pas le cas.

En tant que divulgation finale, je connais très bien Scala et je ne connais que les deux autres.

Daniel C. Sobral
la source
1
Joli. Bien que je doive dire que Scala a le soutien de Lightbend et est utilisé par de grands noms comme LinkedIn, Twitter, Spark et beaucoup de banques. Là où je travaille, nous avons une base de code de 11 millions de lignes de Scala, ce qui n'est pas une bonne idée mais cela fonctionne.
Joan
219

Scala

Scala a évolué à partir d'un langage fonctionnel pur appelé Funnel et représente une implémentation en salle blanche de presque toute la syntaxe Java, ne différant que là où une nette amélioration pourrait être apportée ou là où elle compromettrait la nature fonctionnelle du langage. Ces différences incluent les objets singleton au lieu des méthodes statiques et l'inférence de type.

Une grande partie de cela était basée sur les travaux antérieurs de Martin Odersky avec le langage Pizza . L'intégration OO / FP va bien au-delà de simples fermetures et a conduit à qualifier le langage de post-fonctionnel.

Malgré cela, c'est le plus proche de Java à bien des égards. Principalement en raison d'une combinaison de support OO et de typage statique, mais aussi en raison d'un objectif explicite dans la conception du langage qu'il devrait intégrer très étroitement avec Java.

Sensationnel

Groovy s'attaque explicitement à deux des plus grandes critiques de Java en

  • étant typé dynamiquement, ce qui supprime beaucoup de passe-partout et
  • ajout de fermetures à la langue.

Il est peut-être syntaxiquement le plus proche de Java, n'offrant pas certaines des constructions fonctionnelles les plus riches fournies par Clojure et Scala, mais offrant néanmoins une nette amélioration évolutive - en particulier pour l'écriture de programmes de style script.

Groovy a le soutien commercial le plus solide des trois langues, principalement via springsource.

Clojure

Clojure est un langage fonctionnel de la famille LISP, il est également typé dynamiquement.

Des fonctionnalités telles que la prise en charge STM lui confèrent une des meilleures prises en charge simultanées prêtes à l'emploi , tandis que Scala nécessite une bibliothèque tierce telle que Akka pour la dupliquer.

Syntaxiquement, c'est aussi le plus éloigné des trois langages du code Java typique.

Je dois également révéler que je connais le mieux Scala :)

Kevin Wright
la source
11
Je n'avais jamais entendu parler de ce langage Funnel auparavant. Merci d'avoir comblé une petite lacune dans le dossier historique.
Randall Schulz
8
Vous ne pouvez pas vraiment appeler Clojure un langage fonctionnel pur . Il est certainement possible d'écrire du code impératif.
dbyrne
2
Scala a intégré la bibliothèque Akka pour la concurrence basée sur les acteurs. Ce n'est plus une dépendance tierce.
scott m gardner
2
@Orubel En bytecode, une classe scala est identique à la classe Java équivalente - types et tout. À titre d'exemple, l'intégralité de l'API Java Akka est écrite en Scala. Veuillez donc expliquer ce que vous entendez par «ne peut pas s'intégrer» ici - car il se lit comme du FUD pour moi.
Kevin Wright
3
Pour résumer ce document: "Les fonctionnalités Scala qui n'existent pas en Java ne peuvent pas être directement utilisées en Java". Cependant ... les membres de type abstrait et les types de type supérieur sont des fonctionnalités assez avancées que vous n'êtes certainement pas obligé d'utiliser! Java ne peut pas non plus utiliser de méthodes sans paramètres, générateurs ou modules d'extension de Groovy, ce qui rend Groovy "pas étroitement intégré" selon votre propre définition.
Kevin Wright
68

Je n'ai jamais eu le temps de jouer avec clojure. Mais pour scala vs groovy, ce sont les mots de James Strachan - créateur Groovy

"Bien que mon astuce pour le remplacement à long terme de javac soit Scala. J'en suis très impressionné! Je peux honnêtement dire si quelqu'un m'a montré le livre Programming in Scala de Martin Odersky, Lex Spoon & Bill Venners en 2003 I n'aurais probablement jamais créé Groovy. "

Vous pouvez lire toute l'histoire ici

Thai Tran
la source
72
Il convient de mentionner que cette déclaration ne signifie pas que Scala est meilleur que Groovy. James est également connu pour avoir dit que s'il avait su à quel point il était difficile de créer un langage, il n'en aurait jamais créé un. Vu dans ce contexte, il est clair pourquoi il n'aurait pas développé Groovy alors bien sûr. Et j'ose dire qu'il a donné beaucoup de bonnes idées, mais il n'est pas le créateur de l'actuel Groovy. il a quitté le projet bien avant le 1.0 en 2007 et n'a plus participé depuis lors. Il y a au moins autant sans lui dans le projet qu'il y en avait avec lui.
blackdrag
31
Et étant donné que James Strachan travaille activement sur la langue Kotlin, Scala n'est apparemment pas assez impressionnant pour lui.
bdkosher
6
@bdkosher il y travaille parce que Scala est trop impressionnant pour la plupart des programmeurs… et [plus important encore,] dans certains endroits trop compliqué aussi
Nom
30

Ils peuvent être différenciés selon leur provenance ou les développeurs qu'ils ciblent principalement.

Groovy est un peu comme la version de script de Java. Les programmeurs Java de longue date se sentent chez eux lorsqu'ils créent des applications agiles soutenues par de grandes architectures. Groovy on Grails est, comme son nom l'indique, similaire au framework Rails. Pour les personnes qui ne veulent pas se soucier de la verbosité de Java tout le temps.

Scala est un langage de programmation orienté objet et fonctionnel et les programmeurs Ruby ou Python peuvent se sentir plus proches de celui-ci. Il emploie beaucoup de bonnes idées communes trouvées dans ces langages de programmation.

Clojure est un dialecte du langage de programmation Lisp afin que les développeurs Lisp, Scheme ou Haskell puissent se sentir à l'aise lors du développement avec ce langage.

Mehmet Duran
la source
24
Scala n'est pas vraiment un langage de programmation fonctionnel. C'est d'abord un langage de programmation orienté objet, avec des fonctionnalités fonctionnelles.
Daniel C.Sobral
16
Je dois dire que cette réponse ressemble beaucoup à un tir dans le noir. Je pense que l'on pourrait faire valoir que Python est plus proche de Groovy que de Scala, et Ruby n'est (à mon avis) pas trop proche de tout ce qui précède, peut-être encore plus proche de Groovy. Haskell n'est pas trop comme Lisp (Scheme) ou Scheme (et donc pas comme Clojure). Pour moi, cette réponse ressemble (au mieux!) À "Je ne sais pas non plus, laissez-moi Wikipédia pour vous".
John Y
21
Scala est un langage impératif avec quelques fonctionnalités fonctionnelles. Si les gens continuent d'appeler un langage fonctionnel dès qu'il adopte des idiomes du monde fonctionnel, alors le terme deviendra juste un autre terme marketing. Autant commencer à appeler C ++ fonctionnel et Haskell impératif.
jon-hanson
9
@alanlcode Odersky peut dire ce qu'il veut. Scala n'a pas de système pour isoler les effets secondaires, il n'est pas paresseux par défaut et ne traite pas le code comme des données - il traite les appels de fonction comme des données, ce qui est différent. Ce sont de gros problèmes si vous voulez être pleinement fonctionnel. D'un autre côté, Scala fait tout son possible pour s'assurer que son modèle d'objet n'est pas imparfait. J'adore Scala, mais c'est clairement une seconde fonction.
Daniel C.Sobral
7
En revanche, la famille de langages ML est reconnue comme fonctionnelle mais stricte et autorise les effets secondaires / code impératif.
GClaramunt
8

Je lis le livre des programmeurs pragmatiques "Recettes Groovy: Graisser les roues de Java" par Scott Davis, Copyright 2008 et imprimé en avril de la même année.

C'est un peu dépassé mais le livre montre clairement que Groovy est littéralement une extension de Java. Je peux écrire du code Java qui fonctionne exactement comme Java et renommer le fichier * .groovy et cela fonctionne très bien. Selon le livre, l'inverse est vrai si j'inclus les bibliothèques requises. Jusqu'à présent, l'expérimentation semble le confirmer.

Jim Collings
la source
C'est le meilleur livre pour apprendre Groovy.
topr
Il est probablement important de noter que tout le code ne se comportera pas exactement de la même manière. Certaines de ces différences incluent la façon dont Groovy comprend les guillemets simples et doubles et sa préférence pour la boxe par rapport à l'élargissement. Cependant, la plupart du code fonctionnera de la même manière.
Ontonator
4

Évidemment, la syntaxe est complètement différente (Groovy est le plus proche de Java), mais je suppose que ce n'est pas ce que vous demandez.

Si vous êtes intéressé à les utiliser pour scripter une application Java, Scala n'est probablement pas un bon choix, car il n'y a pas de moyen facile de l'évaluer à partir de Java, alors que Groovy est particulièrement adapté à cette fin.

Thilo
la source
Je ne comprends pas votre point sur l'utilisation de Scala pour script Java. Vous pouvez certainement écrire un script Scala qui pilote le code Java; non evalrequis.
Daniel Yankowsky
2
@Daniel, veuillez consulter la question sur l'utilisation de Scala pour l'écriture de scripts que j'ai liée. La réponse acceptée est que le manque de fonctionnalité "eval" et de prise en charge de javax.scripting rend plus difficile l'utilisation de Scala pour scripter une application Java, alors c'est avec, disons, Groovy.
Thilo