Scala vs. Groovy vs. Clojure

Jam*_*ett 676 groovy scala language-comparisons clojure

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

Dan*_*ral 873

Groovy是一种动态类型语言,其语法非常接近Java,并且有许多语法改进,允许更轻的代码和更少的样板.它可以通过解释器运行并进行编译,这使得快速原型设计,脚本和学习动态语言非常有用,而无需学习新语法(假设您了解Java).从Groovy 2.0开始,它对静态编译也有越来越多的支持.Groovy支持闭包,并且支持以某种功能性编程的编程,尽管它仍然远离传统的函数式编程定义.

Clojure是Lisp的一种方言,具有一些软件事务内存等高级功能.如果您喜欢Lisp并希望在JVM下使用类似的东西,那么Clojure就适合您.它可能是在JVM上运行的功能强大的语言,当然也是最着名的语言.此外,它比其他Lisp方言更强调不变性,这使得它更接近功能语言爱好者的心脏.

斯卡拉是一个完全面向对象的语言,比Java更何况,用最先进的一个类型系统对非研究语言的版本,当然在JVM上最先进的类型系统.它还结合了功能语言的许多概念和功能,而不会影响面向对象,但它在功能语言特性上的妥协使后者的一些爱好者失去了兴趣.

Groovy在Grails中具有良好的接受度和流行的Web框架.它还支持Gradle构建系统,该系统正在成为Maven的流行替代品.我个人认为这是一种实用性有限的语言,特别是当Jython和JRuby开始在JVM-land上进行攻击时,与其他语言相比.

Clojure,甚至折扣了一些非常有趣的功能,只是在JVM上成为一个Lisp方言,具有很大的吸引力.这可能会限制它的受欢迎程度,但我希望它能在很长一段时间内拥有忠诚的社区.

Scala可以直接与Java竞争,并在几乎所有方面为其付出代价.当然,它目前无法在人气中竞争,缺乏强大的企业支持可能会阻碍其在企业环境中的接受度.从语言的演变来看,它也是一种比Java更具动态性的语言.从语言的角度来看,这是一件好事.从计划在其中编写数千行代码的用户的角度来看,并非如此.

作为最后的披露,我对Scala非常熟悉,并且只熟悉其他两个.


Kev*_*ght 219

斯卡拉

Scala是一种名为Funnel的纯函数式语言,它代表了几乎所有Java语法的洁净室实现,只有在可以进行明显改进或者会损害语言功能性的地方才有所不同.这些差异包括单例对象而不是静态方法,以及类型推断.

其中大部分是基于Martin Odersky之前使用Pizza语言的工作.OO/FP集成远远超出了仅仅关闭,并导致语言被描述为后功能.

尽管如此,它在很多方面都与Java最为接近.主要是由于OO支持和静态类型的结合,而且由于语言设计中的明确目标,它应该与Java紧密集成.

Groovy的

Groovy明确地解决了Java中最受批评的两个问题

  • 动态类型化,删除了很多样板和
  • 为语言添加闭包.

It's perhaps syntactically closest to Java, not offering some of the richer functional constructs that Clojure and Scala provide, but still offering a definite evolutionary improvement - especially for writing script-syle programs.

Groovy has the strongest commercial backing of the three languages, mostly via springsource.

Clojure

Clojure is a functional language in the LISP family, it's also dynamically typed.

Features such as STM support give it some of the best out-of-the-box concurrency support, whereas Scala requires a 3rd-party library such as Akka to duplicate this.

Syntactically, it's also the furthest of the three languages from typical Java code.

I also have to disclose that I'm most acquainted with Scala :)

  • 我之前从未听说过这种漏斗语言.感谢您填补历史记录中的一点空白. (11认同)
  • 你不能真正称Clojure为*纯*函数式语言.它当然可以编写命令式代码. (8认同)
  • 总结该文档:"Java中不存在的Scala功能不能直接在Java中使用".但是......抽象类型成员和更高级别的类型是相当高级的功能,你当然不会被迫使用!Java也不能使用没有Groovy的参数,构建器或扩展模块的方法,因此也会使Groovy"没有紧密集成"你自己的定义. (3认同)
  • Scala已经在Akka库中构建了基于actor的并发性.它不再是第三方依赖. (2认同)
  • @Orubel在字节码中,scala类与等效的Java类*完全相同* - 类型和全部.作为一个例子,整个Akka Java API是用Scala编写的.所以请在这里解释一下"无法集成"的含义 - 因为它对我来说就像FUD一样. (2认同)

