Erlang编程语言最初目的是进行大型电信交换设备的软件开发,是一种适用于大规模并行处理环境的高可靠性编程语言。随着
多核处理器技术的日渐普及,以及
互联网、
云计算等技术的发展,该语言的应用范围也有逐渐扩大之势。
目标
Erlang是一种面向并发运行环境的通用编程语言。该语言由
爱立信公司在1986年开始开发。设计之初,Erlang的开发者着眼于找到一种适用于开发大型电信交换设备的编程语言,即达到以下目标:
大规模并发处理与分布式计算能力
同时处理大量的并发业务(例如同时处理上百万个电话呼叫);必须及时并在特定短的时间内完成业务处理;适用于大规模的分布式处理系统,并不断与硬件进行交互。
用于开发高可靠性、高质量的电信产品
连续数年的不间断运行;对软件系统所进行的维护操作(如配置修改、升级等)不会中比软件本身的运行;在硬件故障和软件错误发生时具有容错能力,严格地限制故障和错误所波及的范围。
适用于复杂的项目
用于超大规模的
软件开发项目(例如数百万行代码);所实现的软件能完成复杂的功能,各特性之间存在大量交互。
该语言随后在爱立信内部的若干
电信设备开发项目中得到应用,并逐步完善;1988年底Erlang成为开源语言(开源对爱立信的直接好处是:Erlang语言本身的维护与发展、相关的教育培训等投入不再由爱立信独自承担;在开源社区的看护下可以使Erlang更好地发展,同时爱立信也可以继续享受该语言的成果),但并不广为人知;近年来随着基于互联网的电子商务、即时通讯、云计算、大型网络游戏等应用的发展,以及多核处理器的逐渐兴起,Erlang在大规模并发处理能力和高可靠性方面的优势被越来越多的人所重视,其应用范围有逐渐扩大之势。
开发运行环境
Erlang语言可基于各主流操作系统开发与运行,包括Windows、
Unix、
Linux、
Mac OS、
VxWorks等等。
Erlang程序可以编译为虚拟机指令,由虚拟机解释执行(这一点类似于Java)。 Erlang语言所用的虚拟机被称为BEAM。
Erlang也可以直接编译为机器指令,直接在处理器运行(这一点类似于C/C++等)。
虚拟机方式和
机器指令运行方式在应用效果上的主要区别是:虚拟机方式运行效率较低,但编译后的程序指令占用内存空间较小;机器指令方式则反之。具体如何选择根据软件项目的实际需要而定。
作为一种开源的编程语言,相关的资源可在其社区网站(http: //www. erlang. org/)直接h载。可获得的下载资源包括一个被称为OTP (Open Telecom Platform)的一整套支撑平台,该平台包括大量的文档、库函数与组件、开发与调测工具,以及一个被称为Mnesia的分布式实时关系数据库(该数据库由Erlang开发;其数据访问语言是Erlang,而非通常关系数据库所用的SQL)。
特征机制
分布式运行环境
一个用Erlang开发的系统,其程序运行在一组被称为Erlang Node的物理节点上。可以用一个私有局域网内的若干台主机构成这些物理节点,也可以用通过使用TCP/IP套接字将更大范围中的物理节点连接起来组成一个系统。
基于编程语言本身的进程管理
Erlang语言本身支持进程概念。一个Erlang系统中通常运行大量的进程(在电信交换系统中同时存在数百万进程并不让人惊讶),每个进程运行在一个Erlang Node上并可以跨Node创建其它进程。通常建议每个进程只处理轻量级的任务;如果有较复杂的大型任务需要处理,则软件设计人员应设法将大型任务尽可能分解成较小的任务,这样做的目的是尽可能充分发挥大规模分布式系统中所有物理节点的处理能力。
用传统语言编程通常都会用到复杂的共享内存管理机制,这也是用传统语言编程的一个容易出错的方;Erlang的各进程之间则完全不
共享内存,进程之间的通信只通过异步消息来完成。
每个Erlang进程都有一个专用的邮箱用于接收消息。当接收到一个期望收到的异步消息则立刻处理之,否则将其缓冲并等到期望收到该消息时再处理。
每个进程的所有行为都是由所接收到的异步消息或时间定时器触发,运行过程中也不存在因等待共享内存使用权而产生的阻塞。
不共享内存也就避免了随之而来的出错机会;但所有进程间通信(特别是一个物理节点内的进程间通信)都需要通过异步消息进行,无疑也增加了通信所需的开销(主要是消息内容的拷贝),这是Erlang为提高可靠性而付出的代价。
基于进程机制的软件出错处理
Erlang提供了定义“相连”进程的机制,即在进程之间可定义“相连”关系,当一个进程因出错而死亡时,向所有与其有“相连”关系的进程报告自身的死亡信息;收到死亡信息的进程如果是普通进程(区别于系统进程),则也立刻死亡(一旦出错,所有相连进程全部死亡);系统进程则可进行出错信息记录等操作,然后继续运行。
基于双机备份的容错机制
一个考虑了容错设计的Erlang系统至少要包含2个节点,它们之间互相监视;当一个节点出错岩机(无论是软件原因还是硬件故障),其工作立即由另一个节点接替。
这种
容错机制背后的理念是:一旦一个
节点失效,则不再信任其能进行任何后续的故障处理;为保证容错,失效节点的职责必须立刻由其它节点接替。