我已经阅读过Clojure与Scala的各种报道,而我发现两者都有自己的位置。有一些考虑因素我没有得到关于何时将Clojure与Scala进行比较的完整解释:
1。)这两种语言中的哪一种通常更快?我意识到这会因语言功能而异,但对性能的一般评估会有所帮助。例如:我知道Python字典非常快。但总的来说,它是一种比Java更慢的 慢的语言。我不想和Clojure一起讨论这个问题。
2.。)与Java的互操作性如何?到目前为止我所读到的只是Scala具有本机集合类型,这使得与大型Java代码库集成有点笨拙,而Clojure遵循一种简单的以Iterable / Iterator为中心的方式来与Java类进行交互。关于这个的更多想法/细节?
最终,如果它在clojure和scala之间足够接近,我可能会尝试两者。关于Clojure的一件事是语言似乎非常简单。但话说回来,Scala有一个非常灵活的类型系统。但是,我知道Scala很快(基于多个个人帐户)。所以,如果Clojure明显变慢了:我想早点知道,而不是迟到。
答案 0 :(得分:71)
我认为这两种语言都足够快。在比较Python和Java时,将语言归咎于速度差异似乎有点不合理。 Java是编译JIT(移动设备除外),而Python则被解释。仅仅因为两者都使用字节码并不意味着实现甚至可以具有远程可比性能。但是Scala和Clojure都是JVM语言,所以它们应该具有相似的性能。
Scala与Clojure相比具有一些实现优势,我期望性能更高一些。虽然Scala的静态类型通常会转化为速度优势,而Clojure的鸭子类型,但Clojure 支持支持类型提示,这可以大大加快代码速度。可能普通的Scala比普通的Clojure更快,但你只需要优化瓶颈。大多数程序的运行时间都是由少量的实际代码生成的。
关于使用Java的互操作,Scala更接近Java,但我确信两种语言的互操作性都很好。在 Programming Clojure 中,Stuart Halloway写道:“[你可以访问] 你可以通过Java代码获得的任何东西。”。
由于Scala的作者Martin Odersky 编写了 Sun的Java编译器,我认为Scala方面也没有放弃任何球。 : - )
你很难选择两种更好的语言,尽管我也喜欢Ruby。你为什么担心要尝试哪一个?为什么不尝试两者? Scala更有可能成为“下一个Java”,而很难想象Lisp将在50多年没有这样做之后终于起飞。但很明显Lisp处于自己独特的抽象层次,而Clojure相当简单,因此Scala + Clojure不会比(相当复杂的)Scala那么难,我相信你会很高兴你做到了它。
就此而言,他们互操作......
* dalvik(android的JVM)在2010年获得了2.2版本的JIT编译器
答案 1 :(得分:32)
使用现有的JVM Scala在静态类型的帐户上具有优势,因为JVM支持动态类型 - 反射 - 很慢。实际上,由于这个原因,一个必须通过相同的技术,结构类型实现的Scala特性经常被警告。
此外,Scala接受可变对象就好了,而且一些算法只需更快地实现可变性。
由于Scala和Java本质上都是基于类的语言,因此它们更容易互操作。或者,也许更无缝。 Java类是Scala的类,Scala类是Java的类。当谈到Scala的单身人士或Java的静态成员时,可能会出现问题,特别是当有一个框架涉及期望事物以某种方式工作时。
所以我会在这些帐户上使用Scala。从很多方面来说,Clojure是一种更好的语言,它当然具有Scala上尚未呈现的非常有趣的功能(但到目前为止),但是你通过全面运作获得了这些好处。如果你打算这样做,那么Clojure很可能会更好。如果你不这样做,那么你应该继续使用Scala。
答案 2 :(得分:21)
请注意,Clojure和Scala是两种完全不同类型的编程语言--Clojure是一种类似于Lisp的函数式语言,它是不面向对象的。 Scala是一种面向对象的语言,具有函数式编程功能。
在我看来,语言的功能和概念(功能,OO,......)是选择语言的重要标准,而不是表现(该语言的特定实现)的表现 - 尽管我明白你不希望被困在一种没有良好实施的语言中。
我会选择Scala,因为它是面向对象的,但也允许你学习函数式编程(如果你对此感兴趣)。另一方面,如果您不关心OO并且想要学习“纯粹的”函数式编程,请尝试Clojure。
答案 3 :(得分:15)
“Computer Language Benchmark Game”产生的统计数据是您可能会找到的最佳数据。
它们非常深入,您可以比较多种语言。问题是它们不包括Clojure :(
也就是说,提交任何东西都很容易 - 它都是开源的。
统计数据确实说Scala非常快。
答案 4 :(得分:15)
如果您的代码在整个过程中具有时间关键性或空间关键性,请坚持使用Java。但即便如此,它也不是。
计算机语言基准游戏对Clojure的真正资源成本几乎没有任何启示。没有采用Clojure数据结构。功能和序列抽象不会出现。
Clojure似乎很简单。它不是,但它富有表现力。它可能比Java慢五倍,但源小五倍(YMMV)。对于大多数应用程序来说,这是一个巨大的胜利。但是对于一些人而言,对于其他许多人来说,这是一种毁灭性的损失。
凭借Clojure语言的经验,我相信有可能事先告诉你的问题是否会完全切割成一个可以简洁而充分地(在性能方面)在Clojure中表达的部分以及需要在Java中完成的部分。
据说Scala是 Java完成的。 Clojure与Java完全不同。你可能会说它是 Lisp做得正确 - 一个大胆的,有些人会说荒谬的,声称 - 这可能证明是真的。
答案 5 :(得分:9)
关于互操作性,我不能代表Clojure,但我希望它与Scala类似。
从Scala调用Java非常容易。
只要您将外部API与Scala和Java之间的公共点相符合,就可以轻松地从Java调用Scala。例如,Scala对象在某些方面用于Java中的静态方法,但它不是一回事。 Scala类可以编译为许多类,其名称在Java中看起来很有趣。
你不会想要混合搭配。在Scala或Clojure中构建使用大量Java库的组件是非常可行的。您当然可以从Java调用此组件,但您不想要做的是尝试使用Scala API从Scala程序中使用Java。
SVN声称“CVS做对了”。在我看来,Scala是Java完成的。
答案 6 :(得分:3)
November 2010 issue of PragPub讨论了Clojure-Java互操作性。调用Java方法很简单,但扩展Java类/接口是完全不同的。
另一方面,Scala更接近Java。 Scala-Java互操作性在http://www.codecommit.com/blog/java/interop-between-java-and-scala 详细阐述调用Java代码和扩展Java类/接口的方式与调用Scala代码的方式相同。一些痛点可能是处理Java泛型的一些边缘情况,因为Scala的类型系统是much stronger而不是Java。按照Java Bean约定requires an annotation创建getter和setter。
从Java调用Scala大部分时间都很简单,但是例如Scala的伴随对象需要知道如何将它们编译为字节码。使用来自Java的非抽象方法的traits也应该很复杂,并且调用具有特殊字符的方法需要知道它们在字节码中的编码方式。
答案 7 :(得分:1)
现在(截至2010年5月)值得使用Clojure的最新1.2分支 - 这包括对原始类型和静态类型的大量额外支持(通过各种类型的提示和协议)。
我的理解是,您可以在需要时使用这些功能,以获得与在纯Java中编写完全相同的代码相当的速度。