有人能解释一下Scala、Groovy和Clojure之间的主要区别吗?我知道这些编译器都在JVM上运行,但我想在它们之间做一个简单的比较。
它们可以根据它们来自哪里或主要针对哪些开发者进行区分。
Groovy有点像Java的脚本版本。长期从事Java编程的程序员在构建由大型体系结构支持的敏捷应用程序时感到很自在。Groovy on Grails,顾名思义,类似于Rails框架。适合那些不想一直为Java的冗长而烦恼的人。
Scala是一种面向对象的函数式编程语言,Ruby或Python程序员可能更倾向于这种语言。它采用了很多在这些编程语言中常见的好思想。
Clojure是Lisp编程语言的一种方言,所以Lisp、Scheme或Haskell开发人员在使用这种语言进行开发时可能会感到很自在。
显然,语法是完全不同的(Groovy最接近Java),但我认为这不是您想要的。
如果您有兴趣使用它们来编写Java应用程序的脚本,那么Scala可能不是一个好的选择,因为从Java中没有简单的方法来评估它,而Groovy特别适合这个目的。
Groovy is a dynamically typed language, whose syntax is very close to Java, with a number of syntax improvements that allow for lighter code and less boilerplate. It can run through an interpreter as well as being compiled, which makes it good for fast prototyping, scripts, and learning dynamic languages without having to learn a new syntax (assuming you know Java). As of Groovy 2.0, it also has growing support for static compilation. Groovy supports closures and has support for programming in a somewhat functional style, although it's still fairly far from the traditional definition of functional programming.
Clojure是Lisp的一种方言,具有一些高级特性,如软件事务内存。如果你喜欢Lisp,并且想在JVM下使用类似的东西,Clojure就是为你准备的。它可能是JVM上运行的最具函数性的语言,当然也是最有名的一种。此外,它比其他Lisp方言更强调不可变性,这使它更接近函数式语言爱好者的心。
Scala是一种完全面向对象的语言,与Java相比更是如此,它是非研究语言中可用的最先进的类型系统之一,当然也是JVM中最先进的类型系统。它还结合了函数式语言的许多概念和特性,而不损害面向对象,但它在函数式语言特性上的妥协使后者的一些爱好者望而却步。
Groovy在Grails中有很好的接受度和一个流行的web框架。它还支持Gradle构建系统,该系统正在成为Maven的流行替代品。我个人认为,与其他语言相比,它是一种实用性有限的语言,特别是当Jython和JRuby开始进军jvm领域时。
Clojure,即使不考虑一些非常有趣的特性,仅作为JVM上的Lisp方言就具有强大的吸引力。当然,这可能会限制它的受欢迎程度,但我预计它将在很长一段时间内拥有忠实的社区。
Scala可以直接与Java竞争,并且在几乎所有方面都与Java竞争。当然,目前它在受欢迎程度上无法与之竞争,而且缺乏强大的企业支持可能会阻碍它在企业环境中的接受度。就语言的演变而言,它也是一种比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 Recipes: Greasing the wheels of Java”,作者Scott Davis,版权所有,2008年4月出版。
这有点过时了,但这本书清楚地表明,Groovy实际上是Java的扩展。我可以编写功能与Java完全相同的Java代码,并将文件重命名为*。Groovy,它工作得很好。根据这本书,如果我包括必要的图书馆,情况则相反。到目前为止,实验似乎证实了这一点。
我从来没有时间玩clojure。但是对于scala和groovy,这是来自groovy创建者James Strachan的话
“尽管我的建议是,从长远来看,javac的替代品是Scala。 我对它印象深刻!老实说,如果有人给我看过的话 Martin Odersky、Lex Spoon和Bill合著的《Scala编程》一书 如果回到2003年,我可能永远也不会创建Groovy。”
你可以在这里阅读整个故事
推荐文章
- case对象和对象的区别
- Scala中的Case对象与枚举
- 任务不可序列化:java.io.NotSerializableException,当只对类而不是对象调用闭包外部的函数时
- 在Scala中将一个元素附加到列表的末尾
- 在Scala中按名称调用vs按值调用,需要澄清
- 解析命令行参数的最佳方法?
- Android Scala编程
- javascript中是否有空合并(Elvis)操作符或安全导航操作符?
- lazy val做什么?
- Scala:抽象类型vs泛型
- 如何在准引用中使用无形?
- Scala中方法和函数的区别
- Scala中的“提升”是什么?
- Perl、Python、AWK和sed之间有什么区别?
- 什么是Scala上下文和视图边界?