28

我不是专业程序员(我的领域是医学研究),但我在 C/C++ 和各种脚本语言方面相当有能力。不久前,我对 Lisp 很感兴趣,但我一直没有时间认真学习它。在短暂接触R之后,我决定在函数式编程语言上投入更多时间。

我想要 JVM 语言的实用性,因此将范围缩小到 Clojure 和 Scala。据我了解,两者都可以使用已经存在的 Java 库,并且可以将性能关键的代码委托给 Java,有可能表现得相当好。

这些语言在我需要它们的应用程序空间中如何比较?是否有任何生物信息学的现实项目使用这两种方法?

已经存在的代码将是一个重要的优势,良好的文档和相当温和的学习曲线也是如此。另外,两者的并发模型如何相互比较?

任何人有什么显着的优势/劣势?

4

9 回答 9

32

我个人可以保证 Clojure 是完成此类工作的绝佳工具。(我相信 Scala 也会很棒,只是我对它的经验较少)。

我个人的研究是在预测建模/机器学习领域,并且计算量很大——所以我认为它与生物信息学或生物统计学有很多相似之处。

我的个人方法/设置包括:

  • Incanter主要用作数据可视化工具。非常适合在 REPL 上生成通常只有 1 行的快速可视化。还有很多统计和数值处理工具,我相信它们在后台使用Colt库。我不是 R 专家,但我知道 Incanter 大致是“R 翻译成 Clojure/Lisp”。

  • 根据需要利用相当多的 Java 库。其中一些是我自己的,例如我用 Java 编写的算法,以便从 JVM 中获得最佳的微调性能。但是您可以同样轻松地使用任何其他可用的出色 Java 库,因为从 Clojure 调用 Java 非常简单(.methodName object param1 param2)

  • 相当多的高阶函数来自动化我的工作流程。例如,我有一个高阶函数,它将在指定的时间内循环运行任何类型的优化算法,然后生成每次迭代改进的 Incanter 图。不是火箭科学,但很容易用几行 Clojure 编写代码。

  • 永远不必担心性能。如果你愿意,你可以让 Clojure 运行得非常快(例如,使用类型提示、原始算术支持等),但通常它是无关紧要的,因为无论如何你都会将 99% 以上的周期花费在优化好的库代码中。因此,“胶水”代码中的一些开销可以忽略不计——我觉得通过使用动态、高级、函数式语言,我在个人生产力方面获得了更多收益。

  • Clojure并发特性的主要用途——这必须是 Clojure 最强大的特性之一。我倾向于使用 STM 来编写具有不能相互干扰的事务的并发进程,然后在将来启动长时间运行的计算,以便我可以继续执行其他任务并等待结果通知。

  • 一个缓慢增长的宏集合,用于在需要时“扩展语言”。实际上,我使用宏的次数比我想象的要少(高阶函数通常是更好的选择)。但是当你需要它们时,它们是无价的——这就是你真正欣赏同音语言的价值的地方。由于它们有效地允许您向语言本身添加新语法,因此当正确使用它们来构建您需要的 DSL 时,它们非常强大。

简而言之 - 我认为 Clojure 作为研究人员不会出错。

我可能不会使用它的一件事(还)实际上是编写一个新的数值库 - 这可能会在 Scala 或纯 Java 中更好地完成,因为您可能希望采用更命令式/OOP 风格。

于 2011-03-09T21:19:42.887 回答
22

我不确定生物信息学和生物统计学本身,但我经常进行科学数据分析,我很欣赏 Scala 允许我相对轻松地编写与 Java 一样快的代码。我相信现在在 Clojure 中这通常是可能的,但我还没有看到支持这一点的基准。就目前而言,我认为谨慎的做法是它们的表现并不一样好。例如,参见Computer Languages Benchmark Game,其中 Scala 在每个测试中都比 Clojure 快。(忽略 Clojure 可怕的“pidigits”结果——Scala(和 Java)正在调用用 C 编写的 GMP 库,Clojure 可以这样做,但由于技术细节需要对库进行不同的包装,目前不允许游戏)。看着多核比较并没有改善 Clojure 的显示效果,请注意,对于这类低级算法任务,Clojure 代码并不短。

Clojure 暂时领先于并行集合,尽管即将发布的 Scala 2.9 版本应该弥补大部分差异。当来自 C++ 时,两者都没有平缓的学习曲线;考虑到语法看起来更熟悉一些,Scala 可能更容易一些。我相信每个人都有很好的学习材料。


编辑:PS您可以使用rJava(特别是JRI接口)从Java(因此从Clojure或Scala)调用R。编辑到编辑:而且,这些天,rScala

编辑#2:在撰写本文时,Scala 在所有方面都比 Clojure 快;在本次编辑中,Clojure 在一个方面有点领先(以大量代码为代价)——但无论如何,总体观点是站得住脚的。(并且可以加快该测试中的 Scala 实现。)

于 2011-03-09T19:02:34.670 回答
17

如果你喜欢 R,试试Incanter!它是Clojure的 R 。

