`
csbison
  • 浏览: 150141 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[ 转]erlang-scala真锋对决

阅读更多

原载:老纪博客版权所有。转载时必须以链接形式注明转载自老纪博客[http://www.jifuyi.com/]。
本文链接地址:http://www.jifuyi.com/erlang-vs-scala/

 

 

erlang-scala真锋对决

今天看到一篇关于erlang和scala这两个分布式程序设计语言的文章,且对他们之间的好坏优劣做了个比较,老纪今天把它翻译出来供大家参考, 原文在这里

在我把时间浪费在可恶的社会新闻站点的活动上时,我看到越来越多关于scala的文章,我对scala开始感兴趣的主要原因有两点:1)scala是OO(面向对象)/FP(函数编程)的混杂体,我想任何把函数编程的理念引入到面向对象的世界都是很好的一件事。2)scala的actor库严重的受到erlang的影响,scala有时作为一个伟大的构建可扩展的并行应用语言而被提及到,就像erlang一样。

有几次,我看到scala和erlang的比较资料。erlang对于并行编程是非常好的,在他的应用环境中有很好的运行记录,但是他很难成为主流,他是陌生的,也没有很多库的支持。而scala这两点都很占优,他有函数编程的语义,他的Actors库提供了erlang式的并行,他运行在jvm上且能使用所有的java库,这些组合使scala在构建并行应用上成为更好的选择,特别是在java上已经有了投资的公司。

我没有用scala编过代码,但是我对他进行了一些很好的研究,看起来它是一个非常好的语言。我认识的一些最好的程序员都称赞过它。我想scala会是java的一个很好的替代品,函数对象、类型推导、混合、模式匹配都是非常好的语言特性,而这些正是java严重缺乏的。

尽管我相信scala是一个明显优于java的伟大的语言,但scala不会取代erlang成为我构建高可用、低延、大规模并行应用的语言。scala的actors库是一个大的改善,这是java在并行编程方面必须面对的。但是它没有提供所有erlang式并行的好处,而这使erlang在并行处理方面成为一个伟大的工具。我在这些方面做了大量的研究,这些是我认为一个人在scala和erlang中做出选择时而必须考虑的几个重要不同点。

 

并行编程

scala的actors库在模拟仿真erlang式的消息传递方面做了很好的工作。和erlang进程类似,scala的actors通过信箱接受发送消息,像erlang,scala在接收消息时有模式匹配语义,这会产生简洁、优雅的代码。scala的actors库走的更远,但是它没有使并行编程更简单的特性:不变性(老纪觉得scala提供了这种特性,val声明的变量都具有这种特性)。在erlang中很多进程在一虚拟机中可以共享同一数据,语言本身保证竞争条件不会发生,因为数据都是不可变的。在scala中,你可以在actors间发送指向可变对象的指针,这是造成竞争条件的典型方法。他让你停留在你开始的地方:不得不取保方位共享内存的同步

假如你很小心,你可以通过拷贝所有信息或者认为发送的信息是不变的的方法避免这个问题,但是scala不保证方位共享对象的安全性,而erlang能够在语言层面上保证(老纪认为通过正确的编程风格能够保证这一点,而scala的这种特性有时还能使程序设计更简单些,但是这样做的一个结果就是后期维护的难度会加大,所以坚持一种风格就一直坚持下去)

代码热交换

热代码交换是一个杀手级特性,它不仅消除了代码升级时的停机时间,它也使语言更具生产效率,因为它可以实现真正的交互式编程。通过热代码交换,你可以在不停止服务器、重新编译代码、重启服务器这个流程的情况下测试代码更改后的影响,而且你也能回到代码更改前的状态。热代码交换是我喜欢在erlang编程的主要原因。

在开发阶段,jvm对于热代码交换支持的很有限,我相信它只是在运行是改变了一个函数体,这个能力较erlang的热代码交换来说不是太强劲,erlang在任何时刻对改变的代码起作用

erlang热代码交换的一个最个的方面是当你调用新代码是,vm保留代码的前一版本,这就在老版本代码被最终删除之前给你一个接收消息执行代码交换的机会。这是据我所知erlang独一无二的特性。

热代码交换对于实时应用来说更重要,因为它能够在用户之间同步通讯,重启服务会导致用户session失效,这是很糟的用户体验,假设正在完魔兽,重大战役中你的连接因为开发人员想在代码中加入一条诊断记录而断开了,这是非常令人骂人的一件事。

垃圾收集

对支持垃圾收集语言的一个共同的论点是它不适合低延迟应用,因为潜在的垃圾清扫会冻结VM,现代的GC优化想分代收集可能缓解这个问题,但不完全,偶尔老代的需要收集,这回触发很长的清扫动作。

erlang被设计成能够构建具有软实时性能应用,erlang的GC也为这个目的而优化,在erlang中,进程的堆是独立的,所以GC也是对立的,这就最小化了因为垃圾收集而导致进程被冻结的时间。erlang也有ets,一个用于存储大量数据的内存存储工具,但是它不参与垃圾回收

在这,erlang可能没有一个决定性优势,JVM有一个新的并行垃圾回收机制用意最小化冻结时间,这个收集器因为更短的冻结而优化性能和内存开销,我没有找到任何关于它应用于产品的显示它多好的评测,不过,假设它是和erlang一样适合于低延迟应用。

作者:老纪
原载:老纪博客版权所有。转载时必须以链接形式注明转载自老纪博客[http://www.jifuyi.com/]。
本文链接地址:http://www.jifuyi.com/erlang-vs-scala/

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics