[转]Erlang不能错过的盛宴

Erlang不能错过的盛宴

(快步进入Erlang的世界)html

做者:成立涛 (litaocheng@gmail.com)linux

做为程序员,咱们曾经闻听不少“业界动态”,“技术革新”,曾经接触不少“高手箴言”,“权威推荐”。这些正确与否,都已成过去!程序员

如今,让咱们迎接Erlang盛宴!web

1、经历

2007年11月在koders.com搜索代码时,发现*.erl格式的源文件,感叹开发语言的花样百出,此时,我以为erlang是一个丑陋的小家伙,看名字就没有对它提起多少兴趣。正则表达式

2008年初的时候,公司的项目开发中,我有缘认识了ejabberd,一个采用Erlang开发的开源jabber服务器。我开始为其诱人的特性所倾倒。是时候认真看看Erlang到底什么样了!数据库

2008年4月,经过各类资料的搜集,了解,我决定系统的学习Erlang。apache

今天,经过4个月的认真学习,我已经熟悉了Erlang,已经在使用Erlang开发项目。做为C++程序员,我不敢妄自使用“熟悉”,“精通”之类的字眼,可是对于Erlang我能够很负责任的说:Erlang很巧,很强大!编程

2、困惑

面对一个新的事务,咱们本性都会充满好奇,但是做为程序员,不少时候对于新的语言咱们都充满了抵触:这个新东西值得学习么?它会不会让我抛弃旧爱?它文档丰富么?是否是很难理解?它的前景如何?······相信你们跟我有同样的苦恼。windows

可是,请听我说!咱们是程序员,咱们走在技术革新的最前沿。用户的产品,体验是经过咱们来产生!咱们不能畏缩不前,咱们的固步自封,就是咱们的公司,乃至整个行业的停滞不前!口号可能有些响亮,可是认真思考,我相信朋友们必定有所感悟。服务器

3、Erlang是什么

Erlang是什么是咱们最早要面对的问题,只有清楚了它是什么,咱们才能作出咱们的决定。可见这个问题的重要性,它决定了不少读者是否会继续看下去!很是紧张。

Erlang最初是爱立信为开发电信相关产品而产生。

Erlang是一种面向并发(Concurrency Oriented),面向消息(Message Oriented)的函数式(Functional)编程语言。

面向并发说明Erlang支持大规模的并发应用,咱们能够在应用中处理成千上万的并发,而不相互影响。面向消息,实际上是为并发服务!咱们应该都熟悉多线程,熟悉加锁解锁操做,熟悉可能出现的资源竞争与死锁。在Erlang的世界里,咱们能够将轻轻的抹去这些使人苦恼的词汇。Erlang的世界,每一个处理都是独立的个体,他们之间的交互仅仅靠消息!所以不会有死锁,不会有那种痛苦的编程经历。

Erlang中一个很是重要的名词:Process,也就是咱们前面提到的“个体”。它不是咱们操做系统中的进程,也不是线程。它是Erlang提供给咱们的超级轻量的进程。为了适应大规模并发的特性,Process须要可以快速建立,快速销毁。Process之间通讯的惟一方法就是消息,咱们只要知道一个Process的名字即pid,就能够向其发送消息。Process也能够在任什么时候候,接收消息。咱们这样作只有一个目的:让咱们的系统更加简单,用一种朴素的作法,实现一个高效的语言。

Erlang是种函数式编程语言,对此我没有很深入的理解,最明显的特征就是,Erlang中处处都是函数,函数构成了咱们的产品的主体,把这些函数放到一个个的Process中去,让他们运行起来,那么就组成了咱们朝气蓬勃的产品。

Erlang支持对数据的位操做,拥有丰富的数据持久化机制。

同时须要说明的是Erlang内建垃圾回收机制(GC)。

4、Erlang的语言特性

1.简单小巧

Erlang中只有8种基本的数据类型:

integer、float、atom、reference、fun、port、pid、bitstring

同时提供2种复合结构:tuple,list,这就是Erlang的全部数据类型。

2.模式匹配

在Erlang的函数中,某些语法中,咱们可使用Pattern匹配,这是一个很是好的特性,咱们可让代码本身去决定如何执行 :

