前言

最近在总结一些Erlang编程语言的基础知识,拟系统的介绍Erlang编程语言,从基础到进阶,然后再做Erlang编程语言有意思的库的分析。

其实,还是希望越来越多的人关注Erlang,使用Erlang,壮大Erlang编程语言的社区。

说实话,我也没这么高尚,就是看到很多人对Erlang编程语言的误解,Erlang编程语言社区的凋零,招个Erlang开发难之又难,才萌生此念。

这次主要介绍Erlang编程语言。包括Erlang的简要历史以及应用场景,Erlang并发编程,Erlang编程语言的特点,环境安装就一笔带过一下好了,最后,打算演示一个Wordcount的示例,一起来瞧瞧Erlang并发进程、分布式究竟长啥样。

Erlang简要历史以及应用场景

Erlang是咋来的?语法诡异,函数式,样子“丑”到很多人不喜欢用,但是为什么很多人又“吹嘘”Erlang(我就属于“吹嘘”那一票人)?

简要历史

Erlang出现在20世纪80年代中期,由瑞典电信设备制造商爱立信所管辖的实验室开发的。当时那一票大神级人物为了寻找适合下一代电信产品的编程语言,爱立信实验室花费了两年多的时间使用原型法测试了所有可能的编程语言,最终这些人发现,虽然当时现有的编程语言也有一些有趣和相关的特性,但是并没有一门独立的语言能包容电信行业所需要的所有特性。这一点让他们非常不爽。

那好吧,他们就决定开发一种全新的编程语言。

到了1996年,Erlang编程框架OTP诞生了,OTP给Erlang编程语言系统带来了结构化的框架和一套实现健壮性和容错性的工具和类库。然后时间到了1998年12月,爱立信决定将Erlang作为开源代码发布。1991年1月份的时候,Erlang编程语言官方网站总共大约只有36k个网页,10年后,达到了2800k。看起来,Erlang社区是在不断壮大(但是这发展速度,哎... 还是太忧桑)。

应用场景

虽然很多编程语言在开发之前并没有找到自己的定位,但是Erlang编程语言的定位非常明确,就是用来构建分布式容错大规模并发软实时系统。所以Erlang不仅被使用在电信行业,在多种领域内也取得了巨大的发展和使用。

  • IM/推送  :WhatsApp、Weibo私信
  • 广告数据:OpenX、AOL ad、Ptengine
  • 基础设施:Riak、Ejabberd、RabbitMQ、RDS
  • 金融支付:融易通、电银
  • 游戏:4399、明朝

如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凭借其出色的并发性、分布式容错性软实时等特点,得到了很多应用领域的青睐和大规模使用。

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这么屌了。

Erlang基础 -- 介绍 -- 历史及Erlang并发的更多相关文章

  1. Erlang基础 -- 介绍 -- Wordcount示例演示

    在前两个blog中,已经说了Erlang的历史.应用场景.特点,这次主要演示一个Wordcount的示例,就是给定一个文本文件,统计这个文本文件中的单词以及该单词出现的次数. 今天和群友们讨论了一个问 ...

  2. Erlang基础 -- 介绍 -- Erlang特点

    前言 Erlang是具有多重范型的编程语言,具有很多特点,主要的特点有以下几个: 函数式 并发性 分布式 健壮性 软实时 热更新 递增式代码加载 动态类型 解释型 函数式 Erlang是函数式编程语言 ...

  3. Erlang基础知识集锦

    http://wenku.baidu.com/link?url=or-8mkUYUM0uVeqCYESGe93YIlh2IDLP7lFOwRlwr8Syf3PeHbwJC5DPCErs4NFrb1p4 ...

  4. Erlang语言介绍

    Erlang (/ˈɜrlæŋ/ er-lang) is a general-purpose concurrent, garbage-collected programming language an ...

  5. [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1

         Erlang 增加 Maps数据类型并不是很突然,因为这个提议已经进行了2~3年之久,只不过Joe Armstrong老爷子最近一篇文章Big changes to Erlang掀起不小了风 ...

  6. Web服务基础介绍

    Web服务基础介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正常情况下的单次web服务访问流程 博主推荐阅读: https://www.cnblogs.com/yinzh ...

  7. Jmeter使用实践- 基础介绍

    Jmeter使用实践- 基础介绍 随着市场上推出越来越多的测试工具,大家使用起来也比较盲目,就我个人而言,使用过LoadRunner和Jmeter 很多人倾向于LoadRunner,因为LR的功能更强 ...

  8. [Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2

    声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.后续Maps可能会出现语法或函数API上的有所调整,特此说明. 前情提要: [Erlang 0116] 当我们谈论E ...

  9. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

随机推荐

  1. hbase learning

    万万没想到,促使我填坑的居然是学习HBase,之前听分享的时候知道它是一个kv型的数据库就没有多了解,现在才开始学习. hbase和bigtable很像,入门看起来也不太难#flag #下面是对于我看 ...

  2. BOOST编译方法

    Windowsbjam --toolset=msvc-9.0 --prefix=C:\vc9_boost\vc9 --build-type=complete link=static threading ...

  3. Gamma函数相关matlab代码

    1.Gamma函数: Gamma函数matlab代码: x=:0.5:5syms t y=)*exp(-t),,inf) y=double(y) plot(x,y,) 图像如下: 2.lgΓ(x)函数 ...

  4. ExtJS Ext.Ajax.request最好设为同步

    ExtJS 中Ext.Ajax.request最好设为同步,即async: false,因为如果Ajax后面需要用到Ajax更新的数据的话,设置同步,后面才能用到最新的数据. function Get ...

  5. numpy数组各种乘法

    In [34]: a Out[34]: array([[1, 4], [5, 6]]) In [35]: b Out[35]: array([[4, 1], [2, 2]]) In [36]: np. ...

  6. html笔记(1)

    hgroup 代替div figure figcaption 独立流内容 替代 dl mark 替代 span

  7. 需要记忆的几个sql语句

    链接查询: 1.查询两个表,在where中定义连接条件: select student.sno,sname,ssex,sage,sdept,cno,grade. from student,sc whe ...

  8. LeetCode OJ:Missing Number (丢失的数)

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...

  9. Python基础学习(第9天)

    第九课:动态类型 1.在Python中,有一类特殊的对象,是专门用来存储数据的,常见的有数字.字符串.数列.字典等.这些对象是存储在内存中的实体,我们并不能直接接触到它们,在程序中接触的是对象名,是指 ...

  10. 防止前端脚本JavaScript注入

    在使用ajax进行留言的时候,出现了一个问题.因为留言内容写完之后,通过ajax提交内容,同时使用js把留言的内容添加到页面上来.浏览留言的时候也是通过ajax请求,然后再显示的.这样,如果有人在留言 ...