首页 文章

关于性能和Java互操作性:Clojure与Scala

提问于
浏览
80

我已经阅读过Clojure与Scala的各种报道,而我发现两者都有自己的位置 . 在比较Clojure与Scala时,我还没有完全解释一些注意事项:

1.)两种语言中的哪一种通常更快?我意识到这会因语言功能而异,但对性能的一般评估会有所帮助 . 例如:我知道Python字典非常快 . 但总的来说,它是一种比Java慢得多的语言 . 我不想和Clojure一起走在路上遇到这个问题 .

2.)与Java的互操作性如何?到目前为止我所读到的只是Scala具有本机集合类型,这使得与大型Java代码库集成有点笨拙,而Clojure遵循一种简单的以Iterable / Iterator为中心的方式来与Java类进行交互 . 还有更多想法/细节吗?

最终,如果它在clojure和scala之间足够接近,我可能会尝试它们 . 关于Clojure的一件事是语言看起来很简单 . 但话说回来,Scala有一个非常灵活的类型系统 . 但是,我知道Scala很快(基于多个个人帐户) . 所以,如果Clojure显着变慢:我想早点知道,而不是更晚 .

8 回答

  • 9

    它现在(截至2010年5月)值得使用Clojure的最新1.2分支 - 这包括对原始类型和静态类型(通过各种类型提示和协议)的大量额外支持 .

    我的理解是,您可以在需要时使用这些功能,以获得与在纯Java中编写完全相同的代码相当的速度 .

  • 3

    我认为这两种语言都足够快 . 在比较Python和Java时,将语言归咎于速度差异似乎有点不合理 . Java是编译JIT(移动设备除外),而Python则被解释 . 仅仅因为两者都使用字节码并不意味着实现甚至具有远程可比性能 . 但是Scala和Clojure都是JVM语言,因此它们应该具有相似的性能 .

    与Clojure相比,Scala具有一些实现优势,我期望性能更高一些 . 虽然Scala 's static typing would normally translate into a speed advantage over 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编译器
  • 15

    使用现有的JVM Scala在静态类型方面具有优势,因为JVM支持动态类型 - 反射 - 很慢 . 事实上,由于这个原因,必须通过相同的技术,结构类型实现一个Scala功能 .

    此外,Scala接受可变对象就好了,有些算法只需更快地实现可变性 .

    由于Scala和Java本质上都是基于类的语言,因此它们更容易互操作 . 或者,也许更无缝 . Java类是Scala的类,Scala类是Java的类 . 当谈到Scala的单身人士或Java的静态成员时,可能会出现问题,特别是当有一个框架涉及期望事物以某种方式工作时 .

    因此,我会在这两个帐户上使用Scala . 从很多方面来说,Clojure是一种更好的语言,它当然具有非常有趣的功能(到目前为止)还没有出现在Scala上,但是你可以通过全面的功能获得这些好处 . 如果你打算这样做,那么Clojure很可能会更好 . 如果你不这样做,那么你应该继续使用Scala .

  • 21

    请注意,Clojure和Scala是两种完全不同类型的编程语言--Clojure是一种类似于Lisp的函数语言,它是面向对象的_987116 . Scala是一种面向对象的语言,具有函数式编程功能 .

    在我看来,语言的功能和概念(功能,OO,......)是选择语言的重要标准,而不是表现(该语言的特定实现)的表现 - 尽管我知道你不这样做希望陷入一种没有良好实施可用性的语言 .

    我会选择Scala,因为它是面向对象的,但也允许你学习函数式编程(如果你对此感兴趣) . 另一方面,如果您不关心OO并且想要学习“纯粹的”函数式编程,请尝试使用Clojure .

  • 15

    Computer Language Benchmark Game”产生的统计数据是您可能会找到的最佳数据 .

    它们很深入,您可以比较多种语言 . 问题是他们没有涵盖Clojure :(

    也就是说,提交任何东西都很容易 - 它都是开源的 .

    统计数据确实说Scala非常快 .

  • 1
    • 惯用的Scala比惯用的Clojure更快,并且仍然如此 .

    • Scala和Clojure都可以轻松地放在Java之上 . 它们都不在它下面 .

    如果您的代码在时间关键或对空间至关重要,请坚持使用Java . 但即便如此,它也不是 .

    计算机语言基准游戏对Clojure的真正资源成本几乎没有任何启示 . 没有采用Clojure数据结构 . 功能和序列抽象不会出现 .

    Clojure似乎很简单 . 它不是,但它具有表现力 . 它的运行速度可能比Java快五倍,但源的数量要小五倍(YMMV) . 对于大多数应用程序来说,这是一个巨大的胜利 . 但对于一些人而言,对于许多其他人来说,这是一种毁灭性的损失 .

    凭借Clojure语言的经验,我相信有可能事先告诉你的问题是否会完全切割成一个可以简洁而充分地(在性能方面)用Clojure表达的部分以及需要用Java实现的部分 .

    • 你可以去Scala lite:在Scala中编写Java习语 . 你眼睛更容易,而且是一个连贯的复杂类型系统 .

    • 没有Clojure lite这样的东西:在Clojure中编写Java习语是完全没有意义的 . 所有你都难以理解,因为它跨越了用来表达它的习语 .

    据说Scala是正确的Java . Clojure与Java完全不同 . 你可能会说它是正确的Lisp - 一个大胆的,有些人会说荒谬,声称 - 这可能证明是真的 .

  • 71

    关于互操作性,我不能代表Clojure,但我希望它与Scala类似 .

    从Scala调用Java非常容易 .

    只要您将外部API与Scala和Java之间的公共点相符合,就可以轻松地从Java调用Scala . 例如,Scala对象在某些方面被用作Java中的静态方法,但它不是一回事 . Scala类可以编译为许多类,其名称在Java中看起来很有趣 .

    你不会想要混合搭配 . 在Scala或Clojure中构建使用大量Java库的组件是非常可行的 . 您当然可以从Java调用此组件,但您不想要做的是尝试使用Scala API,供Scala程序使用 .

    SVN声称“CVS做对了” . 在我看来,Scala是Java完成的 .

  • 32

    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 's generics, because Scala'类型系统的一些边缘情况是much stronger而不是Java . 按照Java Bean约定requires an annotation创建getter和setter .

    从Java调用Scala大部分时间都很简单,但是例如Scala的伴随对象需要知道如何将它们编译为字节码 . 使用来自Java的非抽象方法的特征也应该很复杂,并且调用具有特殊字符的方法将需要知道它们在字节码中的编码方式 .

相关问题