好比,咱们定义一个函数,其告诉咱们某种水果的价格:

price(apple) ->2.0;

price(banana) ->1.2.

咱们随后调用 price(Fruit),会根据Fruit变量的内容返回具体的价格。这样作的好处就是节省了咱们的代码量,咱们不用if...else…或者switch…case的来伺候了。也便于代码的扩展:加一个新的水果品种,咱们只须要加一行就能够了。

学习Erlang一个很是重要的内容就是模式匹配,可是请不要混淆,这个匹配和正则表达式没有任何干系。

3.变量单次赋值

这个是一个匪夷所思的特性,变量居然只能单次赋值!是的Erlang中变量一旦绑定某个数值之后,就不能再次绑定,这样作的好处是便于调试出错(更深层次的缘由是Erlang为并发设计,若是变量能够修改,那么就涉及到资源的加锁解锁等问题),当发生错误时,某个变量是什么就永远是什么,不用顺藤摸瓜的查找谁修改过它,省了好多事情。惟一的麻烦就是须要一个信的变量时,你必须再为它想一个名字。

4.丰富的libs

Erlang中提供丰富的libs

stdlib中包含大量的数据结构如lists,array,dict,gb_sets,gb_trees,ets,dets等

mnesia提供一个分布式的数据库系统

inets提供ftp client,http client/server,tftp client/server

crypto 提供加密解密相关函数,基于openssl相关实现

ssl 实现加密socket通讯,基于openssl实现

ssh 实现ssh协议

xmerl 实现XML相关解析

snmp 实现SNMP协议(Simple Network Management Protocol)

observer 用来分析与追踪分布式应用

odbc 使Erlang能够链接基于SQL的数据库

orber 实现CORBA对象请求代理服务

os_mon 提供对操做系统的监控功能

dialyzer提供一个静态的代码或程序分析工具

edoc 依据源文件生成文档

gs 能够为咱们提供某些GUI的功能(基于Tcl/Tk)

还有不少朋友提供了一些开源的lib,好比eunit,用来进行单元测试。

5.灵活多样的错误处理

Erlang最初为电信产品的开发,这样的目的,决定了其对错误处理的严格要求。Erlang中提供通常语言所提供的exception,catch,try…catch等语法,同时Erlang支持Link和Monitor两种机制,咱们能够将Process链接起来,让他们组成一个总体,某个Process出错,或推出时,其余Process都具备得知其推出的能力。而Monitor顾名思义,能够用来监控某个Process,判断其是否退出或出错。全部的这些Erlang都提供内在支持,咱们快速的开发坚固的产品,不在是奢望。

6.代码热替换

你的产品想不间断的更新么?Erlang能够知足你这个需求,Erlang会在运行时自动将旧的模块进行替换。一切都静悄悄。

7.天生的分布式

Erlang天生适合分布式应用开发,其不少的BIF(内建函数,相API)都具备分布式版本,咱们能够经过BIF在远程机器上建立Process,能够向远程机器上的某个Process发送消息。在分布式应用的开发中,咱们能够像C、C++,JAVA等语言同样,经过Socket进行通信,也可使用Erlang内嵌的基于Cookie的分布式架构,进行开发。固然也能够二者混合。分布式开发更加方便,快速。Erlang的Process的操做,Error的处理等都对支持分布式操做。

8.超强的并发性

因为采用其自身Process,而没有采用操做系统的进程和线程,咱们能够建立大规模的并发处理,同时还简化了咱们的编程复杂度。咱们能够经过几十行代码实现一个并发的TCP服务器,这在其余语言中都想都不敢想!

9.多核支持

Erlang让您的应用支持多个处理器,您不须要为不一样的硬件系统作不一样的开发。采用Erlang将最大限度的发挥你的机器性能。

10.跨平台

如同JAVA同样,Erlang支持跨平台(其目前支持linux,mac,windows等19种平台),不用为代码的移植而头疼。

咱们仅仅须要了解平台的一些特性,对运行时进行优化。

11.开源

开源是我很是喜欢的一个词汇,开源意味这更增强壮,更加公开,更加的追求平等。开源会让Erlang更好。

