我不是专业程序员(我的领域是医学研究),但我在C / C ++和各种脚本语言方面都很有能力。不久之后,我被Lisp吸引了,但我没有时间认真学习它。在短暂接触R之后,我决定在函数式编程语言上投入更多时间。
我想要JVM语言的实用性,从而缩小到Clojure和Scala。根据我的理解,两者都可以使用已经存在的Java库,并且在性能关键代码中给出的代码可以委托给Java,具有相对同样良好的性能。
这些语言在我需要的应用程序空间中如何比较? 生物信息学中是否有任何真实的项目使用?
现有的代码将是一个严重的优点,因为良好的文档和相当温和的学习曲线。另外,两者的并发模型如何相互比较?
任何人有任何显着的优点/缺点吗?
答案 0 :(得分:31)
我个人可以保证将Clojure作为这种工作的一个很好的工具。 (我相信Scala也会很棒,我对它的经验也很少。)
我的个人研究属于预测建模/机器学习领域,并且计算量很大 - 所以我认为它与生物信息学或生物统计学有许多相似之处。
我的个人方法/设置包括:
Incanter主要用作数据可视化工具。非常适合生成快速可视化,通常只有1行在REPL。还有很多统计和数字处理工具,我认为它们使用了Colt库。我不是R的专家,但我知道Incanter大致是“R翻译成Clojure / Lisp”。
根据需要利用相当多的Java库。其中一些是我自己的,例如我用Java编写的算法,以便从JVM中获得最佳的微调性能。但你可以同样轻松地使用任何其他可用的优秀Java库,因为从Clojure调用Java非常简单(.methodName对象param1 param2)
相当多的高阶函数可以自动化我的工作流程。例如,我有一个更高阶函数,它将在循环中运行任何类型的优化算法一段指定的时间,然后生成每次迭代的改进的Incanter图。不是火箭科学,而是在Clojure的几行中很容易编码。
永远不必担心性能问题。如果你愿意,你可以让Clojure变得非常快(例如使用类型提示,原始算术支持等),但通常它是无关紧要的,因为无论如何你将在优化良好的库代码中花费99%以上的周期。因此,“胶水”代码中的一些开销可以忽略不计 - 我觉得通过使用动态,高级,功能性语言,我在个人生产力方面获得了更多。
主要使用Clojure的concurrency features - 这必须是Clojure最强大的功能之一。我倾向于使用STM来编写并发进程的事务,这些事务不会相互干扰,然后在将来启动长时间运行的计算,以便我可以继续执行其他任务并等待结果通知。
缓慢增长的宏集合,以便在需要时“扩展语言”。我实际上使用的宏比我想象的要少(高阶函数通常是更好的选择)。但是当你需要它们时它们是非常宝贵的 - 这是你真正欣赏homoiconic language的价值的地方。由于它们有效地允许您为语言本身添加新语法,因此在正确使用它们构建所需的DSL时它们非常强大。
简而言之 - 我不认为Clojure作为研究员会出错。
我可能不会将它用于(还)的一件事实际上是编写一个新的数值库 - 这可能在Scala或纯Java中更好,因为您可能希望采用更强制/ OOP样式。
答案 1 :(得分:22)
我不确定生物信息学和生物统计学本身,但我经常进行科学数据分析,我很欣赏Scala允许我相对容易地编写尽可能快的Java代码。我相信现在经常可以在Clojure中使用它,但我还没有看到支持它的基准。目前,我认为谨慎的假设是他们不表现同样出色。例如,请参阅Computer Languages Benchmark Game,其中Scala在每次测试中都比Clojure快。 (忽略Clojure可怕的“pidigits”结果 - Scala(和Java)正在调用用C语言编写的GMP库,Clojure可以这样做,但由于技术细节需要对库进行不同的包装,目前不允许游戏)。查看multicore comparisons并没有改善Clojure的显示,并注意到Clojure代码对于这些低级算法任务来说并不短。
Clojure目前在并行收藏方面处于领先地位,尽管Scala即将推出的2.9版本应该弥补差异。来自C ++时,两者都没有温和的学习曲线;鉴于语法外观看起来更为熟悉,Scala可能会更容易一些。我相信有很好的材料来学习每一个。
编辑:P.S。您可以使用rJava(特别是JRI接口)从Java调用R(因此可以从Clojure或Scala调用)。编辑以编辑:以及最近rScala。
编辑#2:在撰写本文时,Scala在所有事情上都比Clojure快;在这个编辑中,Clojure在一个方面领先一步(以大量代码为代价) - 但无论如何,整体观点仍然存在。 (并且可以加速在那个测试上的Scala实现。)
答案 2 :(得分:17)
如果您喜欢R,请试试Incanter!这是Clojure的R。
Scala的目标是让来自Java的人在语法上更容易,这对于来自C的人来说在语法上很容易,虽然有两个级别的间接,这样的优势可能会丢失。
Clojure在大数据空间中获得了很大的吸引力,并且很好地映射到了巨大数据的Hadoop工作。我认为这将是生物信息学领域的一大优势。
真的,这些东西主要是个人品味所以请尝试两者并看到让你开心:)
如果您希望在没有大量“智力开销”的情况下感受Clojure,我建议您使用leiningen快速启动测试项目吗?
答案 3 :(得分:12)
为了建立Rex的答案,我想添加一些您可能感兴趣的Scala库/产品:
答案 4 :(得分:9)
我不知道Scala,所以我不能提供比较,但我在生物信息学项目中积极使用Clojure。
Java集成非常好,我使用BioJava库没有问题。
Clojure的并发模型出现在使用the seq
abstraction的不可变默认数据类型和函数式编程中。
在我的生物信息学工作中,我经常发现自己有很多输入数据(比如基因序列)需要进行相同的分析。一旦我有了分析功能,我可以map
通过一系列输入(结果延迟生成)。我只需将map
更改为pmap
即可充分利用大型48核服务器。
单个字符更改的大规模并行化很难被击败!
当然pmap
不是一个神奇的子弹,只有当分析函数在计算上占主导地位时才有用,但map
和pmap
可以插入和拔出的事实表明Clojure设计的优雅和简约。
答案 5 :(得分:7)
我只是熟悉Scala,所以我能做的最好的事情就是为Clojure传福音。这是一种很棒的语言,但是从一个发烧友那里得到的所有这些建议都是一种盐。
如果您正在寻找并发性,Clojure在编程和性能方面都非常出色。不可变数据结构意味着在没有任何手动和容易出错的锁定的情况下处理世界的连贯快照是微不足道的; STM使得以线程敏感的方式更改数据非常简单,而不会破坏任何其他人的快照。
我的理解是Scala有许多Clojure所做的很好的功能工具,但Clojure总是凭借成为Lisp在语法上获胜。如果你想做一些专门的生物信息学,Clojure能够隐藏你不想要的Lisp,并将你自己的构造提升到与内置语言结构相同的水平。我现在找不到引用,但有一些关于Lisp的着名引用如下:
Lisp不是任何程序的完美语言。但它是构建每个程序的完美语言的完美语言。
这是可怕的释义,但根据我的经验,这是真的。看起来你会想要一套相当专业的工具,没有一种语言会让那些像Lisp一样自然的感觉。
答案 6 :(得分:5)
你必须问问自己函数式编程对你有多重要。你知道C ++所以你可能知道OO。我会说在Clojure中更容易做FP(因为你不能真正回到OO风格)在Scala中你最终会丢弃FP并做更多的OO风格。
我无法真正说出你的申请空间。
由于您提到了R,因此有一个类似于R的Clojure库,用于统计称为Incanter。我不知道您的应用程序领域中的其他现有项目。
有很多关于这两种语言的信息,所以这应该不是问题。两种语言的学习曲线都很陡峭。 Clojure是一个小得多的语言,因为你已经知道一些口齿不清,所以不应该很难学习重要的东西。 Scala有一个难以接受的类型系统,特别是因为你的主要经验是使用C / C ++。
这两种语言都有很好的并发模型,你可能会对这两种语言感到满意。
答案 7 :(得分:3)
我在Scala方面有一些经验,在Clojure方面知之甚少,但多年前我编写了Lisp程序。
Lisp是一种美丽的语言,但它从来没有传播到世界,因为它太有限了。我相信你需要一种静态类型的语言来开发强大的系统。 Scala中的类型系统不难从中受益。如果你想用它来做非常高级的事情来使你的图书馆具有傻瓜风格,那么你可以,但是你需要更多地学习类型系统。
Scala支持不可变类型,但是你可以毫无问题地使用mutable,这有时你需要它。 Scala中的并发性得到了很好的实现,像akka这样的框架扩展并增强了这些可能性。
Scala有更好的机会成为主流语言,因为它是一种更全面的语言。我担心Clojure太像Lisp(但在JVM上重新实现)。我很喜欢Lisp,但它对现实生活中的程序有太多不利之处。使用Scala,我认为我们在干净的婚姻中拥有两全其美(OO和功能性)。最重要的是,Scala似乎真的在市场上流行起来。
答案 8 :(得分:1)
我们一直在GitHub上的Rudolf / BioClojure项目中研究一些实验代码。另外,看看Jan Aert的BioClojure项目,它更有条理。
此外,还有一个BioCaml项目正在进行中......