赛锐xai:多核危机:Scala vs Erlang

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 09:53:34
Steve Vinoski这样写到:

提供互不共享的轻量级进程架构将使得大规模并发能力变得十分容易,但这并不意味着一旦你设计好了,剩下的就只是编程的工作那么简单。

Erlang采取了这样的并发方式。一个Erlang进程是非常轻量化的,Erlang应用常常拥有成千上万的线程甚至更多。

Scala通过基于事件的Actor从另一方面达到了同样的效果。Yariv Sadan解释说:

Scala有两种类型的Actor:基于线程或是基于事件。基于线程的Actor在重量级的OS线程内部执行。它们从不相互阻塞,但每个VM上可伸缩的Actor不会多于几千个。基于事件的Actor是简单的对象。它们是十分轻量化的,并且,像Erlang进程一样,因此它们可以在一台现代的机器上数以百万计的产生。

Yariv解释到,尽管如此,这里面也还是有一些区别的:

与Erlang进程的区别之处在于,每个OS线程内部,基于事件的Actor是顺序执行的并且使用没有强占式调度算法。这使得一个基于事件的Actor可能在很长一段时间内阻塞其OS线程(甚至是无限的)。

不可变性

Erlang是一门函数式语言。这意味着其数据是不可变的,像Java的String一样,并且没有副作用带来的风险。对数据的任意操作会产生一个该数据新的修改后的版本,但原数据仍然不变。在谈到健壮性的时候,不可变性是其需要高度注意的一个因素,因为没有代码可以无意间修改其它代码依赖的数据,但从并发的观点来看,不可变性也是一个十分重要的特性。如果数据不可变,其被两个并行执行路径更改的风险就不存在,因为没有办法改变它且不需要保持同步,所以数据可以被拷贝到其它机器上。 特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系.

因为Scala构建在JVM之上,结合了面向对象和函数式方法的特点,它不具备像纯函数式语言的不可变性的保证。然而,在Yariv日志的评论部分,Yariv和David Pollack就这两门语言之间的差别展开了一场有趣的讨论。David,ScalaWeb框架Lift的作者,给出了他对于不可变性的看法:

不可变性 —— Erlang强制了这一点,而且你几乎无法绕过它。但是,与强制一个单一类型相比,你可以用Scala神奇强大的类型系统的剩余部分去交换。我在进行Scala Actor编码时使用不可变数据,而让Scala的类型系统负责其它类型。
Yariv问到:

只发送不可变类型难道不是一个重大限制吗?这意味着,例如,你不能从Hibernate装载一个简单的bean并将它发送给其它Actor。
David回答到:

我曾基于Scala的Actor构建个多个生产系统。实际上对于不可变性问题并没有多少工作需要处理。你只需要将你的相关类(消息)定义为不可变的,其它的就不用管了。

类型系统

Erlang是动态类型的,而Scala是静态类型的并且相比Java有着更强的类型系统。然而,与Java相比最大的一个区别是Scala可以类型推断。这意味着你可以省掉大部分的类型注解,使得代码更加干净而编译器照样会做所有的检查。 版权申明:本站文章均来自网络,如有侵权,请联系028-86262244-215,我们收到后立即删除,谢谢!

关于动态与静态系统之间孰是孰非的争论看来永远也不会停止,但Erlang和Scala之间却有着显而易见的区别。

尾递归或是循环

Yariv又提到:

函数式编程与递归从来都是形影不离的。实际上离开了尾递归你很难写出有用的Erlang程序,那是因为Erlang没有循环——它对一切都使用递归(这在我看来是一件好事 :))。
这显然使得Erlang与Scala产生了很大差别。Scala提供了很多更传统的迭代,但David Pollack并没看出在这种环境下尾递归有什么优势:

尾递归——对基于事件的Actor来说根本不是什么问题。
如此说来,这仅仅有关你的偏爱和风格罢了。

热交换代码

由于Erlang是为可靠性而生的,热交换代码(运行时替换代码)是其内建的天性。

 

版权申明:本站文章均来自网络,如有侵权,请联系028-86262244-215 ,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。