5、Erlang与外界的交互

Erlang能够与其余的语言进行交互,如C、C++,Java。固然也有热心的朋友提供了与其余语言的交互,若是须要你也能够根据Erlang的数据格式,提供一个库,让Erang与您心爱的语言交互。

Erlang支持分布式开发,您能够建立一个C Node,其如同一个Erlang节点,前提是你遵守Erlang的规范。

固然最经常使用的交互仍是再同一个Node上,好比咱们要调用某个lib,调用一些系统提供的功能,这时候主要有两种方式:Port和嵌入式执行。

Port是Erlang最基本的与外界交互的方式,进行交互的双方经过编码,解码,将信息以字节流的方式进行传递。(具体这个通道的实现方式,根据操做系统的不一样而不一样,好比unix环境下,采用PIPE实现,理论上任何支持对应Port通道实现的语言均可以与Erlang进行交互)。Erlang为了方便C和JAVA程序员,提供了Erl_Interface和Jinterface。

采用Port,您的代码在Erlang的平台以外运行,其崩溃不会影响Erlang。

嵌入式执行,经过Erlang平台加载,所以这是很是危险的,若是您的程序崩溃,没有任何理由,Erlang也会崩溃。

6、Erlang应用场景

分布式产品,网络服务器,客户端,等各类应用环境。

Erlang也能够做为一种快速开发语言,进行原型开发。

7、Erlang的学习过程

<!--[if !supportLists]-->1.        <!--[endif]-->安装首先从Erlang官方网站,下载安装Erlang(http://www.erlang.org/download.html

linux:获取源代码,根听说明编译;windows:直接安装

<!--[if !supportLists]-->2.        <!--[endif]-->认真阅读《programming erlang》(中文版图书已经问世),并不断动手练习书中的例程。

<!--[if !supportLists]-->3.        <!--[endif]-->遇到问题时,不要退却,坚持下去找到解决办法

<!--[if !supportLists]-->4.        <!--[endif]-->对语言熟悉时,浏览一些好的开源项目

<!--[if !supportLists]-->5.        <!--[endif]-->有信心时,开始动手作一个小项目

<!--[if !supportLists]-->6.        <!--[endif]-->不间断的与你们交流,共同提升

可能遇到的困难:

<!--[if !supportLists]-->a)        <!--[endif]-->对于语法的不适应?

坚持看下去,代码继续写下去,我相信1个月,你会喜欢上Erlang的语法

<!--[if !supportLists]-->b)       <!--[endif]-->有些数据类型不清楚?

认真看资料,或者询问朋友,好比我

<!--[if !supportLists]-->c)        <!--[endif]-->中文资料的缺少?

Erlang中文的资料会愈来愈多,此外,Erlang的相关的英文资料也比较容易理解,仍是那句话,别怕麻烦

8、Erlang开源项目

排名不分前后

  • couchdb     基于文档等非结构化数据的数据库,提供HTTP接口
  • disco       Map-Reduce框架,Erlang + Python
  • ejabberd    性能出众,使用普遍的Jabber开源服务器
  • mochiweb    轻便,高效的HTTP应用框架
  • rabbitmq    中间服务器,实现AMQP协议
  • yaws        高效的web server
  • etorrent    Bittorrent客户端
  • scalaris      分布式的key-value存储

9、遇到问题

参看Erlang官方文档 http://www.erlang.org/doc/

订阅Erlang的maillist(http://www.erlang.org/mailman/listinfo/erlang-questions),进行提问

在Nabble提供的Erlang maillist存档中搜索(http://www.nabble.com/Erlang-f14095.html

Google中搜索答案

10、推荐阅读

Erlang Design Principles (http://www.erlang.org/doc/design_principles/part_frame.html

Erlang Efficiency Guide (http://www.erlang.org/doc/efficiency_guide/part_frame.html

Erlang Programming Rules (http://www.erlang.se/doc/programming_rules.shtml

11、推荐网站

http://www.erlang.org

http://erlang-china.org

http://trapexit.org (国内封锁,可使用http://trapexit.org.nyud.net:8080/或其余代理登陆)

http://toquick.com

http://blog.socklabs.com/

http://www.planeterlang.org/