它们都是面向JVM的面向对象语言,具有lambda和闭包,并与Java互操作。除此之外,它们是非常不同的。
Groovy是一种“动态”语言,不仅因为它是动态类型的,而且还因为它支持动态元编程。
Scala是一种“静态”语言,因为它是静态类型的,除了在Java中可以做的笨拙的事情之外,实际上没有动态元编程。注意,Scala的静态类型系统比Java的更统一、更复杂。
Groovy在语法上受Java的影响,但在语义上受Ruby等语言的影响更大。
Scala在语法上同时受到Ruby和Java的影响。它在语义上更多地受到Java、SML、Haskell和一种非常晦涩的面向对象语言gBeta的影响。
由于Groovy处理Java过载的方式,它具有“意外”的多个分派。
Scala仅支持单分派,但具有受SML启发的模式匹配,可以处理多分派应该处理的一些同类问题。但是,在多个分派只能对运行时类型进行分派情况下,Scala的模式匹配可以对运行时类型和/或值进行分派。模式匹配还包括语法上令人愉快的变量绑定。在Scala中编程时,单凭这一特性是多么令人愉悦,这一点怎么强调都不过分。
Scala和Groovy都支持一种混合形式的多重继承(尽管Scala将其称为特征)。
Scala既支持部分函数应用程序,也支持语言级别的curry,Groovy有一个笨拙的"curry“方法来处理部分函数应用程序。
Scala进行直接的尾递归优化。我不相信Groovy会这么做。这在函数式编程中很重要,但在命令式编程中就不那么重要了。
默认情况下,Scala和Groovy都是迫切需要评估的。但是,Scala支持按名称调用参数。Groovy不这样做--必须用闭包来模拟按名称调用。
Scala有“用于理解”,这是在其他语言中发现的列表理解的泛化(从技术上讲,它们是monad理解加上一点-介于Haskell的do和C#的LINQ之间)。
Scala没有“静态”字段、内部类、方法等概念--它使用单例对象。Groovy使用静态概念。
Scala没有像Groovy那样内置的算术运算符选择。在Scala中,您可以非常灵活地命名方法。
Groovy具有用于处理null的elvis运算符。Scala程序员更喜欢使用选项类型,而不是使用null,但是如果您愿意,可以很容易地在Scala中编写elvis运算符。
最后,有谎言,有该死的谎言,然后是基准。计算机语言基准游戏将Scala评为比Groovy快很多(从两倍到93倍),同时保持大致相同的源代码大小。benchmarks。
我相信有很多很多的不同之处我还没有讲到。但希望这能给你一个要点。
他们之间有竞争吗?是的,当然,但并不像你想的那么多。Groovy真正的竞争对手是JRuby和Jython。
谁会赢?我的水晶球和其他人一样破碎。