Erlang/IoLanguage/Ruby

最近下决心和Erlang说再见了,想了很多,也用了一段时间,断断续续数落过几次Erlang的优缺点,看得不深,权当我是瞎说。简单整理一下:

优点:高并发、分布式、资源管理、高效率(和其它动态语言比较)、热升级、自动并行
缺点:语言抽象能力不强、语言扩展能力不强、FP让大多数人不适应、和C库交互不好

有一段时间我打算自己做一套类似的框架,使用coroutine,虽然我测试过的coroutine库都不如Erlang高效(注1),但C编写处理代码比Erlang高效多了,完全可以弥补。和C库的交互可以更自然地实现。我不打算做个多线程的调度器,因为有太多第三方库需要线程池、异步IO去完成的操作,这些也需要CPU,当然目前飞速发展的多核技术也不能完全忽视,这方面必须留下扩展的余地,但重点只是在调度器上。

原打算项目不忙的时候就开工,不过最近看到了IoLanguage,感觉也挺值得研究一下的。它还很年轻,对于第三方库的调用也没有很好地解决,但它的语法吸引了我。看一下它的addons库,还挺丰富,OpenGL/Image/Gui/XML/Network/Video/Database,各种库都有,对于一个年轻的语言来说够多了。IoLanguage最吸引我的是它的优雅的异步实现(用库而不是语言),没有关键字,这都证明了它本身是非常容易扩充的,它的Socket库更证明了这一点。

IoLanguage的缺点除了第三方库的调用以外,多核支持还没有,效率还很差,从诞生到现在还没有进行过大的性能提升。

IoLanguage给我的最大帮助是帮我从Erlang的并发中脱离出来,很长一段时间我的脑子都跟着Erlang的spawn在跑,即便我想用其它语言来实现类似的并发,我也会选想到spawn。从IoLanguage的学习中我认清了并发、异步的目的,我们的目的不是为了创建进程,只是为了让它脱离当前执行序列来并行执行,有时候我们不想取得它的执行结果,有时候又需要这个结果,Erlang没有对这种差异或者类似的层次进行抽象。Erlang在这方面走了个极端,创建进程很容易,但处理结果相对麻烦,pmap给了我很深的印象,但远不如IoLanguage的优雅。这主要是由于Erlang的语言抽象能力有限造成的。

Ruby很久没有使用了,自从接触Erlang,项目中又完全是C++以后,就远离它了。最近却突然感觉它的潜力还很大,1.9的性能大幅提升,加上强悍的扩展能力,完全可以代替IoLanguage,实现一套基于Fiber的并发库。

总之我现在觉得coroutine是并发的唯一出路,它能极大地简化并发和异步编程,仅为了并发就改变习惯使用另一种风格的语言,代价也非常大,所以Erlang不是我的选择,IoLanguage还不成熟,C++/Ruby还是可以尝试一下的。

这一年多在各种语言中游走了一圈,难道又要走回去了。。。

注1:
很多C版本的coroutine库不如erlang高效的原因在于,C版本的coroutine库都是使用栈跳转的,执行跳转的时候还是要保存一些上下文比如寄存器,而erlang/stackless python则本身不使用这种跳转方式,切换开销较小。

你可能感兴趣的:(多线程,编程,c,erlang,Ruby)