Was sind die Hauptunterschiede zwischen Scala und Groovy? [geschlossen]


128

Auf der Oberfläche sehen Groovy und Scala ziemlich ähnlich aus, abgesehen davon, dass Scala statisch typisiert ist und Groovy dynamisch ist.

  • Was sind die anderen Hauptunterschiede und Vorteile, die jeder gegenüber dem anderen hat?
  • Wie ähnlich sind sie sich wirklich?
  • Gibt es einen Wettbewerb zwischen den beiden?
    • Wenn ja, wer wird Ihrer Meinung nach langfristig gewinnen?

Groovy 2.0 beinhaltet auch statische Typisierung: infoq.com/articles/new-groovy-20
HDave

Antworten:


230

Sie sind beide objektorientierte Sprachen für die JVM, die Lambdas und Closures haben und mit Java zusammenarbeiten. Davon abgesehen sind sie extrem unterschiedlich.

Groovy ist eine "dynamische" Sprache, nicht nur in dem Sinne, dass sie dynamisch typisiert ist, sondern auch dynamische Metaprogrammierung unterstützt.

Scala ist eine "statische" Sprache, da sie statisch typisiert ist und praktisch keine dynamische Metaprogrammierung hat, außer den umständlichen Aufgaben, die Sie in Java ausführen können. Beachten Sie, dass das statische Scala-System von Scala wesentlich einheitlicher und ausgefeilter ist als das von Java.

Groovy wird syntaktisch von Java beeinflusst, semantisch jedoch mehr von Sprachen wie Ruby.

Scala wird syntaktisch sowohl von Ruby als auch von Java beeinflusst. Es wird semantisch mehr von Java, SML, Haskell und einer sehr obskuren OO-Sprache namens gBeta beeinflusst.

Groovy hat aufgrund der Art und Weise, wie es mit Java-Überladung umgeht, einen "versehentlichen" Mehrfachversand.

Scala ist nur ein Einzelversand, verfügt jedoch über einen von SML inspirierten Mustervergleich, um einige der gleichen Probleme zu lösen, die bei Mehrfachversand auftreten sollen. Wenn jedoch mehrere Versendungen nur nach Laufzeittyp versendet werden können, kann Scalas Mustervergleich nach Laufzeitarten, Werten oder beidem versendet werden. Der Mustervergleich umfasst auch eine syntaktisch angenehme Variablenbindung. Es ist schwer zu betonen, wie angenehm diese einzelne Funktion allein das Programmieren in Scala macht.

Sowohl Scala als auch Groovy unterstützen eine Form der Mehrfachvererbung mit Mixins (obwohl Scala sie Merkmale nennt).

Scala unterstützt sowohl die Anwendung von Teilfunktionen als auch das Currying auf Sprachebene. Groovy verfügt über eine umständliche "Curry" -Methode für die Anwendung von Teilfunktionen.

Scala optimiert die Schwanzrekursion direkt. Ich glaube nicht, dass Groovy es tut. Das ist wichtig für die funktionale Programmierung, aber weniger wichtig für die imperative Programmierung.

Sowohl Scala als auch Groovy werden standardmäßig eifrig bewertet. Scala unterstützt jedoch Call-by-Name-Parameter. Groovy nicht - Call-by-Name muss mit Closures emuliert werden.

Scala hat "zum Verständnis", eine Verallgemeinerung des Listenverständnisses in anderen Sprachen (technisch gesehen sind es Monadenverständnisse plus ein bisschen - irgendwo zwischen Haskells do und C # 's LINQ).

Scala hat kein Konzept für "statische" Felder, innere Klassen, Methoden usw. - es werden stattdessen Singleton-Objekte verwendet. Groovy verwendet das statische Konzept.

Scala hat die Auswahl der arithmetischen Operatoren nicht so eingebaut wie Groovy. In Scala können Sie Methoden sehr flexibel benennen.

Groovy hat den elvis-Operator für den Umgang mit null. Scala-Programmierer bevorzugen die Verwendung von Optionstypen gegenüber der Verwendung von null, aber es ist einfach, einen elvis-Operator in Scala zu schreiben, wenn Sie möchten.

Schließlich gibt es Lügen, es gibt verdammte Lügen und dann gibt es Benchmarks. Das Benchmark-Spiel für Computersprachen bewertet Scala als wesentlich schneller als Groovy (doppelt bis 93-mal so schnell), wobei ungefähr die gleiche Quellgröße beibehalten wird. Benchmarks .

Ich bin sicher, dass es viele, viele Unterschiede gibt, die ich nicht behandelt habe. Aber hoffentlich gibt Ihnen dies einen Kern.

Gibt es einen Wettbewerb zwischen ihnen? Ja, natürlich, aber nicht so viel, wie Sie vielleicht denken. Groovys echte Konkurrenz sind JRuby und Jython.

Wer wird gewinnen? Meine Kristallkugel ist so rissig wie die anderer.


21
Es wäre ein Gewinn für beide, wenn man die Universitäten dazu bringen könnte, diese Sprachen zu unterrichten, anstatt nur Java =)
Chii

