它们都是基于JVM的面向对象语言,支持lambda和闭包,并可与Java互操作。除此之外,它们非常不同。
Groovy是一种具有动态元编程能力的“动态”语言,不仅支持动态类型,还支持动态元编程。
Scala是一种“静态”语言,具有静态类型且几乎没有除Java中笨拙用法以外的动态元编程。需要注意的是,Scala的静态类型系统比Java的系统更加统一和复杂。
Groovy在语法上受到Java的影响,而在语义上则更多地受到像Ruby这样的语言的影响。
Scala在语法上受到Ruby和Java的影响。在语义上,Scala更多地受到Java、SML、Haskell以及一个名为gBeta的非常晦涩的面向对象语言的影响。
Groovy由于处理Java重载的方式而意外地实现了多分派。
Scala仅支持单分派,但具有受SML启发的模式匹配来处理多分派所处理的某些问题。然而,多分派只能根据运行时类型进行分派,而Scala的模式匹配可以基于运行时类型、值或两者都进行分派。模式匹配还包括语法上舒适的变量绑定。在Scala编程中,这个单一特性所带来的愉悦难以言表。
Scala和Groovy都支持基于mixin的多重继承(尽管Scala称它们为traits)。
Scala在语言级别上支持局部函数应用和柯里化,而Groovy则有一个笨拙的“curry”方法来实现局部函数应用。
Scala具备直接尾递归优化,我不认为Groovy能做到。这在函数式编程中很重要,但在命令式编程中则不那么重要。
默认情况下,Scala和Groovy都是急切求值的。然而,Scala支持按名称调用参数,而Groovy则不支持,必须使用闭包来模拟。
Scala具有“for comprehensions”,这是在其他语言中找到的列表推导的一种泛化形式(技术上它们是monad comprehensions加上一点点——介于Haskell的do和C#的LINQ之间)。
Scala 没有 "static" 属性、内部类、方法等概念,而是使用单例对象。Groovy 使用 static 概念。
Scala 没有像 Groovy 那样具有内置的算术运算符选择功能。在 Scala 中,您可以非常灵活地命名方法。
Groovy 有 Elvis 运算符来处理 null。Scala 程序员更喜欢使用 Option 类型而不是 null,但如果需要,也很容易在 Scala 中编写 Elvis 运算符。
最后,谎言有谎言,统计数据也有误差。Computer Language Benchmarks Game 将 Scala 排名在 Groovy 之上(速度范围为 Groovy 的两倍到 93 倍之间),同时源代码大小大致相同。benchmarks。
当然,我相信还有许多差异没有涉及到。但希望这能给您一个大致的了解。
它们之间有竞争吗?当然有,但并不像您想象的那么多。Groovy 的真正竞争对手是 JRuby 和 Jython。
谁会赢呢?我的水晶球和其他人一样毛病多多。