Scala vs. Groovy vs. Clojure [geschlossen]

676

Kann jemand bitte die Hauptunterschiede zwischen Scala, Groovy und Clojure erklären. Ich weiß, dass jede dieser Kompilierungen auf der JVM ausgeführt werden kann, möchte aber einen einfachen Vergleich zwischen ihnen.

James Fassett
quelle

Antworten:

873

Groovy ist eine dynamisch typisierte Sprache, deren Syntax Java sehr nahe kommt, mit einer Reihe von Syntaxverbesserungen, die leichteren Code und weniger Boilerplate ermöglichen. Es kann sowohl einen Interpreter durchlaufen als auch kompiliert werden, was es für schnelles Prototyping, Skripte und das Erlernen dynamischer Sprachen gut macht, ohne eine neue Syntax lernen zu müssen (vorausgesetzt, Sie kennen Java). Ab Groovy 2.0 wird auch die statische Kompilierung zunehmend unterstützt . Groovy unterstützt Closures und unterstützt das Programmieren in einem etwas funktionalen Stil, obwohl es noch ziemlich weit von der traditionellen Definition der funktionalen Programmierung entfernt ist.

Clojure ist ein Lisp-Dialekt mit einigen erweiterten Funktionen wie Software Transactional Memory . Wenn Sie Lisp mögen und so etwas unter der JVM verwenden möchten, ist Clojure genau das Richtige für Sie. Es ist möglicherweise die funktionalste Sprache, die auf der JVM ausgeführt wird, und sicherlich die bekannteste. Außerdem wird die Unveränderlichkeit stärker betont als bei anderen Lisp-Dialekten, wodurch sie den Enthusiasten funktionaler Sprachen näher kommt.

Scala ist eine vollständig objektorientierte Sprache, mehr als Java, mit einem der fortschrittlichsten Typsysteme, die für Nicht-Forschungssprachen verfügbar sind, und sicherlich dem fortschrittlichsten Typsystem in der JVM. Es kombiniert auch viele Konzepte und Merkmale funktionaler Sprachen, ohne die Objektorientierung zu beeinträchtigen, aber sein Kompromiss bei den Merkmalen der funktionalen Sprache schreckt einige Enthusiasten der letzteren ab.

Groovy hat eine gute Akzeptanz und ein beliebtes Webframework in Grails. Es unterstützt auch das Gradle-Build-System, das zu einer beliebten Alternative zu Maven wird. Ich persönlich denke, es ist eine Sprache mit begrenztem Nutzen, insbesondere da Jython und JRuby im Vergleich zu den anderen auf dem JVM-Land Fuß fassen.

Clojure, der sogar einige sehr interessante Funktionen außer Acht lässt, hat einen starken Reiz, nur weil es ein Lisp-Dialekt auf JVM ist. Zugegeben, es könnte seine Popularität einschränken, aber ich gehe davon aus, dass es für lange Zeit eine treue Gemeinschaft geben wird.

Scala kann direkt mit Java konkurrieren und in fast allen Aspekten um sein Geld kämpfen. Im Moment kann es natürlich nicht mit der Popularität mithalten, und das Fehlen einer starken Unternehmensunterstützung kann seine Akzeptanz in Unternehmensumgebungen beeinträchtigen. Es ist auch eine viel dynamischere Sprache als Java, im Sinne der Entwicklung der Sprache. Aus der Sicht der Sprache ist das eine gute Sache. Aus der Sicht von Benutzern, die Tausende von Codezeilen schreiben möchten, nicht so.

Als letzte Enthüllung bin ich mit Scala sehr vertraut und kenne nur die anderen beiden.

Daniel C. Sobral
quelle
1
Schön. Obwohl ich sagen muss, dass Scala von Lightbend unterstützt wird und von großen Namen wie LinkedIn, Twitter, Spark und vielen Banken verwendet wird. Wo ich arbeite, haben wir eine Codebasis von 11 Millionen Zeilen Scala, was keine gute Idee ist, aber funktioniert.
Joan
219

Scala

Scala entwickelte sich aus einer reinen funktionalen Sprache, die als Trichter bekannt ist, und stellt eine Reinraumimplementierung fast aller Java-Syntax dar. Sie unterscheidet sich nur dort, wo eine deutliche Verbesserung erzielt werden könnte oder wo dies die funktionale Natur der Sprache beeinträchtigen würde. Zu diesen Unterschieden gehören Singleton-Objekte anstelle statischer Methoden und Typinferenz.

Ein Großteil davon basierte auf Martin Oderskys früherer Arbeit mit der Pizza- Sprache. Die OO / FP-Integration geht weit über bloße Schließungen hinaus und hat dazu geführt, dass die Sprache als postfunktional beschrieben wird.

Trotzdem ist es Java in vielerlei Hinsicht am nächsten. Hauptsächlich aufgrund einer Kombination aus OO-Unterstützung und statischer Typisierung, aber auch aufgrund eines expliziten Ziels im Sprachdesign, dass es sehr eng in Java integriert werden sollte.

Groovy

Groovy geht explizit zwei der größten Kritikpunkte von Java an

  • dynamisch getippt werden, wodurch viel Boilerplate entfernt wird und
  • Hinzufügen von Verschlüssen zur Sprache.

Es ist Java vielleicht syntaktisch am nächsten und bietet nicht einige der umfangreicheren Funktionskonstrukte, die Clojure und Scala bieten, aber dennoch eine deutliche evolutionäre Verbesserung - insbesondere für das Schreiben von Programmen im Skriptstil.

Groovy hat die stärkste kommerzielle Unterstützung der drei Sprachen, hauptsächlich über springsource.

Clojure

Clojure ist eine funktionale Sprache in der LISP-Familie und wird auch dynamisch typisiert.

Funktionen wie die STM-Unterstützung bieten einige der besten sofort einsatzbereiten Parallelitätsunterstützungen, während Scala eine Bibliothek eines Drittanbieters wie Akka benötigt , um diese zu duplizieren.

Syntaktisch ist es auch die am weitesten vom typischen Java-Code entfernte der drei Sprachen.

Ich muss auch offenlegen, dass ich Scala am besten kenne :)

Kevin Wright
quelle
11
Ich habe noch nie von dieser Trichtersprache gehört. Vielen Dank, dass Sie eine kleine Lücke in der historischen Aufzeichnung geschlossen haben.
Randall Schulz
8
Man kann Clojure nicht wirklich als reine Funktionssprache bezeichnen. Es ist sicherlich möglich, imperativen Code zu schreiben.
Dbyrne
2
Scala hat die Akka-Bibliothek für schauspielerbasierte Parallelität eingebaut. Es ist keine Abhängigkeit von Drittanbietern mehr.
Scott M. Gardner
2
@Orubel Im Bytecode ist eine Scala-Klasse identisch mit den entsprechenden Java-Klassentypen und allen. In diesem Fall ist die gesamte Akka Java-API in Scala geschrieben. Erklären Sie hier bitte, was Sie unter "kann nicht integrieren" verstehen - denn es liest sich für mich wie FUD.
Kevin Wright
3
Um dieses Dokument zusammenzufassen: "Scala-Funktionen, die in Java nicht vorhanden sind, können in Java nicht direkt verwendet werden". Jedoch ... abstrakte Typmitglieder und höherwertige Typen sind ziemlich fortgeschrittene Funktionen, zu deren Verwendung Sie sicherlich nicht gezwungen sind! Java kann auch keine Methoden ohne Parameter, Builder oder Erweiterungsmodule von Groovy verwenden, wodurch Groovy nach Ihrer eigenen Definition "nicht eng integriert" wird.
Kevin Wright
68

Ich hatte nie Zeit, mit Clojure zu spielen. Aber für Scala vs Groovy sind dies Worte von James Strachan - Groovy Schöpfer

"Obwohl mein Tipp für den langfristigen Ersatz von Javac Scala ist. Ich bin sehr beeindruckt davon! Ich kann ehrlich sagen, wenn mir jemand 2003 das Buch" Programming in Scala "von Martin Odersky, Lex Spoon & Bill Venners gezeigt hätte Ich hätte Groovy wahrscheinlich nie erschaffen. "

Sie können die ganze Geschichte hier lesen

Thai Tran
quelle
72
Es sollte erwähnt werden, dass diese Aussage nicht besagt, dass Scala besser ist als Groovy. James ist auch dafür bekannt zu sagen, dass er niemals eine Sprache geschaffen hätte, wenn er gewusst hätte, wie schwierig es ist, eine Sprache zu erschaffen. In diesem Zusammenhang ist klar, warum er Groovy damals natürlich nicht entwickelt hätte. Und ich wage zu sagen, dass er viele gute Ideen gegeben hat, aber er ist nicht der Schöpfer des aktuellen Groovy. Er hat das Projekt lange vor dem 1.0 im Jahr 2007 verlassen und hat seitdem nicht mehr teilgenommen. Es gibt mindestens so viel ohne ihn im Projekt wie mit ihm.
Blackdrag
31
Und da James Strachan aktiv an der Kotlin-Sprache arbeitet, ist Scala für ihn anscheinend nicht beeindruckend genug.
Bdkosher
6
@bdkosher er arbeitet daran, weil Scala für die meisten Programmierer zu beeindruckend ist … und [was noch wichtiger ist] an einigen Stellen auch zu kompliziert
Anzeigename
30

Sie können unterschieden werden, woher sie kommen oder welche Entwickler sie hauptsächlich ansprechen.

Groovy ist ein bisschen wie eine Skriptversion von Java. Langjährige Java-Programmierer fühlen sich zu Hause, wenn sie agile Anwendungen erstellen, die von großen Architekturen unterstützt werden. Groovy on Grails ähnelt, wie der Name schon sagt, dem Rails-Framework. Für Leute, die sich nicht ständig mit Javas Ausführlichkeit beschäftigen wollen.

