Clojure语言 vs Scala 语言

fmms 13年前
     <p>本文是从 <a href="/misc/goto?guid=4958190790116502167" target="_blank">Clojure vs Scala - anecdote</a> 这篇文章翻译而来。</p>    <hr />    <p>我在这里是想跟大家分享一些从World Singles 系统里获得的经验 …</p>    <p>早在2009年11月,我们就开始使用Scala语言了。我们有一个需要运行很长时间的操作,把大量的数据变更信息从会员信息数据库中取出,以 XML打包文件的形式发送到自定义搜索引擎里。把一大堆的数据表从数据库中映射到XML规则文件里是一个相当复杂的操作。在过去,公司尝试了各种方法,有 的好用,有的不好用。我向公司推荐使用Scala语言,原因是他的高效、并行性、类型安全,以及方便适用(特别是XML在Scala语言里有一种相对应的 基本数据类型)。</p>    <p>我们使用Scala编程作为产品的后台发布程序已经有差不多两年了。大多时候,它运行的非常好,但在压力大的时候,它会出现内存溢出的现象,经过大 量的观察和测试,我们慢慢的确认,(至少部分原因)是Scala语言本身的实现导致了这个问题。Scala正准备要收编Akka程序库,我们一直在考虑把 程序迁移到Akka上…</p>    <p>因为今年我们开始使用Clojure语言(大概是去年5月我们就开始尝试这种语言),我们认为应该集中兵力开发出一个Clojure版本的Scala程序,看看它运行起来表现如何。</p>    <p>这个Clojure版的后台发布程序的开发耗费了我们大概15个小时,并通过了所有测试。今天我们进行了一次“疲劳测试”,让它一次处理将近30万 个会员的信息。如果是Scala程序,当一次处理的数据量达到5万份时(有时会更少),它就会报内存溢出错误。而Clojure程序却一气呵成,十分顺利 ——于是,我们就决定在下一次产品发布里用它把Scala程序给替换下来了。</p>    <p>另外一个有趣的方面是,Scala版的程序长度总共大约有1000行(大概有3.1万个字符)。而Clojure版的只有260行(大约1.15万 个字符)。就连注释也简单了(*呃哼*—这并不是我想炫耀的,只是想说这种比较没有偏向)。我们的比较还没有把单元测试代码计算入内,因为Clojure 版写的很仓促。Clojure的代码形式非常的接近Scala代码,很多函数都相同——Clojure是一种更强大的Scala——它对一些辅助函数进行 的重构,使其变的更加模块化和可维护。</p>    <p>结果是很显然,我将在产品里采用Clojure版的发布程序,完全的放弃Scala。</p>    <p>这是Rich Hickey(Clojure语言的发明人) 和 Clojure/core 开发团队的功劳,他们创造了这样一种精彩适用的编程语言,帮人们解决了大问题——谢谢你们!<br /> <br /> <a href="/misc/goto?guid=4958183920711387805" target="_blank"><span style="font-weight:bold;">Google并发语言Clojure</span></a>是一种LISP风格的语言,运行在JVM上。Clojure的一大特色就是其并发机制,它支持不可变的数据结构(Clojure是来自于可持久化的数据结构)。Clojure还有一个特色是<strong>软件事务存储</strong>(Software Transactional Memory,STM),其支持用事务代替锁和互斥器来更新共享内存。STM还是一个有争议的技术,还需要更好的证明自己,一个简单的办法就是访问一个JVM上的实现。</p>    <p><a href="/misc/goto?guid=4958188765916438898" target="_blank">Scala</a>是一门现代的多范式编程语言,志在以简练、优雅及类型安全的方式来表达常用编程模式。它平滑地集成了面向对象和函数语言的特性。</p>    <ul>     <li><strong>Scala是面向对象的</strong>:Scala是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由class和trait来描述的。Class的抽象可由子类化和一种灵活的基于mixin的组合机制(它可作为多重继承的简单替代方案)来扩展。 </li>     <li><strong>Scala是函数式的</strong>: Scala还是一个函数式语言,在某种意义上来讲所有函数都是数值。Scala为定义匿名函数提供了一种轻量级的语法,它支持高阶(higher- order)函数、允许函数嵌套、支持局部套用(currying)。Scala的case类及其内置支持的模式匹配模型代数类型在许多函数式编程语言中 都被使用。 </li>     <li><strong>Scala是静态类型的</strong>:Scala配备了一套富有表现力的类型系统,该抽象概念以一种安全的和一致的方式被使用。 </li>     <li><strong>Scala是可扩展的</strong>:Scala的设计承认了实践事实,领域特定应用开发通常需要领域特定语言扩展。Scala提供了一个独特的语言组合机制,这可以更加容易地以类库的形式增加新的语言结构:      <ul>       <li>任何方式可以被用作中缀(infix)或后缀(postfix)操作符 </li>       <li>闭包按照所期望的类型(目标类型)自动地被构造</li>      </ul> 两者结合使用可方便地定义新语句,无需扩展语法,也无需使用类似宏的元编程工具。 </li>     <li><strong>Scala可与Java和.NET进行互操作</strong>:Scala 设计时就考虑了与流行编程环境良好交互,如Java 2运行时环境(JRE)和 .NET框架(CLR)。特别是与主流面向对象语言,如Java和C#尽量无缝交互。Scala有像Java和C#一样的编译模型(独立编译,动态装载 类),允许访问成千上万的高质量类库。</li>    </ul>    <p><br /> 本文转载自: 外刊IT评论 <a href="/misc/goto?guid=4958183272158702965" rel="nofollow">http://www.aqee.net/</a> </p>