Scala 的目标是让来自 Java 的人在语法上更容易,这旨在让来自 C 的人在语法上更容易,尽管像这样的两个间接级别可能会失去优势。

Clojure 在大数据领域获得了很大的关注,并且很好地映射到了大数据的Hadoop作业。我认为这将是生物信息学领域的一大优势。

真的,这些东西很大程度上是个人品味,所以尝试两者,看看会让你开心:)

如果您希望在没有大量“知识开销”的情况下体验 Clojure,我是否建议您使用 leiningen 来快速启动测试项目?

于 2011-03-09T18:46:50.187 回答
12

为了建立 Rex 的答案,我想添加一些您可能感兴趣的 Scala 库/产品:

于 2011-03-09T19:49:25.883 回答
10

我不了解 Scala,因此无法提供比较,但我在生物信息学项目中积极使用 Clojure。

Java 集成非常好,我使用BioJava库没有任何问题。

Clojure 的并发模型的亮点在于不可变的默认数据类型和带有抽象seq函数式编程。

在我的生物信息学工作中,我经常发现自己有很多需要进行相同分析的输入数据(比如基因序列)。一旦我有了我的分析功能,我就可以map通过一系列输入(懒惰地生成结果)。只需将其更改mappmap.

单个字符更改的大规模并行化很难被击败!

当然pmap,这不是灵丹妙药,只有在分析函数在计算上占主导地位时才有用,但事实上可以插入mappmap拔出,这表明 Clojure 的设计具有优雅和简单性。

于 2011-03-09T20:37:41.080 回答
8

我对 Scala 只是稍微熟悉,所以我能做的最好的事情就是为 Clojure 宣传一下。这是一门很棒的语言,但请对所有这些建议持保留态度,因为它来自一个爱好者。

如果您正在寻找并发性,Clojure 在易于编程和性能方面都非常出色。不可变的数据结构意味着在没有任何手动和容易出错的锁定的情况下处理世界的连贯快照是微不足道的;STM 使得以线程敏感的方式更改数据变得相当简单,而不会破坏其他任何人的快照。

我的理解是 Scala 有很多 Clo​​jure 提供的不错的函数式工具,但 Clojure 总是会凭借 Lisp 的优势在语法上获胜。如果您想做一些专门的生物信息学工作,Clojure 能够隐藏您不想要的 Lisp 部分,并将您自己的结构提升到与内置语言结构相同的水平。我现在找不到参考资料,但有一些关于 Lisp 的著名引言如下:

Lisp 不是任何程序的完美语言。但它是为每个程序构建完美语言的完美语言。

这是可怕的解释,但根据我的经验,这是真的。看起来您需要一套相当专业的工具,而且没有任何语言能让这些工具像 Lisp 一样自然。

于 2011-03-09T18:59:03.227 回答
5

你必须问问自己,函数式编程对你有多重要。你知道 C++,所以你可能知道 OO。我想说在 Scala 中在 Clojure 中做 FP 更容易(因为你不能真正退回到 OO 风格),你最终会放弃 FP 并做更多的 OO 风格。

关于您的应用程序空间,我真的无话可说。

由于您提到了 R,因此有一个类似于 R 的 Clojure 统计库,称为Incanter。我不知道您的应用程序空间中的其他现有项目。

有很多关于这两种语言的信息,所以这应该不是问题。两种语言的学习曲线有点陡峭。Clojure 是一种小得多的语言,而且由于您已经了解一些 lisp,因此学习重要的东西应该不难。Scala 有一个很难掌握的类型系统,尤其是因为您的主要经验是使用 C/C++。

两种语言都有很好的并发模型,你可能会对它们都很满意。

于 2011-03-09T19:29:11.447 回答
2

我在 Scala 方面有一些经验,但对 Clojure 了解不多,但我多年前就编写了 Lisp。

Lisp 是一门美丽的语言,但它从未走向世界,因为它太有限了。我相信你需要一种静态类型的语言来开发健壮的系统。Scala 中的类型系统不难掌握并从中受益。如果你想用它做一些非常高级的事情来让你的库不傻,你可以,但是你需要更多地研究类型系统。

Scala 偏爱不可变类型,但您可以毫无问题地使用可变类型,这有时确实需要。Scala 中的并发性实现得非常好,并且像 akka 这样的框架扩展并增强了这些可能性。

Scala 有更好的机会成为主流语言,因为它是一种更完整的语言。恐怕 Clojure 太像 Lisp(但在 JVM 上重新实现)。我非常喜欢 Lisp,但它对于现实生活中的程序有太多的缺点。有了 Scala,我认为我们在干净的婚姻中拥有两全其美(OO 和功能)。最重要的是,Scala 似乎真的在市场上流行起来。

于 2011-03-10T17:37:05.960 回答
1

我们一直在 GitHub 上的 Rudolf/BioClojure 项目中编写一些实验性代码。此外,请查看 Jan Aert 的 BioClojure 项目,该项目结构更加结构化。

此外,还有一个BioCaml项目正在进行中……

于 2011-10-31T06:09:42.450 回答