Tha*_*ran 68

我没有时间玩clojure.但对于scala vs groovy来说,这是来自James Strachan - Groovy创作者的话

"虽然我对scav的长期更换提示是scala.我对它印象非常深刻!我可以诚实地说,如果有人在2003年向我展示了Martin Odersky,Lex Spoon和Bill Venners的Scala编程书籍我可能从未创建过Groovy."

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

  • 应该提到的是,这句话并不是说Scala比Groovy更好.詹姆斯也因为如果他知道创造一种他从未创造过的语言有多么麻烦而闻名.从这个角度来看,很清楚为什么他当然不会开发Groovy.而且我敢说他提出了许多好主意,但他并不是当前Groovy的创造者.他在2007年的1.0之前很久就离开了这个项目,从那时起就没有参加.项目中没有他和他一样多. (72认同)
  • 鉴于James Strachan正在积极研究Kotlin语言,Scala显然对他来说不够令人印象深刻. (31认同)
  • @bdkosher他正在研究它,因为Scala对大多数程序员来说都是令人印象深刻的......而且[更重要的是,]在某些地方太复杂了 (6认同)

Meh*_*ran 30

它们可以与它们来自何处或主要针对哪些开发人员区分开来.

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

Scala是面向对象和函数式编程语言,Ruby或Python程序员可能会感觉更接近这一点.它采用了很多这些编程语言中常见的好主意.

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

  • Scala实际上不是一种函数式编程语言.它首先是面向对象的编程语言,具有功能特性. (24认同)
  • Scala是一种具有一些功能特性的命令式语言.如果人们在采用功能世界的习语后继续将语言称为功能,则该术语将成为另一个营销术语.不妨开始调用C++函数和Haskell命令式. (21认同)
  • 我不得不说,这个答案感觉很像在黑暗中拍摄.我认为可以说Python更接近Groovy而不是Scala,并且Ruby(在我看来)与上述任何一个都不太接近,也许最接近Groovy.Haskell不太像(Common)Lisp或Scheme(因此不像Clojure).对我来说,这个答案感觉(充其量!)就像"我也不知道,让我为你维基百科". (16认同)
  • @alanlcode Odersky可能会说出他想要的东西.Scala没有任何系统来隔离副作用,默认情况下它并不是懒惰的,并且不会将代码视为数据 - 它将_function calls_视为数据,这是不同的.如果你想要完全正常运行,这些都是很大的问题.另一方面,Scala一直在努力确保其对象模型没有缺陷.我喜欢Scala,但它显然是功能第二. (9认同)
  • 另一方面,ML系列语言被认为是功能性的,但是是严格的并且允许副作用/命令性代码. (7认同)
  • @Daniel我认为Scala*是大多数定义的函数式语言.实际上,我在过去(不止一次)认为Scala不是*功能,但我已经修改了这个观点.虽然Scala中的某些功能习惯用法不像其他语言那样优雅,但事实仍然是不纯函数语言(函数值,不变性,currying)的所有核心特征都是存在的并且是惯用的.这对我说Scala功能*和*面向对象. (2认同)
  • @ DanielC.Sobral我同意你所说的一些内容,尽管 - 假设你将Haskell算作一种函数式语言--Haskell也不会将代码视为数据.在我非常有限的大脑中,我会说这更像是一个Lisp特征而不是任何东西.Haskell更将数据视为代码. (2认同)
  • @SeanGeoffreyPietz是的,这是不正确的,这正是我的观点. (2认同)
  • 使用这三种语言后我的个人意见是Groovy存在问题.首先,我不喜欢动态打字.但是在Groovy工作之后,我真的不喜欢动态OO语言.OO编程中的一个重要事项是创建新类型.编译器可以很好地防止我将错误的类型传递给方法调用.它还确保方法调用具有一些关于它期望作为参数的文档以及该方法返回的内容.我们的代码库是完整的调用,如`def runActivityReport(in,out)``in`和`out`是没有人知道的. (2认同)

小智 8

我正在阅读实用程序员的书"Groovy Recipes:Greasing the Java of Java",Scott Davis,版权所有2008,并于同年4月出版.

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