说到concurrent,一般会想到Erlang和Go语言,这两种语言的主打特性都是concurrent,Erlang有着20多年的历史,是为简化开发电信大并发和高可靠性应用而发明的语言,Go是Google从2007年开始设计,2009年opensource出来的,Go属于一种system language,opensource的就算这两种语言吧,公司内私有的语言则有TNSDL,SDL的一个变种,以前写过一篇SDL和Erlang比较的文章(http://bookjovi.iteye.com/blog/1233299),这三种concurrent语言各有不同,下面看看:
1)语言设计
Erlang的实现基于虚拟机beam,Go是编译型语言,有着独成一体的compiler(不同于gcc,Go很好的解决了依赖的问题,所以编译go程序时不需向编译c程序那样指定include和library),TNSDL和GO类似,属于native执行。Erlang和TNSDL主要是为电信级应用服务的,而Go的concurrent则更具有通用性,这点主要体现在concurrent的设计,Erlang和SDL是基于process之间传递message,而Go是goroutine组成,再加上channel,Go通过把process和message解耦使得Go的设计更有通用性和灵活性,应用可以根据自己的需求决定是否需要channel的处理。routine加channel的设计在stackless python也有(有些人说Go = C + stackless Python),正是channel的灵活性使Go中不需要Erlang中的PID,Go中的go无返回值,Erlang中的spawn则返回PID。
Erlang没有对message buf进行控制,使用Go的channel则可控制channel的capacity,make(chan int, 100)
2)Library支持
Erlang有着20多年的历史,OTP中各种behavior,driver支持使得使用Erlang得心应手。Go的历史短得多,library仍有欠缺。
3)scheduler调度器
从实现的角度看Erlang中每个process都有自己的heap,所以无法共享内存,总体来说Erlang的scheduler与Linux kernel非常相似;Go和SDL属于native执行,这里主要讨论公平性的问题,Erlang中每个process有reduction,类似于Linux kernel中process的time slice,Go是native执行,那么Go的runtime是如何控制每个goroutine的公平性呢?答案是没有,native执行的goroutine无法像Erlang那样保证公平性,goroutine只能在syscall、io、channel read write操作时才能有机会重新执行schedule函数,以执行其余的goroutine。在concurrent语言中,如不能很好的解决公平调度和优先级调度是个很大的问题。
鉴于Go现在还不是太成熟,或许以后会有改进,scheduler和GC都有很多的讨论,现在scheduler的实现逻辑及其简单(G & M),与Erlang 调度器相比更是简单(里面有些bug,还有公平性的问题)。
Erlang scheduler位于:otp/erts/emulator/beam/erl_process.c
Go scheduler位于:go/src/pkg/runtime/proc.c
4)memory model 内存模型
Erlang中每个process有自己的heap,stack在heap的底部,这里的stack是Erlang process的stack,类似于Java中的操作数栈,stack向下增长,stack top如遇到heap top,则进行GC,GC后stack移到新的地方。
Go是native执行,goroutine的stack是segment stack,TNSDL的runtime也是使用这种segment stack,segment stack就是一个程序中有很多stack执行,stack的切换则通过setjmp,longjmp实现的。(setjmp和longjmp的一个主要应用就是concurrent,另一个是在C中模拟try catch)
5)GC垃圾回收
Erlang的GC属于分代算法,有个old heap,有minor gc和full sweep,总体来说和Java类似,只不过Erlang没有mark的过程,直接根据rootset找到所有Eterm放在新分配的heap的。
Go现在是mark-sweep,以后会使用IBM的低延时GC算法。
6)高可靠性
Erlang中有个builtin的高可靠性,如link和monitor机制。
Go是一个通用性的设计,虽没有built-in的link和monitor,goroutine则可使用defer来实现link的效果。
7)性能
Go的实际目标之一就是高性能,这也是为什么go是一种编译型语言。理论上分析goroutine的性能会好于Erlang的process,但软件设计原则中性能只是衡量标准之一而不是全部。
好了,话太多,就说到这里了,个人还是很喜欢Go的设计,未来程序语言的实际应该像go和Erlang那样扔掉mulitthreading的设计(Java,Python),同时channel的使用使得go的实际更具通用性和灵活性,这是concurrent语言被行业接受非常关键性的因素。
分享到:
相关推荐
孟岩谈Erlang:并行计算和云计算,详细介绍了新一代编程语言Erlang在并行计算和云计算方面的特性
Concurrent Programming in ERLANG
Many of the designations used by manufacturers and sellers to distinguish their prod- ucts are claimed as trademarks.Where those designations appear in this book,and The Pragmatic Programmers,LLC was ...
Erlang 高级原理和应用 并行编程 脚本语言
Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.
Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang Joe的那篇erlang论文 efficiecy guide
安装Erlang和RabbitMQ,linux系统下的哦,有红色字体标注!已踩坑
描述erlang的设计,非常实用,•原书名: Programming Erlang: Software for a Concurrent World
ErlangB和ErlangC计算工具(exe可执行文件+excel两个) ErlangB和ErlangC计算工具(exe可执行文件+excel两个)
The ideas in Erlang are difficult to trace to a single source. Many features of the language have been influenced and improved as a result of comments by our friends and colleagues of the Computer ...
rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang,rabbitmq和erlang
为了充分利用多核CPU的资源,利用并行计算来处理问题已逐渐成为主流。利用Erlang中的并行机制计算N-皇后问题,设计并实现...此外,由于Erlang本身具有数据处理上限只受硬件处理能力限制的特性,算法可扩展性也比较强。
Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适 合于构建分布式,实时软并行计算系统。 使用Erlang编写出的应用运行时...
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
java php python erlang 千万级内存数据性能比较,
从 Erlang 到 CERL 到 Golang
erlang 安装包
erlang-jose, Erlang和Elixir的JSON对象签名和加密( JOSE ) Erlang和Elixir的JSON对象签名和加密( JOSE ) 。安装将 jose 添加到 mix.exs 中的项目依赖项defp deps do [ {:jose, "~> 1.8"} ]