Answers:
它们都是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。
谁会赢?我的水晶球像其他人一样破裂。
Scala具有Actor,这使得并发更容易实现。具有真正的,类型安全的多重继承的特性。
您已经通过静态和动态输入打在了头上。两者都是带有闭包,lambda表达式等的新一代动态语言的一部分。两者之间在语法上也有一些区别,但是从功能上来说,我没有看到Groovy和Scala之间有很大的区别。
Scala实现List的方式有所不同;在Groovy中,几乎所有东西都是java.util.List的实例,而Scala同时使用List和原始数组。Groovy(我认为)具有更好的字符串插值。
看起来Scala更快,但是Groovy的人们确实在推动2.0版本的性能。1.6比1.5系列有了巨大的飞跃。
我认为这两种语言都不会真正“胜出”,因为它们针对两种不同类型的问题。Scala是一种非常类似于Java的高性能语言,却没有与Java完全相同的样板。Groovy用于快速原型开发和开发,其中速度与程序员实现代码所花费的时间相比并不重要。
Scala也有dynamica编译,我已经使用twitter eval lib(https://github.com/twitter/util)完成了。我将scala代码保存在一个平面文件中(没有任何扩展名),并在运行时使用eval创建的scala类。我会说scala是元编程,并具有动态复杂功能