Scala ist eine objektorientierte und funktionale Programmiersprache, und Ruby- oder Python-Programmierer fühlen sich dieser möglicherweise näher. Es verwendet eine Menge allgemeiner guter Ideen, die in diesen Programmiersprachen zu finden sind.

Clojure ist ein Dialekt der Programmiersprache Lisp, sodass sich Lisp-, Scheme- oder Haskell-Entwickler bei der Entwicklung mit dieser Sprache möglicherweise zu Hause fühlen.

Mehmet Duran
quelle
24
Scala ist keine funktionale Programmiersprache. Es ist zunächst eine objektorientierte Programmiersprache mit funktionalen Merkmalen.
Daniel C. Sobral
16
Ich muss sagen, diese Antwort fühlt sich sehr nach einem Schuss in die Dunkelheit an. Ich denke, es könnte ein guter Fall sein, dass Python Groovy näher ist als Scala, und Ruby ist (meiner Meinung nach) keinem der oben genannten Punkte zu nahe, vielleicht Groovy am nächsten. Haskell ist nicht zu sehr wie (Common) Lisp oder Scheme (und daher nicht so sehr wie Clojure). Für mich fühlt sich diese Antwort (bestenfalls!) Wie "Ich weiß es auch nicht, lass mich das für dich Wikipedia" an.
John Y
21
Scala ist eine zwingende Sprache mit einigen funktionalen Merkmalen. Wenn Menschen eine Sprache weiterhin als funktional bezeichnen, sobald sie Redewendungen aus der funktionalen Welt übernimmt, wird der Begriff nur ein weiterer Marketingbegriff. Könnte auch anfangen, C ++ als funktional und Haskell als Imperativ zu bezeichnen.
Jon-Hanson
9
@ Alanlcode Odersky kann sagen, was er will. Scala hat kein System, um Nebenwirkungen zu isolieren, es ist standardmäßig nicht faul und behandelt Code nicht als Daten - es behandelt Funktionsaufrufe als Daten, was anders ist. Dies sind große Probleme, wenn Sie voll funktionsfähig sein möchten. Auf der anderen Seite geht Scala den ganzen Weg, um sicherzustellen, dass das Objektmodell nicht fehlerhaft ist. Ich liebe Scala, aber es ist eindeutig funktionale Sekunde.
Daniel C. Sobral
7
Andererseits wird die ML-Sprachfamilie als funktional anerkannt, ist jedoch streng und erlaubt Nebenwirkungen / imperativen Code.
GClaramunt
8

Ich lese das Buch "Groovy Recipes: Schmieren der Räder von Java" von Scott Davis, Copyright 2008, das im April desselben Jahres gedruckt wurde.

Es ist etwas veraltet, aber das Buch macht deutlich, dass Groovy buchstäblich eine Erweiterung von Java ist. Ich kann Java-Code schreiben, der genau wie Java funktioniert, und die Datei * .groovy umbenennen, und es funktioniert einwandfrei. Laut dem Buch ist das Gegenteil der Fall, wenn ich die erforderlichen Bibliotheken einbeziehe. Bisher scheinen Experimente dies zu bestätigen.

Jim Collings
quelle
Das ist das beste Buch, um Groovy zu lernen.
25.
Es ist wahrscheinlich wichtig zu beachten, dass sich nicht jeder Code genau gleich verhält. Einige dieser Unterschiede betreffen die Art und Weise, wie Groovy einfache und doppelte Anführungszeichen versteht, und die Präferenz für das Boxen gegenüber der Erweiterung. Der meiste Code funktioniert jedoch genauso.
Ontonator
4

Natürlich ist die Syntax völlig anders (Groovy ist Java am nächsten), aber ich nehme an, das ist nicht das, wonach Sie fragen.

Wenn Sie daran interessiert sind, eine Java-Anwendung mit Skripten zu versehen, ist Scala wahrscheinlich keine gute Wahl, da es keine einfache Möglichkeit gibt, sie von Java aus zu bewerten , während Groovy für diesen Zweck besonders geeignet ist.

Thilo
quelle
Ich verstehe Ihren Standpunkt zur Verwendung von Scala zum Schreiben von Java nicht. Sie können sicherlich ein Scala-Skript schreiben, das Java-Code steuert. nicht evalerforderlich.
Daniel Yankowsky
2
@ Daniel, bitte lesen Sie die Frage zur Verwendung von Scala für Skripte, die ich verlinkt habe. Die dort akzeptierte Antwort lautet, dass das Fehlen einer "eval" -Funktion und der Unterstützung von javax.scripting es schwieriger macht, Scala zum Skripten einer Java-Anwendung zu verwenden, als dies beispielsweise bei Groovy der Fall ist.
Thilo