[英]On Performance and Java Interoperability: Clojure vs. Scala
我已经阅读过Clojure与Scala的各种报道,而我发现两者都有自己的位置。 有一些考虑因素我没有得到关于何时比较Clojure和Scala的完整解释:
1.)这两种语言中的哪一种通常更快 ? 我意识到这会因语言功能而异,但对性能的一般评估会有所帮助。 例如:我知道Python字典非常快。 但作为一个整体,它是一个比Java 更慢的语言。 我不想和Clojure一起走在路上遇到这个问题。
2.)与Java的互操作性如何? 到目前为止我所读到的只是Scala具有本机集合类型,这使得与大型Java代码库集成有点笨拙,而Clojure遵循一种简单的以Iterable / Iterator为中心的方式来与Java类进行交互。 还有更多想法/细节吗?
最终,如果它在clojure和scala之间足够接近,我可能会尝试它们。 关于Clojure的一件事是语言看起来很简单。 但话说回来,Scala有一个非常灵活的类型系统。 但是,我知道Scala很快(基于多个个人帐户)。 所以,如果Clojure明显变慢了:我想早点知道,而不是迟早。
我认为任何一种语言对你来说都足够快。 在比较Python和Java时,将语言归咎于速度差异似乎有点不合理。 Java是编译JIT(移动设备除外),而Python则被解释。 仅仅因为两者都使用字节码并不意味着实现甚至可以具有远程可比性能。 但是Scala和Clojure都是JVM语言,因此它们应该具有相似的性能。
与Clojure相比,Scala具有一些实现优势,我期望性能更高一些。 虽然Scala的静态类型通常会转化为速度优于Clojure的鸭子类型,但Clojure 确实支持类型提示,这可以大大加快代码速度。 可能普通的Scala比普通的Clojure更快,但你只需要优化瓶颈。 大多数程序的运行时间是由少量的实际代码生成的。
关于使用Java的互操作,Scala更接近Java,但我确信两种语言的互操作性都很好。 在编程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编译器
使用现有的JVM Scala在静态类型的帐户上具有优势,因为JVM支持动态类型 - 反射 - 很慢。 实际上,由于这个原因,必须通过相同的技术,结构类型实现一个Scala特性。
此外,Scala接受可变对象就好了,而且一些算法只需更快地实现可变性。
由于Scala和Java本质上都是基于类的语言,因此它们更容易互操作。 或者,也许更无缝。 Java类是Scala的类,Scala类是Java的类。 当谈到Scala的单身人士或Java的静态成员时,可能会出现问题,特别是当有一个框架涉及期望事物以某种方式工作时。
所以我会在这两个帐户上使用Scala。 从很多方面来说,Clojure是一种更好的语言 ,它当然具有Scala上没有的(目前为止)非常有趣的功能,但是你可以通过完全功能获得这些好处。 如果你打算这样做,那么Clojure很可能会更好。 如果你不这样做,那么你应该继续使用Scala。
请注意,Clojure和Scala是两种完全不同类型的编程语言 - Clojure是一种类似于Lisp的函数语言,它不是面向对象的。 Scala是一种面向对象的语言,具有函数式编程功能。
在我看来,语言的功能和概念(功能,OO,......)是选择语言的重要标准,而不是表现(该语言的特定实现)的表现 - 尽管我知道你没有希望陷入一种没有良好实施可用性的语言。
我会选择Scala,因为它是面向对象的,但也允许你学习函数式编程(如果你对此感兴趣)。 另一方面,如果您不关心OO并且想要学习“纯粹的”函数式编程,请尝试使用Clojure。
“ 计算机语言基准游戏 ”产生的统计数据是您可能会找到的最佳数据。
它们很深入,您可以比较多种语言。 问题是他们没有涵盖Clojure :(
也就是说,提交任何东西都很容易 - 它都是开源的。
统计数据确实说Scala非常快。
如果您的代码在时间要求严格或对空间至关重要,请坚持使用Java。 但即便如此,它也不是。
计算机语言基准游戏对Clojure的真正资源成本几乎没有任何启示。 没有采用Clojure数据结构。 功能和序列抽象不会出现。
Clojure似乎很简单。 它不是,但它富有表现力。 它的运行速度可能比Java快五倍,但源的数量要小五倍(YMMV)。 对于大多数应用程序来说,这是一个巨大的胜利。 但是对于一些人而言,对于其他许多人来说,这是一种毁灭性的损失。
凭借Clojure语言的经验,我相信有可能事先告诉你的问题是否会完全切割成一个可以简洁而充分地(在性能方面)用Clojure表达的部分和需要用Java完成的部分。
据说Scala 是正确的Java 。 Clojure与Java完全不同。 你可能会说它是正确的Lisp - 一个大胆的,有些人会说荒谬,声称 - 这可能证明是真的。
关于互操作性,我不能代表Clojure,但我希望它与Scala类似。
从Scala调用Java非常容易。
只要您将外部API与Scala和Java之间的公共点相符合,就可以轻松地从Java调用Scala。 例如,Scala对象在某些方面用于Java中的静态方法,但它不是一回事。 Scala类可以编译为许多类,其名称在Java中看起来很有趣。
你不会想要混合搭配。 在Scala或Clojure中构建使用大量Java库的组件是非常可行的。 您当然可以从Java调用此组件,但您不想要做的是尝试使用Scala API以供Java中的Scala程序使用。
SVN声称“CVS做对了”。 在我看来,Scala是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代码的方式相同。 一些痛点可能是处理Java泛型的一些边缘情况,因为Scala的类型系统比Java 强得多 。 按照Java Bean约定创建getter和setter 需要注释 。
从Java调用Scala大部分时间都很简单,但是例如Scala的伴随对象需要知道如何将它们编译为字节码。 使用来自Java的非抽象方法的特征也应该很复杂,并且调用具有特殊字符的方法将需要知道它们在字节码中的编码方式。
它现在(截至2010年5月)值得在Clojure的最新1.2分支中使用 - 这包括对原始类型和静态类型(通过各种类型提示和协议)的大量额外支持。
我的理解是,您可以在需要时使用这些功能,以获得与在纯Java中编写完全相同的代码相当的速度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.