13
Ist Unveränderlichkeit nicht ein Schlüsselmerkmal von Scala? Was ist mit Parallelität und Akteuren? Erzählen Sie uns noch etwas ...
Leonel

4
Wenn es einen Wettbewerb gibt, wäre es mit Clojure, aber Clojure ist nicht an Wettbewerb interessiert.
Rayne

2
Angesichts der Tatsache, dass Scala denselben statisch typisierten Methodenversand verwendet wie Java (der Hotspot kann leicht inline sein) und groovy dynamische Methodenversendungen verwendet, wird es für Groovy sehr schwierig sein, jemals an Scalas Leistung heranzukommen. Insbesondere mit @specialised zur Optimierung des Autoboxing von Java kann Scala manchmal schneller als Java sein. Der Anwendungsfall für Groovy ähnelt jedoch der Verwendung von Ruby / Python - für eine einfach zu verwendende dynamisch typisierte Skriptsprache, bei der die Leistung normalerweise kein so großes Problem darstellt. zB viele Groovy Frameworks enthalten eine Menge Java-Code für die Leistung (wie Grails)
James Strachan

4
Da diese Antwort so viele Stimmen hat, möchte ich einen Teil korrigieren. Es ist richtig, dass vererbungsbasierte Multimethoden in Groovy als Unfall begannen, aber auf einer Groovy Developers Conference, an der James teilnahm, und das war lange vor Groovy 1.0, haben wir beschlossen, das beizubehalten. Es wäre nicht schwierig gewesen, dies zu ändern. Um das zu ergänzen, was James schrieb ... hat invokedynamic die Barriere, von der er spricht,
beseitigt

12

scala soll eine oo / funktionale hybride Sprache sein und ist sehr gut geplant und gestaltet. groovy ist eher eine Reihe von Verbesserungen, die viele Leute gerne in Java verwenden würden. Ich habe mir beide genauer angesehen, damit ich es sehen kann :)

Keiner von ihnen ist besser oder schlechter als der andere. groovy ist sehr gut in der Meta-Programmierung, scala ist sehr gut in allem, was keine Meta-Programmierung benötigt, also ... benutze ich eher beides.



7

Sie haben mit der statischen und dynamischen Eingabe den Nagel auf den Kopf getroffen. Beide sind Teil der neuen Generation dynamischer Sprachen mit Abschlüssen, Lambda-Ausdrücken usw. Es gibt auch eine Handvoll syntaktischer Unterschiede zwischen den beiden, aber funktionell sehe ich keinen großen Unterschied zwischen Groovy und Scala.

Scala implementiert Listen etwas anders. In Groovy ist so ziemlich alles eine Instanz von java.util.List, während Scala sowohl Listen als auch primitive Arrays verwendet. Groovy hat (glaube ich) eine bessere String-Interpolation.

Scala ist anscheinend schneller, aber die Groovy-Leute treiben die Leistung für die Version 2.0 wirklich voran. 1.6 gab einen großen Geschwindigkeitssprung gegenüber der 1.5-Serie.

Ich denke nicht, dass eine der beiden Sprachen wirklich "gewinnen" wird, da sie auf zwei verschiedene Problemklassen abzielen. Scala ist eine Hochleistungssprache, die sehr Java-ähnlich ist, ohne das gleiche Niveau wie Java zu haben. Groovy ist für Rapid Prototyping und Entwicklung gedacht, bei denen die Geschwindigkeit weniger wichtig ist als die Zeit, die Programmierer für die Implementierung des Codes benötigen.


3
"Groovy ist für Rapid Prototyping und Entwicklung gedacht" - dies deutet darauf hin, dass Groovy nicht für Produktionszwecke geeignet ist, mit denen ich nicht einverstanden bin. Es gibt zum Beispiel eine ganze Reihe von Grails-Standorten in der Produktion
Dónal

10
Scala ist keine dynamische Sprache.
John Oxley

2
"Groovy hat (glaube ich) eine bessere String-Interpolation." - Mit Scala-2.10.0 ist dies nicht mehr wahr (Scala hat eine coole String-Interpolation).
VasiliNovikov

5

Scala hat eine viel steilere Lernkurve als Groovy. Scala bietet viel mehr Unterstützung für die funktionale Programmierung mit Pattern Matching und Tail-basierter Rekursion, was mehr Tools für reines FP bedeutet.


0

Scala hat auch Dynamica Compilation und ich habe es mit Twitter Eval Lib ( https://github.com/twitter/util ) gemacht. Ich habe den Scala-Code in einer flachen Datei (ohne Erweiterung) gespeichert und zur Laufzeit die von eval erstellte Scala-Klasse verwendet. Ich würde sagen, Scala ist Metaprogrammierung und weist eine dynamische Komplikation auf

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.