从表面上看,Groovy 和 Scala 看起来非常相似,除了 Scala 是静态类型的,而 Groovy 是动态的。
- 其他主要区别和优势是什么?
- 它们到底有多相似?
- 两者之间有竞争吗?
- 如果是这样,从长远来看,你认为谁会赢?
它们都是 JVM 的面向对象语言,具有 lambdas 和闭包并与 Java 互操作。除此之外,它们非常不同。
Groovy 是一种“动态”语言,不仅因为它是动态类型的,而且它支持动态元编程。
Scala 是一种“静态”语言,因为它是静态类型的,除了在 Java 中可以做的笨拙的事情之外,几乎没有动态元编程。注意,Scala 的静态类型系统比 Java 的更加统一和复杂。
Groovy 在语法上受 Java 的影响,但在语义上更多地受 Ruby 等语言的影响。
Scala 在语法上受到 Ruby 和 Java 的影响。它在语义上更多地受到 Java、SML、Haskell 和一种非常晦涩的 OO 语言(称为 gBeta)的影响。
由于处理 Java 重载的方式,Groovy 有“意外的”多重分派。
Scala 只是单一调度,但具有受 SML 启发的模式匹配来处理一些与多调度旨在处理的相同类型的问题。然而,多重分派只能在运行时类型上分派,Scala 的模式匹配可以在运行时类型、值或两者上分派。模式匹配还包括语法上令人愉悦的变量绑定。很难过分强调这个单一特性使 Scala 编程变得多么令人愉快。
Scala 和 Groovy 都支持一种带有 mixin 的多重继承形式(尽管 Scala 称它们为特征)。
Scala 在语言级别支持偏函数应用和柯里化,Groovy 有一个笨拙的“柯里”方法来做偏函数应用。
Scala 直接进行尾递归优化。我不相信 Groovy 会这样做。这在函数式编程中很重要,但在命令式编程中不太重要。
默认情况下,Scala 和 Groovy 都被热切地评估。但是,Scala 支持按名称调用参数。Groovy 没有 - 必须使用闭包来模拟名称调用。
Scala 有“for comprehensions”,它是在其他语言中发现的列表理解的泛化(从技术上讲,它们是 monad 理解加上一点——介于 Haskell 的 do 和 C# 的 LINQ 之间)。
Scala 没有“静态”字段、内部类、方法等的概念——它使用单例对象。Groovy 使用静态概念。
Scala 不像 Groovy 那样内置了算术运算符的选择。在 Scala 中,您可以非常灵活地命名方法。
Groovy 有用于处理 null 的 elvis 运算符。Scala 程序员更喜欢使用 Option 类型而不是使用 null,但是如果您愿意,可以很容易地在 Scala 中编写一个 elvis 运算符。
最后,有谎言,有该死的谎言,然后是基准。计算机语言基准测试游戏将 Scala 评为比 Groovy 快得多(速度从两倍到 93 倍不等),同时保持大致相同的源大小。基准。
我确信有很多很多我没有涵盖的差异。但希望这能给你一个要点。
他们之间有竞争吗?是的,当然,但没有你想象的那么多。Groovy 的真正竞争对手是 JRuby 和 Jython。
谁会赢?我的水晶球和其他人的一样破裂。
scala 旨在成为一种面向对象/功能的混合语言,并且经过精心规划和设计。groovy 更像是许多人喜欢在 java 中使用的一组增强功能。我仔细看看两者,所以我可以告诉:)
他们都不比另一个好或坏。groovy 非常擅长元编程,scala 非常擅长所有不需要元编程的东西,所以......我倾向于两者都用。
Scala 有 Actor,这使得并发更容易实现。以及提供真正的、类型安全的多重继承的特征。
您已经用静态和动态打字一针见血了。两者都是新一代动态语言的一部分,具有闭包、lambda 表达式等。两者之间也有一些语法差异,但在功能上,我认为 Groovy 和 Scala 之间没有太大差异。
Scala 实现列表有点不同;在 Groovy 中,几乎所有东西都是 java.util.List 的实例,而 Scala 使用列表和原始数组。Groovy 有(我认为)更好的字符串插值。
Scala 似乎更快,但 Groovy 的开发人员确实在推动 2.0 版本的性能。1.6 在速度上比 1.5 系列有了巨大的飞跃。
我认为这两种语言都不会真正“获胜”,因为它们针对的是两类不同的问题。Scala 是一种高性能语言,它非常类似于 Java,但没有与 Java 相同级别的样板文件。Groovy 用于快速原型设计和开发,其中速度不如程序员实现代码所需的时间重要。
Scala 的学习曲线比 Groovy 陡峭得多。Scala 通过其模式匹配和基于尾的递归对函数式编程提供了更多支持,这意味着更多的纯 FP 工具。
Scala 也有动态编译,我使用 twitter eval lib ( https://github.com/twitter/util ) 完成了它。我将 scala 代码保存在一个平面文件中(没有任何扩展名),并在运行时使用 eval 创建的 scala 类。我会说 scala 是元编程并且具有动态复杂性的特征