有人能解释一下scala、groovy和clojure之间的主要区别吗?我知道这些编译器中的每一个都可以在JVM上运行,但是我希望对它们进行简单的比较。
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有Lightbend公司的支持,并且被LinkedIn、Twitter、Spark和许多银行等大公司使用。在我工作的地方,我们有一个1100万行的scala代码库,这不是一个好主意,但它是有效的。
斯卡拉
Scala是由一种称为漏斗的纯函数语言演化而来的,它代表了几乎所有Java语法的一个无尘室实现,只是在一个清晰的改进或是它会损害语言的功能性质的地方有所不同。这种差异包括单例对象而不是静态方法,以及类型推断。
其中很大一部分是基于马丁·奥德斯基之前对披萨语言的研究。OO/FP集成远远超出了闭包的范围,并导致将该语言描述为后功能语言。
尽管如此,它在很多方面与Java最接近。主要是由于OO支持和静态类型的结合,而且由于语言设计中的明确目标,它应该与Java非常紧密地集成。
格罗维
Groovy明确地处理了两个Java最大的批评
- 动态类型化,这会删除大量样板文件和
- 向语言添加闭包。
它可能在语法上与Java最接近,不提供Culjule和Scala提供的一些更丰富的功能结构,但仍然提供了明确的进化改进——尤其是编写脚本Syle程序。
groovy拥有三种语言中最强大的商业支持,主要是通过SpringSource。
克洛杰尔
Clojure是Lisp家族中的一种功能语言,它也是动态类型的。
STM支持等特性为它提供了一些最好的开箱即用的并发支持,而scala需要第三方库(如akka)来复制它。
从语法上讲,它也是典型Java代码中三种语言中最远的。
我还得透露我最熟悉斯卡拉:)
- 我以前从未听说过这种漏斗语言。感谢你填补了历史记录中的一点空白。
- 你不能称Clojure为纯功能语言。当然可以编写命令式代码。
- scala现在拥有大多数(如果不是所有)内置集合的并发版本。您不必编写并发代码,只需使用并发集合,以及voila,并发。
- scala在akka库中构建了基于actor的并发性。它不再是第三方依赖项。
- Scala不能像Groovy那样紧密地与Java紧密结合,因为您不能将Scala类集成到Java中,但可以集成Groovy类。还可以用Groovy编写Java内联。
- 在字节码中的Orubel,Scala类与等价的Java类类型和所有相同。作为一个例子,整个Akka Java API是在Scala中编写的。所以请在这里解释一下你所说的"不能整合"是什么意思——因为我觉得它读起来像fud。
- 福德?我在看你自己的文件。(scala-lang.org/old/faq/4)。这不是福德…groovy没有这些问题。只是它不能很好地集成。
- 总结该文档:"Java中不存在的Scala特性不能直接在Java中使用"。然而。。。抽象类型成员和更高类型是相当高级的特性,您肯定不会被迫使用!Java也不能使用没有Groovy的参数、生成器或扩展模块的方法,因此也使得Groovy由您自己的定义"不紧密集成"。
- 有趣的是,Java中的类是Groovy中的一个类,只需更改扩展名即可。你不能用scala来做这个。scala在字节码级别是兼容的…groovy在类、对象和原语级别上是兼容的,这使得它更加兼容。
- @orubel类对象和原语都是字节代码级别的构造。支持这些作为一流的公民是完全兼容字节码的意思。Java可以使用Scala类,尽管它们是原生的(反之亦然),包括泛型。
- 这些转换为字节码。在Java/Grases中,它们的支持不同于斯卡拉,并且转换不同,因此静态编译时基准的差异。否则你会得到完全相同的基准!
- @Orubel请举出不同基准的例子。
- 没有完全的并排比较,但有"Scala与Java"和"Groovy vs Java"的比较。当使用不同的模式时,它们很容易被分解成显示相对速度的模式。请参阅本文中的示例:linkedin.com/pulse/…
- "你的文章有一个orubel商店没有办法mentions轶事和比较基准的知识翻译字节码是一类。它通常包含了很多小的和彻底的misunderstandings falsehoods unintentional)。这么多这样你不得不等了一位for a as a comment全响应,这里真的不这样做正义。
- Hello我的先生。你显然没有看够硬。
- 回答:"orubel - LinkedIn.com /脉冲/据凯文莱特网络错误
- i dont湖什么的。有没有什么重要的东西吗?
- "orubel有什么有什么,如果你希望看到(然后它,请评论),随时有负担在这讨论我的Word是一个祝福,全。
- NO…我真的没有什么朋友。什么是您的内容被删除通过LinkedIn
- 我有你的祝福,有最高的排名在谷歌为Scala和Groovy的太?是你太谷歌走了?如果这样,谢谢:)
- 是的,你有我的祝福,有较高的排名在9月accumulated使用的文章,题为那精确的短语,我获得的比在2天在没有任何推广,其内容是在收到的最新评论7小时后宣布,它被删除。
- 哇。你有一些奇异的想象。我安静的一号……但你永远在我的心的一号,凯文。:)
我从来没有时间和Clojure玩过。但对于scala和groovy来说,这是james strachan的话-groovy的创造者
"Though my tip though for the long term replacement of javac is Scala.
I'm very impressed with it! I can honestly say if someone had shown me
the Programming in Scala book by Martin Odersky, Lex Spoon & Bill
Venners back in 2003 I'd probably have never created Groovy."
你可以在这里读整个故事
- 应该提到的声明说,这是不是一个比Groovy,Scala。这是一个称为詹姆斯说如果他知道多少麻烦,它会创建一个你从来没有语言创建的。在这上下文,它是清澈的湖泊为什么他不会有那么发达的Groovy的大学课程。我敢说他给了很多好的想法,但他是一个创造者的公司目前的常规。嘿左长1.0项目在2007年和自那时以来没有高等。至少有一个项目不多,他有一个他。
- 这是James Strachan和给定的工作积极kotlin Scala语言的令人印象深刻的是,他没有足够的。
- bdkosher @我的工作,因为这是非常令人印象深刻的是Scala程序员最重要的……[更多]在某些地方,太复杂,太
它们可以区别于它们来自何处,或者主要针对哪些开发人员。
Groovy有点像Java的脚本版本。长期以来,Java程序员在构建由大型架构支持的敏捷应用程序时会感到宾至如归。顾名思义,Grails上的groovy类似于Rails框架。对于那些不想一直困扰Java的人来说。
scala是一种面向对象的函数式编程语言,Ruby或Python程序员可能会觉得更接近这一语言。它使用了在这些编程语言中发现的许多常见的好主意。
Clojure是Lisp编程语言的一种方言,因此Lisp、Scheme或Haskell开发人员在使用该语言进行开发时可能会感到宾至如归。
- scala不是真正的函数式编程语言。它首先是一种面向对象的编程语言,具有功能特性。
- 我不得不说,这个答案很像是在黑暗中摸索。我认为有一个很好的例子,那就是python比scala更接近groovy,而ruby(在我看来)与上面的任何一个都不太接近,可能又与groovy最接近。Haskell不太像(普通的)Lisp或Scheme(因此也不太像Clojure)。对我来说,这个答案(充其量是!)比如"我也不知道,让我为你维基百科"。
- @丹尼尔我认为scala是一种功能性语言。事实上,我在过去(不止一次)曾论证过scala不起作用,但后来我修改了这个观点。尽管某些功能性习语在scala中不如其他语言优雅,但事实仍然是,不纯功能性语言(功能值、不变性、当前性)的所有核心特征都存在且惯用。我认为scala是功能性和面向对象的。
- scala是一种具有一些功能特性的命令式语言。如果一种语言一旦采用了来自功能世界的习语,人们就继续称它为功能性语言,那么这个术语将成为另一个营销术语。还不如开始调用C++函数和Haskell势在必行。
- 我把这篇文章作为一个社区维基打开,因为当你比较两种语言时,通常没有一个单一的答案。我和他们三个都玩过,但从来没有真正深入过。我一般说的是语法和习语。
- 与大多数比较一样,真相是灰色的阴影。如果我们要相信创造者马丁·奥德斯基,斯卡拉的设计是面向对象和功能性的,两个范例都是一流的公民。请看他对《计算机世界》的采访,以获得他的确切答案:computer world.com.au/article/315254/…
- @奥德斯基可以说他想要什么。scala没有任何系统来隔离副作用,默认情况下它并不懒惰,也不将代码视为数据——它将函数调用视为数据,这是不同的。如果你想完全发挥作用,这些都是大问题。另一方面,scala竭尽全力确保其对象模型不存在缺陷。我喜欢斯卡拉,但它显然是第二功能。
- 另一方面,ML语言系列被认为是功能性的,但是它是严格的,允许副作用/命令式代码。
- @我同意你所说的一些话,尽管假设你把haskell看作一种功能语言,haskell也不把代码当作数据。在我非常有限的大脑里,我会说这更像是一种口齿不清的特征。Haskell More将数据视为代码。
- @乔恩·汉森怎么可能称哈斯克尔为命令式语言?Scala甚至C++支持许多函数编程构造。Haskell的哪些特性是必要的?调用scala函数可能有点松散地使用这个术语,但是调用haskell命令显然是不正确的。
- @是的,这是不正确的,这正是我的观点。
- @乔恩·汉森,你的观点不正确,这是我的观点。你在做一个错误的等价物。
- @JonHanson scala混合了功能性和面向对象/命令式范例,Haskell与命令式语言没有相似之处。因此,调用scala函数和调用haskell命令完全不同。
- 在使用了这三种语言之后,我个人的观点是,groovy是有问题的。首先,我不喜欢动态输入。但是在使用groovy之后,我真的不喜欢动态OO语言。OO编程中的一件大事就是创建新的类型。编译器在防止我将错误的类型传递给方法调用方面做得很好。它还确保方法调用具有一些文档,说明它期望什么是参数,以及方法返回什么。我们的代码库是完整的调用,比如def runActivityReport(in, out),没有人知道in和out是什么。
- 我认为即使是javascript也是一种功能性语言。当然,它在默认情况下支持可变性,直到最近,但是它可以用纯函数样式非常成功地编写。比Python或Ruby更重要。当然,它也有原型OO特性,并且通常是以非常必要的方式编写的。但是,将一种语言从一个范例中排除出来是相当愚蠢的,因为它支持那些范例中没有使用的特性。这就是多范式语言的本质。
我正在阅读实用程序员的书"Groovy配方:润滑Java的车轮"的Scott Davis,版权2008,并于同年四月打印。
这有点过时了,但这本书清楚地说明Groovy简直就是Java的扩展。我可以编写Java代码,它的功能与Java完全一样,并重命名文件*.Groovy,它工作正常。根据这本书的说法,如果我包括必要的图书馆,情况就会相反。到目前为止,实验似乎证明了这一点。
- 这是最好的书了解Groovy。
- 它可能需要的所有最新的代码要注意的行为是相同的。本文包含一些不同的方式理解和Groovy的报价单和双标记和其偏好的拳击在扩大。最想工作的代码是一样的,虽然。
显然,语法完全不同(Groovy最接近Java),但我想这不是你要的。
如果您有兴趣使用它们来编写Java应用程序,那么斯卡拉可能不是一个好的选择,因为从Java中没有简单的方法来评估它,而Groovy特别适合于此目的。
- 我不理解你使用Scala来编写Java的观点。你当然可以编写一个驱动Java代码的Scala脚本,不需要EDCOX1 0。
- @丹尼尔,请看一下关于使用scala编写我链接的脚本的问题。这里所接受的答案是,缺少一个"EVE"工具和JavaX.Script支持使得使用Scala来编写Java应用程序是困难的,它是用Groovy来编写的。