Scala 和 Groovy 之间的主要区别是啥? [关闭]
Posted
技术标签:
【中文标题】Scala 和 Groovy 之间的主要区别是啥? [关闭]【英文标题】:What are the key differences between Scala and Groovy? [closed]Scala 和 Groovy 之间的主要区别是什么? [关闭] 【发布时间】:2010-10-17 05:59:24 【问题描述】:从表面上看,Groovy 和 Scala 非常相似,除了 Scala 是静态类型的,而 Groovy 是动态的。
其他主要区别和优势是什么? 它们到底有多相似? 两者之间有竞争吗? 如果是这样,您认为从长远来看谁会赢?【问题讨论】:
Groovy 2.0 还包括静态类型:infoq.com/articles/new-groovy-20 【参考方案1】:Scala 也有动态编译,我使用 twitter eval lib (https://github.com/twitter/util) 完成了它。我将 scala 代码保存在一个平面文件中(没有任何扩展名),并在运行时使用 eval 创建的 scala 类。 我会说 scala 是元编程并且具有动态复杂性的特征
【讨论】:
这个 eval 库仍然是 twitter/util 的一部分吗? twitter/util 中没有类似 util-eval 的目录。【参考方案2】:Scala 的学习曲线比 Groovy 陡峭得多。 Scala 通过其模式匹配和基于尾的递归对函数式编程提供了更多支持,这意味着更多用于纯 FP 的工具。
【讨论】:
【参考方案3】:scala 旨在成为一种面向对象/功能的混合语言,并且非常精心策划和设计。 groovy 更像是许多人喜欢在 java 中使用的一组增强功能。 我仔细看了一下两者,所以我可以告诉:)
它们都不比另一个更好或更差。 groovy 非常擅长元编程,scala 非常擅长所有不需要元编程的东西,所以...我倾向于两者都用。
【讨论】:
【参考方案4】:Scala 有 Actor,这使得并发更容易实现。以及提供真正的、类型安全的多重继承的特征。
【讨论】:
为了将来参考,Groovy 通过 GPars 或 Akka 也是如此。 为了将来参考,Groovy 也是通过 traits 好吧,不再是:docs.scala-lang.org/overviews/core/actors-migration-guide.html【参考方案5】:它们都是 JVM 的面向对象语言,具有 lambda 和闭包并与 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 倍不等),同时保持大致相同的源大小。 benchmarks。
我确信有很多很多我没有涉及的差异。但希望这能给你一个要点。
他们之间有竞争吗?是的,当然,但没有你想象的那么多。 Groovy 的真正竞争对手是 JRuby 和 Jython。
谁会赢?我的水晶球和其他人的水晶球一样破裂。
【讨论】:
如果可以让大学开始教授这些语言而不仅仅是 java =) 不变性不是 Scala 的一个关键特性吗?并发和参与者呢?告诉我们更多... 如果有任何竞争,那就是 Clojure,但 Clojure 对竞争不感兴趣。 鉴于 Scala 使用与 java 相同的静态类型方法分派(热点可以轻松内联),并且 groovy 执行动态方法分派,因此 Groovy 很难接近 Scala 的性能。特别是使用 @specialised 来优化 java 的自动装箱,Scala 有时可以比 java 更快。然而,Groovy 的用例类似于使用 Ruby / Python - 它是一种易于使用的动态类型脚本语言,性能通常不是那么大的问题。例如许多 Groovy 框架包含大量用于性能的 Java 代码(如 Grails) 由于这个答案有这么多票,有一部分我想更正。没错,Groovy 中基于继承的多方法一开始是偶然的,但是在包括 James 在内的 Groovy 开发者大会上,我们决定保留它。改变这一点并不难。还要补充詹姆斯所写的内容...... invokedynamic 消除了他正在谈论的障碍【参考方案6】:您在静态和动态类型方面一针见血。两者都是新一代动态语言的一部分,具有闭包、lambda 表达式等。两者之间也存在一些语法差异,但在功能上,我认为 Groovy 和 Scala 之间并没有太大差异。
Scala 实现列表有点不同;在 Groovy 中,几乎所有东西都是 java.util.List 的实例,而 Scala 使用列表和原始数组。 Groovy 有(我认为)更好的字符串插值。
Scala 似乎更快,但 Groovy 的开发人员确实在推动 2.0 版本的性能。与 1.5 系列相比,1.6 的速度有了巨大的飞跃。
我认为这两种语言都不会真正“获胜”,因为它们针对的是两类不同的问题。 Scala 是一种高性能语言,它非常类似于 Java,但没有与 Java 相同级别的样板文件。 Groovy 用于快速原型设计和开发,其中速度不如程序员实现代码所需的时间重要。
【讨论】:
“Groovy 用于快速原型设计和开发”——这表明 Groovy 不适合我不同意的生产用途。有相当多的 Grails 站点在生产中使用,例如 Scala 不是动态语言。 “Groovy 有(我认为)更好的字符串插值。” -- 在 Scala-2.10.0 中,这不再是真的(Scala 有了很酷的字符串插值)。以上是关于Scala 和 Groovy 之间的主要区别是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Groovy Binary 和 Source 版本之间的区别?