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