最近在总结一些Erlang编程语言的基础知识,拟系统的介绍Erlang编程语言,从基础到进阶,然后再做Erlang编程语言有意思的库的分析。
其实,还是希望越来越多的人关注Erlang,使用Erlang,壮大Erlang编程语言的社区。
说实话,我也没这么高尚,就是看到很多人对Erlang编程语言的误解,Erlang编程语言社区的凋零,招个Erlang开发难之又难,才萌生此念。
这次主要介绍Erlang编程语言。包括Erlang的简要历史以及应用场景,Erlang并发编程,Erlang编程语言的特点,环境安装就一笔带过一下好了,最后,打算演示一个Wordcount的示例,一起来瞧瞧Erlang并发进程、分布式究竟长啥样。
Erlang是咋来的?语法诡异,函数式,样子“丑”到很多人不喜欢用,但是为什么很多人又“吹嘘”Erlang(我就属于“吹嘘”那一票人)?
Erlang出现在20世纪80年代中期,由瑞典电信设备制造商爱立信所管辖的实验室开发的。当时那一票大神级人物为了寻找适合下一代电信产品的编程语言,爱立信实验室花费了两年多的时间使用原型法测试了所有可能的编程语言,最终这些人发现,虽然当时现有的编程语言也有一些有趣和相关的特性,但是并没有一门独立的语言能包容电信行业所需要的所有特性。这一点让他们非常不爽。
那好吧,他们就决定开发一种全新的编程语言。
到了1996年,Erlang编程框架OTP诞生了,OTP给Erlang编程语言系统带来了结构化的框架和一套实现健壮性和容错性的工具和类库。然后时间到了1998年12月,爱立信决定将Erlang作为开源代码发布。1991年1月份的时候,Erlang编程语言官方网站总共大约只有36k个网页,10年后,达到了2800k。看起来,Erlang社区是在不断壮大(但是这发展速度,哎... 还是太忧桑)。
虽然很多编程语言在开发之前并没有找到自己的定位,但是Erlang编程语言的定位非常明确,就是用来构建 分布式 、 容错 、 大规模并发 的 软实时 系统。所以Erlang不仅被使用在电信行业,在多种领域内也取得了巨大的发展和使用。
如IM/推送领域,广告数据领域,基础设施,金融支付,还有游戏。
被Facebook花了190亿刀收购的whatsapp主要用的就是Erlang,ejabberd、rabbitmq在Erlang圈也是非常出名的框架级别应用。
国内做IM/推送的公司就有点多了,北京圈,weibo私信、环信、国美,深圳的云巴,据不完全统计,我知道的就有10家左右。广告数据领域,国外有OpenX,AOL Ad,国内有ptengine(我东家,嗯,来做个广告,ptengine.com),adsage。Erlang的分布式特性使构建大规模的分布式系统变成非常方便。在基础设施中,Riak作为非常出名的NOSQL,主要就是用Erlang来开发的,国内的Erlang大神余锋也是用Erlang来开发RDS。在国内的金融支付领域,融易通和上海电银,几乎是Erlang在国内发展的倡导者,为国内培养了一大票Erlang程序员。
瞧瞧,瞧瞧,Erlang凭借其出色的并发性、 分布式 、 容错性 、 软实时 等特点,得到了很多应用领域的青睐和大规模使用。
先大致说一下并发和并行的基本概念和简要区别。
现在很多人言必称“并发”,反正,在整理这篇blog之前我对并发和并行的区别是有点模糊的。
在日常生活中,并发和并行几乎表示的是同一个意思,但是在编程语言中,就精确区分一下吧。
并发的概念是什么?
在计算机操作系统中,并发指的是在一个 时间间隔内 有几个程序都处于已经启动运行到结束运行之间,且这几个程序都是在同一个处理机上被运行的,但是任意一个时刻点上只有一个程序在处理机上被运行。并发有三个特征:
并行是什么?
在汉语的理解中,并行是指并排行走或者是同时实行或实施,在操作系统中,并行指的是一组程序按照独立异步的方式执行,不等于时间上的重叠。当操作系统有两个或两个以上的CPU时,其中一个CPU执行一个线程(或进程)操作,另一个CPU可以执行另一个线程(或进程)操作,两个线程(或进程)互不抢占CPU资源,可以同时进行,这种方式就被称为并行。并行常见于高性能计算,像龙芯什么的超算、流体力学高性能计算什么的。
区别?
并发和并行,即是相似但又有区别的两个概念,并行指的是两个或多个事件在同一个时刻点发生;而并发指的是两个或多个事件在同一个时间间隔内发生。如果只有一台单核计算机,是无法在计算机上执行并行程序的,因为计算机只有一个CPU,而每次只能做一件事。然而,可以在单核计算机上执行并发程序,计算机可以在不同的任务之间分享计算机CPU事件。
并发的好处?
并发能够给我们带来很多好处,可以提升我们系统的性能,创建可扩展和容错的系统。
首先带来的好处是提升系统的性能,设想有两个任务,任务A需要10秒的执行时间,任务B需要15秒得执行时间,如果只是在单个CPU上执行任务A和任务B,需要的时间就有25秒。但是如果是在有两个CPU的计算机上,任务A和任务B的需要得执行时间就只有15秒。如果要实现这样的性能提升,就需要并发程序。现在已经是多核计算机的时代,平时用的个人电脑都是多核,而8核CPU已经成为服务器的基本标配,32核心、64核心的计算机也已经不是什么稀罕的配置。而并发程序能够更好的利用多核CPU,最大限度的提升系统的性能。
第二是可扩展性,并发程序一般由多个小型独立的进程组成,所以,增加进程数量和添加更多的计算机CPU就能够轻松的扩展系统。
第三,能够使系统更加清晰。在现实世界,很多事物都是并发的,但是大多数编程语言中的事物都是顺序发生的。现实世界得并行和编程语言中的顺序性之间的不同,就带来了诸多麻烦。在Erlang编程语言中,可以直观地将现实世界的并行性映射到Erlang的并发性上,也就能够让程序代码甚至是架构变得清晰并且易于理解。
在Erlang编程语言中,Erlang进程是并发并且独立执行的。首先在Erlang编程语言中,Erlang进程是有别于操作系统进程的。Erlang的进程是非常轻量的,它有自己的堆栈空间。并且Erlang进程之间是相互独立的,也就是说,每一个Erlang进程都有单独属于自己得堆栈空间,并且完全是私有的,两个Erlang进程之间的堆栈空间不会被共享。如果两个Erlang进程需要进行通信,那么就只能使用发送消息的方式。所以,在Erlang进程的堆空间上就需要有一块区域作为Erlang进程通信的消息邮箱。
上图是Erlang进程堆栈结构的示意图,从图中,我们可以看出,Erlang系统中的每一个进程,都有自己单独的PCB结构,栈空间,已经堆空间。因为Erlang进程轻量的特性,在系统中,就可以维护非常多的Erlang进程,这也是和操作系统进程最大的一个区别。数量众多的Erlang进程,在Erlang虚拟机的调度下,能够尽可能的利用多核计算机,进而为系统提供并发性。
最后一点需要注意是,Erlang编程语言的并发性,是由Erlang虚拟机提供的,不是操作系统,同样也不是外部库。 Erlang编程语言是运行在虚拟机上的,所以它的并发性在所有得操作系统上都有相同的工作方式。
Erlang在国内外使用非常广泛,国内很多团队都属于自己用着爽,国外相对比较“激进”。
参考:
1、Characterizing the scalability of Erlang VM
2、Erlang的几本书
下一篇会重点解释Erlang编程语言的特点,并发进程、分布式,别激动,很快。然后就会发现,为啥Erlang这么屌了。