性能和Java互操作性:Clojure与Scala
我已经阅读了Clojure和Scala的各种账户,虽然我意识到两者都有自己的位置。 在Clojure和Scala的比较中,我还没有得到一个完整的解释:
1.)这两种语言中的哪一种通常比较快 ? 我意识到,这将从一个语言function到另一个不同,但一般性能的评估将是有帮助的。 例如:我知道Python字典真的很快。 但总的来说,这是一个比Java慢得多的语言。 我不想和Clojure一起去,在这条路上遇到这个问题。
2.)与Java的互操作性如何? 我目前阅读的所有内容都是Scala具有本地集合types,这使得它与一个大的Java代码库集成起来有些笨拙,而Clojure遵循一个简单的以Iterable / Iterator为中心的方式来与Java类进行交互操作。 任何更多的想法/细节呢?
最终,如果clojure和scala之间的距离足够近,我可以尝试两者。 有一点关于Clojure语言看起来很简单。 但是再一次,Scala有一个非常灵活的types系统。 但是,我知道Scala很快(基于多个个人帐户)。 所以,如果Clojure慢得多,我想早点知道。
我想任何一种语言对你来说都足够快。 在比较Python和Java时,将速度差异归咎于语言似乎有点不合理。 Java被编译为JIT(除了在移动设备上),而Python被解释。 仅仅因为两者都使用字节码并不意味着实现将具有远程可比性能。 但是Scala和Clojure都是JVM语言,所以它们应该具有相似的性能。
与Clojure相比,Scala有一些实现上的优势,我希望能有更高的性能。 虽然Scala的静态types通常可以转化为Clojure的鸭子打字的速度优势,但是Clojure 确实支持types提示,这可以大大加快代码的速度。 普通的Scala可能比普通的Clojure更快,但是你只需要优化瓶颈。 程序的大部分运行时间都是由less量的实际代码生成的。
关于Java的互操作性,Scala更接近于Java,但我相信这两种语言的互操作性都很好。 在编程Clojure Stuart Halloway写道:“[你可以访问] 任何你可以从Java代码中获得的东西。 ”
而且自从Scala的作者Martin Odersky 写了 Sun的Java编译器之后,我认为Scala方面也没有抛出任何球。 🙂
你会很难挑选两种更好的语言,但我也喜欢Ruby。 你为什么要担心要试一试? 为什么不尝试他们呢? Scala更有可能成为“下一个Java”,而很难想象Lisp最终会在超过50年的时间里脱颖而出。 但很显然,Lisp具有独特的抽象层次,而Clojure相当简单,所以Scala + Clojure不会比(相当复杂的)Scala更难,我相信你会很高兴你做到了它。
就此而言,他们互相协作
* 2010年,dalvik(android的JVM)在2.2版本中获得了JIT编译器
使用目前的JVM Scala在静态types化方面占有优势,因为对dynamictypes – reflection的JVM支持很慢。 事实上,一个必须通过相同的技术,结构types来实现的Scalafunction经常因为这个原因而受到警告。
此外,Scala接受可变对象就好了,有些algorithm实现可变性更快。
由于Scala和Java本质上都是基于类的语言,所以它们更容易互操作。 或者,也许更无缝。 Java类是Scala的类,Scala类是Java的类。 当涉及Scala的单例或Java的静态成员时,可能会出现问题,特别是当涉及框架期望事情以某种方式工作时。
所以我会和Scala一起在这两个账户上。 Clojure在很多方面都是一个更好的语言 ,它当然有非常有趣的特性,但是通过完整的function你可以获得这样的好处。 如果你打算这样做,那么Clojure很可能会更好。 如果你没有,那么你应该留在Scala。
请注意,Clojure和Scala是两种完全不同的编程语言 – Clojure是一种function性Lisp类语言,它不是面向对象的。 Scala是一种面向对象的语言,具有function性编程function。
在我看来,语言的特征和概念(function,面向对象,…)是select语言的重要标准,而不是语言的特定实现的性能 – 尽pipe我知道你不想要陷入没有可用的执行良好的语言。
我会去斯卡拉,因为它是面向对象的,但也允许你学习函数式编程(如果你对此感兴趣的话)。 另一方面,如果你不关心面向对象,并且你想学习“纯粹的”函数式编程,可以试试Clojure。
“ 计算机语言基准游戏 ”所产生的数据大概是你可能会find的最好的。
他们是深入的,你可以比较多种语言。 问题是,他们不包括Clojure 🙁
这就是说,提交任何东西都很简单 – 这都是开源的。
统计确实说Scala非常快。
- 习惯性的 Scala比惯用的 Clojure更快,并且会保持如此。
- Scala和Clojure都可以轻松地在Java之上。 它们都坐在下面。
如果你的代码对时间要求严格或者对整个空间至关重要,那就坚持使用Java。 但事实并非如此,即使你认为是这样。
计算机语言基准游戏对Clojure真正的资源成本没有多大的了解。 没有使用Clojure数据结构。 function和序列抽象不会出现。
Clojure看起来很简单。 这不是,但它是有performance力的。 它可能比Java运行速度慢五倍,但是源代码却小五倍(YMMV)。 对大多数应用来说,这是一个很大的胜利。 但是对于一些人以及许多其他人来说,这是一个毁灭性的损失。
有了Clojure语言的使用经验,我相信可以事先讲清楚你的问题是否会干净地分解成一个可以简洁而充分(在性能上)用Clojureexpression的部分,还有一部分需要用Java来完成。
- 你可以去Scala Lite:在Scala编写Java成语。 你会得到一些简洁的,一个更容易的语法和一个连贯的,虽然复杂的types系统。
- Clojure lite没有这样的东西:在Clojure中编写Java语言是毫无意义的。 所有你会得到的是很慢的Java,这是很难理解的,因为它跨越了用来expression它的成语。
据说Java是正确的 。 Clojure和Java没什么两样。 你可能会说Lisp是正确的 – 一个大胆的,有些人会说荒谬的,声称 – 这可能是真实的。
在互操作性方面,我不能说Clojure,但我希望它和Scala类似。
从Scala调用Java是非常容易的。
只要您将外部API与Scala和Java之间的共同点保持一致,就很容易从Java调用Scala。 例如,一个Scala对象在某些方面像Java中的静态方法一样使用,但它不是一回事。 Scala类可以编译成许多在Java中看起来很有趣的类。
你不会想要混合和匹配很多。 在Scala或Clojure中构build使用大量Java库的组件是非常可行的。 你当然可以从Java调用这个组件,但是你不想要做的就是尝试使用一个Scala API,供Java中的Scala程序使用。
SVN声称是“CVS做对了”。 在我看来,斯卡拉Java是正确的。
2010年11月的PragPub讨论了Clojure-Java的互操作性。 调用Java方法很简单,但是扩展Java类/接口是完全不同的。
另一方面,Scala更接近于Java。 Scala-Java的互操作性详见http://www.codecommit.com/blog/java/interop-between-java-and-scala
调用Java代码和扩展Java类/接口的工作方式与调用Scala代码的方式相同。 有些痛点可能是处理Javagenerics的一些边缘情况,因为Scala的types系统比Java 强大得多。 按照Java Bean约定创buildgetter和setter 需要注释 。
从Java调用Scala大部分时间很简单,但是例如Scala的伴侣对象需要知道如何将它们编译为字节码。 在Java中使用非抽象方法的特征也应该是复杂的,调用具有特殊字符的方法需要知道如何在字节码中进行编码。
现在(截至2010年5月)Clojure的最新版本1.2版本值得一提,这包括对原始types和静态types(通过各种types提示和协议)的额外支持。
我的理解是,当你需要它的时候,你可以使用这些特性来获得相当于在纯Java中编写完全一样的代码的速度。