Scala vs. Groovy vs. Clojure [关闭]


676

有人可以解释一下Scala,Groovy和Clojure之间的主要区别。我知道这些编译器都可以在JVM上运行,但是我想对它们进行简单的比较。

Answers:


873

Groovy是一种动态类型化的语言,其语法非常类似于Java,并在语法上进行了许多改进,从而使代码更轻巧,样板更少。它可以运行在解释器中,也可以进行编译,这使其非常适合快速原型设计,脚本和学习动态语言,而无需学习新的语法(假设您知道Java)。从Groovy 2.0开始,它也越来越多地支持静态编译。Groovy支持闭包并以某种功能性样式支持编程,尽管它与功能性编程的传统定义仍然相距甚远。

Clojure是Lisp的方言,具有一些高级功能,例如软件事务存储。如果您喜欢Lisp,并且想在JVM下使用类似的东西,那么Clojure非常适合您。它可能是在JVM上运行的功能强大的语言,当然也是最著名的一种。而且,与其他Lisp方言相比,它更强调不变性,这使其更贴近功能语言爱好者的心。

Scala是一种完全面向对象的语言,比Java更是如此,它具有非研究语言上可用的最先进的类型系统之一,当然也可以是JVM上最先进的类型系统。它也结合了功能语言的许多概念和功能,而不会损害面向对象,但是它在功能语言特性上的妥协却使后者的一些发烧友望而却步。

Groovy在Grails中具有良好的接受度和流行的Web框架。它还为Gradle构建系统提供了动力,该系统正在成为Maven的流行替代方案。我个人认为这是一门实用性有限的语言,尤其是与其他语言相比,Jython和JRuby开始进入JVM领域。

Clojure甚至打折了一些非常有趣的功能,只是成为JVM上的Lisp方言而具有很强的吸引力。当然,它可能会限制其受欢迎程度,但我希望它在很长一段时间内都会有忠诚的社区。

Scala可以直接与Java竞争,并且可以在几乎所有方面为它争取金钱。当然,它目前无法在人气上竞争,而且缺乏强大的公司支持可能会阻碍其在公司环境中的接受。从语言的发展角度来看,它也是一种比Java更动态的语言。从语言的角度来看,这是一件好事。从计划编写数千行代码的用户的角度来看,事实并非如此。

最后,我对Scala非常熟悉,并且只熟悉其他两个。


1
好一个。尽管我不得不说Scala得到了Lightbend公司的支持,并被LinkedIn,Twitter,Spark和许多银行之类的知名人士使用。在我工作的地方,我们有一个包含11百万行Scala的代码库,虽然这不是一个好主意,但它确实可行。
2016年

219

斯卡拉

Scala从称为Funnel的纯函数语言演变而来,代表了几乎所有Java语法的无尘室实现,仅在可以进行明显改进或会损害该语言的功能本质的地方不同。这样的差异包括单例对象而不是静态方法,以及类型推断。

其中大部分是基于Martin Odersky以前使用Pizza语言的工作。OO / FP集成远远超出了单纯的闭包,并且导致该语言被描述为后功能。

尽管如此,它在许多方面还是最接近Java的。主要归因于OO支持和静态类型的结合,还归因于语言设计中的明确目标,即它应与Java紧密集成。

Groovy

Groovy明确解决了Java的两个最大批评,

  • 被动态键入,这消除了很多样板
  • 为语言添加闭包。

它在语法上可能最接近Java,没有提供Clojure和Scala提供的一些更丰富的功能构造,但仍然提供了确定的进化改进-特别是对于编写脚本程序程序。

Groovy在这三种语言中拥有最强大的商业支持,主要是通过springsource获得的。

Clojure

Clojure是LISP家族中的一种功能语言,它也是动态输入的。

诸如STM支持之类的功能为其提供了一些最好的现成并发支持,而Scala需要Akka之类的第三方库来复制它。

从语法上讲,它也是典型Java代码中三种语言中最远的一种。

我还必须透露我最了解Scala :)


11
我以前从未听说过这种漏斗语言。感谢您填补历史记录中的空白。
兰德尔·舒尔茨

8
您真的不能称Clojure为函数式语言。编写命令性代码当然是可能的。
dbyrne 2011年

2
Scala在Akka库中内置了基于角色的并发。它不再是第三方的依赖。
斯科特·加德纳2014年

2
@Orubel在字节码中,scala类等效的Java类相同 -类型和全部。作为一个适当的例子,整个Akka Java API是用Scala编写的。因此,请在此处解释“无法集成”的含义-因为它对我来说就像FUD。
凯文·赖特

3
总结该文档:“ Java中不存在的Scala功能不能直接在Java中使用”。但是...抽象类型成员和种类较多的类型是相当高级的功能,您当然不必强迫使用!Java也不能使用没有Groovy的参数,构建器或扩展模块的方法,因此也使Groovy不能按照自己的定义“紧密集成”。
凯文·赖特

68

我从来没有时间玩Clojure。但是对于scala vs groovy,这是James Strachan的话-Groovy创作者

“尽管我对长期替换javac的提示是Scala。它给我留下了深刻的印象!我可以坦白地说,如果有人在2003年向我展示了Martin Odersky,Lex Spoon和Bill Venners编写的Scala编程书,可能从未创建过Groovy。”

你可以在这里阅读整个故事


72
应该提到的是,这种说法并不是说Scala比Groovy更好。詹姆斯还以说一种语言而闻名,如果他知道创建一种语言有多少麻烦,他将永远不会创造出一种语言。在这样的背景下,很明显他为什么不那么会发展Groovy。我敢说他提出了许多好主意,但他不是当前Groovy的创造者。他在2007年1.0版之前就离开了该项目,此后一直没有参与。在他的项目中,至少和他在一起的情况一样多。
blackdrag

31
考虑到James Strachan正在积极研究Kotlin语言,Scala显然对他还不够深刻。
bdkosher 2013年

6
@bdkosher之所以在研究它,是因为Scala 对于大多数程序员来说太令人印象深刻了……[更重要的是,]在某些地方也太复杂了
显示名称

30

他们可以根据其来自何处或主要针对哪些开发人员来区分。

Groovy有点像Java的脚本版本。长期的Java程序员在构建由大型架构支持的敏捷应用程序时会感到宾至如归。顾名思义,Grails上的Groovy与Rails框架相似。对于那些不想一直困扰Java冗长的人。

Scala是一种面向对象的函数式编程语言,Ruby或Python程序员可能会更接近于此。它采用了在这些编程语言中发现的许多常见的好主意。

Clojure是Lisp编程语言的一种方言,因此Lisp,Scheme或Haskell开发人员在使用该语言进行开发时可能会感到宾至如归。


24
Scala并不是真正的功能编程语言。它首先是一种面向对象的编程语言,具有功能特征。
Daniel C. Sobral

16
我不得不说,这个答案很像是在黑暗中拍摄。我认为可以很好地证明Python更接近Groovy而不是Scala,而Ruby(我认为)与上述任何一个都不是太接近,也许再次接近Groovy。Haskell不太像(通用)Lisp或Scheme(因此也不太像Clojure)。对我来说,这个答案感觉(充其量!)就像“我也不知道,让我为您提供维基百科”。
约翰Y

21
Scala是具有某些功能特性的命令式语言。如果人们在采用功能世界的习语后立即继续称其为功能性语言,那么该术语将成为另一个营销术语。最好也开始调用C ++函数式和Haskell命令。
jon-hanson 09年

9
@alanlcode Odersky可以说他想要什么。Scala没有任何隔离副作用的系统,默认情况下它不是惰性的,也不将代码视为数据-它将函数调用视为数据,这是不同的。如果您想发挥全部功能,这些都是大问题。另一方面,Scala一直努力确保其对象模型没有缺陷。我爱Scala,但显然它是功能第二。
Daniel C. Sobral

7
另一方面,ML系列语言被认为是功能性的,但是很严格,并且允许副作用/命令性代码。
GClaramunt

8

我正在阅读Scott Davis撰写的实用程序员书籍“ Groovy Recipes:润滑Java的轮子”,版权所有2008,并于同年4月出版。

有点过时了,但是书中清楚地表明Groovy实际上是Java的扩展。我可以编写功能与Java完全相同的Java代码,然后将文件* .groovy重命名,并且可以正常工作。根据这本书,如果我包含必需的库,则相反。到目前为止,实验似乎证明了这一点。


那是学习Groovy的最好的书。
TOPR

需要注意的是,并非所有代码的行为都完全相同。这些差异中的一些差异包括Groovy理解单引号和双引号的方式,以及对装箱而不是加宽的偏好。不过,大多数代码都可以使用。
Ontonator

4

显然,语法完全不同(Groovy最接近Java),但是我想这不是您要的。

如果您对使用它们编写Java应用程序脚本感兴趣,那么Scala可能不是一个好选择,因为没有简便的方法可以从Java 对其进行评估,而Groovy特别适合于此目的。


我不理解您关于使用Scala编写Java脚本的观点。您当然可以编写一个驱动Java代码的Scala脚本;没有eval必需的。
Daniel Yankowsky

2
@Daniel,请参阅有关使用Scala进行链接的脚本的问题。公认的答案是,由于缺少“评估”工具和javax.scripting支持,因此使用Scala编写Java应用程序脚本比使用Groovy更加困难。
Thilo
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.