Scala和Groovy之间的主要区别是什么?[关闭]


128

从表面上看,Groovy和Scala看起来非常相似,除了静态类型的Scala和动态的Groovy。

  • 其他主要区别是什么,彼此之间的优势是什么?
  • 他们到底有多相似?
  • 两者之间有竞争吗?
    • 如果是这样,从长远来看,您认为谁会赢?

Groovy的2.0还包括静态类型:infoq.com/articles/new-groovy-20
HDave

Answers:


230

它们都是JVM的面向对象语言,具有lambda和闭包并且可以与Java互操作。除此之外,它们有很大的不同。

Groovy是一种“动态”语言,不仅是动态键入的,而且还支持动态元编程。

Scala是一种“静态”语言,因为它是静态类型的,实际上除了动态Java编程之外,没有动态元编程,您可以在Java中完成这些笨拙的工作。注意,Scala的静态类型系统比Java的更加统一和完善。

Groovy在语法上受Java影响,但在语义上受Ruby之类的语言影响更大。

Scala在语法上受Ruby和Java的影响。它在语义上受Java,SML,Haskell和一种非常晦涩的OO语言gBeta的影响。

由于Groovy处理Java重载的方式,它具有“意外”的多个调度。

Scala仅是单调度,但是具有SML启发式的模式匹配功能,可以解决多调度本应处理的某些相同类型的问题。但是,在多个分派只能按运行时类型进行分派的情况下,Scala的模式匹配可以按运行时类型和/或值进行分派。模式匹配还包括语法上令人愉悦的变量绑定。很难强调仅此一项功能就可以使Scala编程变得多么令人愉悦。

Scala和Groovy都支持使用mixins的多种继承形式(尽管Scala称它们为特征)。

Scala在语言级别上支持部分功能应用程序和currying,Groovy具有执行部分功能应用程序的笨拙的“ curry”方法。

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。

谁会赢?我的水晶球像其他人一样破裂。


21
如果可以让大学开始教授这些语言而不仅仅是java =,这对双方都是一个胜利
Chii

13
不变性不是Scala的关键特征吗?并发和参与者呢?告诉我们更多...
Leonel

4
如果有任何竞争,Clojure都会参加,但是Clojure对竞争不感兴趣。
Rayne,2009年

2
鉴于Scala使用与Java相同的静态类型方法分派(热点可以轻松地内联),并且groovy进行了动态方法分派,这对于Groovy很难接近Scala的性能是非常困难的。尤其是使用@specialized优化Java的自动装箱时,Scala有时会比Java快。但是,Groovy的用例与使用Ruby / Python相似-它是一种易于使用的动态类型的脚本语言,在这种情况下,性能通常不是什么大问题。例如,许多Groovy框架包含大量Java代码以提高性能(例如Grails)
James Strachan 2010年

4
由于这个答案有很多票,所以我想更正一部分。没错,Groovy中基于继承的多重方法是偶然出现的,但是在包括James在内的Groovy开发人员会议上,那是很久以前的Groovy 1.0,我们决定保留这种方法。改变这一点并不困难。还要补充詹姆斯的
著作

12

阶意味着是一个面向对象的/功能性混合语言,并且非常良好的规划和设计。groovy更像是许多人希望在Java中使用的一组增强功能。我仔细看了一下,所以我可以告诉:)

他们两个都不比另一个好或坏。groovy非常擅长元编程,scala非常擅长于不需要元编程的一切,所以...我倾向于同时使用两者。



7

您已经通过静态和动态输入打在了头上。两者都是带有闭包,lambda表达式等的新一代动态语言的一部分。两者之间在语法上也有一些区别,但是从功能上来说,我没有看到Groovy和Scala之间有很大的区别。

Scala实现List的方式有所不同;在Groovy中,几乎所有东西都是java.util.List的实例,而Scala同时使用List和原始数组。Groovy(我认为)具有更好的字符串插值。

看起来Scala更快,但是Groovy的人们确实在推动2.0版本的性能。1.6比1.5系列有了巨大的飞跃。

我认为这两种语言都不会真正“胜出”,因为它们针对两种不同类型的问题。Scala是一种非常类似于Java的高性能语言,却没有与Java完全相同的样板。Groovy用于快速原型开发和开发,其中速度与程序员实现代码所花费的时间相比并不重要。


3
“ Groovy用于快速原型开发” –这表明Groovy不适合我不同意的生产用途。有相当多的在生产中使用Grails的网站,例如
多纳尔

10
Scala不是动态语言。
约翰·奥克斯利

2
“ Groovy(我认为)具有更好的字符串插值。” -对于Scala-2.10.0,这不再是正确的(Scala获得了很酷的字符串插值)。
VasiliNovikov

5

Scala的学习曲线比Groovy陡得多。Scala的模式匹配和基于尾的递归为函数式编程提供了更多支持,这意味着有更多用于纯FP的工具。


0

Scala也有dynamica编译,我已经使用twitter eval lib(https://github.com/twitter/util)完成了。我将scala代码保存在一个平面文件中(没有任何扩展名),并在运行时使用eval创建的scala类。我会说scala是元编程,并具有动态复杂功能

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.