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?
Antworten:
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.
quelle
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.
quelle
Scala verfügt über Actors, die die Implementierung von Parallelität erheblich vereinfachen. Und Eigenschaften, die eine echte, typsichere Mehrfachvererbung ermöglichen.
quelle
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.
quelle
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.
quelle
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
quelle