今天看到一篇关于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/
相关推荐
标题中的"erlang-23.2.3-1.el7.x86_64.rpm"和"erlang-23.2.1-1.el7.x86_64.rpm.rar"代表了两个不同的Erlang版本。`.rpm`文件是用于Red Hat Enterprise Linux (RHEL) 和其衍生发行版如CentOS的软件包管理格式,而`....
在标题"erlang-22.3-1.el7.x86_64.rpm"中,我们可以解读出几个关键信息: 1. **版本号**:22.3-1表示这是Erlang的一个特定版本,22.3是主版本号和次版本号,而-1可能代表修订或更新次数。 2. **操作系统兼容性**:...
erlang-24.3.3-1.el9.x86_64.rpm centos
"erlang-rpm-21.3.4.zip"是一个包含Erlang版本21.3.4的RPM(Red Hat Package Manager)包的压缩文件,适用于Linux操作系统,尤其是基于RPM包管理系统的发行版,如CentOS、Fedora和RHEL等。 Erlang的主要特点包括: ...
erlang-21.3-1.el7.x86_64.rpm rabbitmq基础语言环境。
erlang-20.3-1.el7.centos.x86_64.rpm
在标题中的"erlang-18.3-1.el7.centos.x86_64.zip",我们看到的是Erlang的一个特定版本,18.3,针对64位的CentOS 7操作系统(el7)的安装包。这个版本的Erlang包含了必要的组件和服务,使得它能够在CentOS 7上稳定...
erlang-24.0.3-1.el8.x86_64.rpm资源
erlang-sd_notify-1.0-2.el7.x86_64.rpm
erlang-erts-19.3.6.4-1.el7.x86_64.rpm
erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-20.3.8.17-1.el7.centos.x86_64
标题中的"erlang-19.0.4-1.el7.centos.x86_64.zip"揭示了我们讨论的是Erlang的一个特定版本——19.0.4,该版本针对的是Linux发行版CentOS 7的64位架构。Erlang的版本号通常包括主要版本号、次要版本号和补丁版本号,...
- 使用yum安装Erlang:`sudo yum install erlang-23.3.4.3-1.el7.x86_64.rpm` 2. **安装RabbitMQ**: - 下载RabbitMQ RPM包:`wget https://your_download_link/rabbitmq-server-3.8.17-1.el7.noarch.rpm` - ...
erlang-21.3.1-1.el7.x86_64.rpm
erlang-xmerl-22.3-1.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-19.0.4-1.el7.centos.x86_64.rpm ,官网的正式包
erlang-23.1-1.el8.x86_ ,erlang官网下载很慢,所以提供该下载链接。
https://github.com/rabbitmq/erlang-rpm.git源码在centos6.8x64系统下编译的rpm文件