有人能解释一下Scala、Groovy和Clojure之间的主要区别吗?我知道这些编译器都在JVM上运行,但我想在它们之间做一个简单的比较。


当前回答

规模

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:)

其他回答

规模

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:)

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

如果您有兴趣使用它们来编写Java应用程序的脚本,那么Scala可能不是一个好的选择,因为从Java中没有简单的方法来评估它,而Groovy特别适合这个目的。

它们可以根据它们来自哪里或主要针对哪些开发者进行区分。

Groovy有点像Java的脚本版本。长期从事Java编程的程序员在构建由大型体系结构支持的敏捷应用程序时感到很自在。Groovy on Grails,顾名思义,类似于Rails框架。适合那些不想一直为Java的冗长而烦恼的人。

Scala是一种面向对象的函数式编程语言,Ruby或Python程序员可能更倾向于这种语言。它采用了很多在这些编程语言中常见的好思想。

Clojure是Lisp编程语言的一种方言,所以Lisp、Scheme或Haskell开发人员在使用这种语言进行开发时可能会感到很自在。

我从来没有时间玩clojure。但是对于scala和groovy,这是来自groovy创建者James Strachan的话

“尽管我的建议是,从长远来看,javac的替代品是Scala。 我对它印象深刻!老实说,如果有人给我看过的话 Martin Odersky、Lex Spoon和Bill合著的《Scala编程》一书 如果回到2003年,我可能永远也不会创建Groovy。”

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

我正在阅读实用程序员的书“Groovy Recipes: Greasing the wheels of Java”,作者Scott Davis,版权所有,2008年4月出版。

这有点过时了,但这本书清楚地表明,Groovy实际上是Java的扩展。我可以编写功能与Java完全相同的Java代码,并将文件重命名为*。Groovy,它工作得很好。根据这本书,如果我包括必要的图书馆,情况则相反。到目前为止,实验似乎证实了这一点。