原创作者: litaocheng   阅读:44245次   评论:29条   更新时间:2011-06-01    

<!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:UseFELayout /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->

进入Erlang的世界

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

现在,让我们迎接Erlang盛宴!

经历

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

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

20084月,通过各种资料的搜集,了解,我决定系统的学习Erlang

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

困惑

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

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

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)。

Erlang语言特性

简单小巧

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

Integerfloatatomreferencefunportpidbitstring

同时提供2种复合结构:tuplelist,这就是Erlang的所有数据类型。

模式匹配

Erlang的函数中,某些语法中,我们可以使用Pattern匹配,这是一个非常好的特性,我们可以让代码自己去决定如何执行

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

price(apple) -> 2.0;

price(banana) -> 1.2.

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

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

变量单次赋值

这个是一个匪夷所思的特性,变量竟然只能单次赋值!是的Erlang中变量一旦绑定某个数值以后,就不能再次绑定,这样做的好处是便于调试出错。当发生错误时,某个变量是什么就永远是什么,不用顺藤摸瓜的查找谁修改过它,省了好多事情。唯一的麻烦就是需要一个信的变量时,你必须再为它想一个名字。

丰富的libs

Erlang中提供丰富的libs

stdlib中包含大量的数据结构如listsarraydictgb_setsgb_treesetsdets

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

inets提供ftp clienthttp client/servertftp 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,用来进行单元测试。

灵活多样的错误处理

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

代码热替换

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

天生的分布式

Erlang天生适合分布式应用开发,其很多的BIF(内建函数,相API)都具有分布式版本,我们可以通过BIF在远程机器上创建Process,可以向远程机器上的某个Process发送消息。在分布式应用的开发中,我们可以像CC++,JAVA等语言一样,通过Socket进行通讯,也可以使用Erlang内嵌的基于Cookie的分布式架构,进行开发。当然也可以两者混合。分布式开发更加方便,快速。ErlangProcess的操作,Error的处理等都对支持分布式操作。

超强的并发性

由于采用其自身Process,而没有采用操作系统的进程和线程,我们可以创建大规模的并发处理,同时还简化了我们的编程复杂度。我们可以通过几十行代码实现一个并发的TCP服务器,这在其他语言中都想都不敢想!

多核支持

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

跨平台

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

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

开源

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

Erlang与外界的交互

Erlang可以与其他的语言进行交互,如CC++,Java。当然也有热心的朋友提供了与其他语言的交互,如果需要你也可以根据Erlang的数据格式,提供一个库,让Erang与您心爱的语言交互。

Erlang支持分布式开发,您可以创建一个C Node,其如同一个Erlang节点,前提是你遵照Erlang的规范。

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

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

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

嵌入式执行,通过Erlang平台加载,因此这是非常危险的,如果您的程序崩溃,没有任何理由,Erlang也会崩溃。

Erlang应用场景

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

Erlang也可以作为一种快速开发语言,进行原型开发。

Erlang的学习过程

<!--[if !supportLists]-->1.         <!--[endif]-->安装首先从Erlang官方网站,下载安装Erlanghttp://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的相关的英文资料也比较容易理解,还是那句话,别怕麻烦

Erlang开源项目

排名不分先后

  • couchdb     基于文档的数据库,拥有RestfulAPI,MVCC,View,诸多特性
  • ejabberd    性能出众,使用广泛的Jabber开源服务器
  • mochiweb    轻便,高效的HTTP应用框架
  • nitrogen    基于事件的Web开发框架
  • rabbitmq    中间服务器,实现AMQP协议
  • yaws        高效的web server
  • etorrent    Bittorrent客户端
  • Scalaris           分布式的key-value存储
  • disco       Map-Reduce框架,Erlang Python

遇到问题

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

订阅Erlangmaillisthttp://www.erlang.org/mailman/listinfo/erlang-questions),进行提问

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

Google中搜索答案

推荐阅读

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

推荐网站

http://www.erlang.org

http://erlang-china.org

http://www.planeterlang.org/

http://www.erlangplanet.org/

http://trapexit.org

 

评论 共 29 条 请登录后发表评论
29 楼 406656983 2012-04-01 13:28
相当不错的erlang,我们通信后台自从改成elrang后基本没出过什么大问题
28 楼 xlaohe1 2012-03-31 09:27
听说几百万进程都不高cpu的
27 楼 suu 2011-10-19 20:35
winstars 写道
这篇文章排版不错

哈哈。。楼主一定是经常写文档的
26 楼 lshhjxlj 2011-10-10 15:54
在学精JAVA语言之前,我是不会学其它语言的,无论它有多好、多美。
25 楼 acme_ltt 2011-10-05 00:16
坚持学,会有成果的,正在感受erlang带来的快乐和便利
24 楼 mj-beijing 2011-09-18 14:41
学过一段时间,没有认真静下心来学,就没再坚持看
23 楼 winstars 2011-06-13 16:10
这篇文章排版不错
22 楼 blues1021 2011-06-03 01:44
Erlang目前还没打算学习,不过长见识了;多谢楼主分享
21 楼 kangdiji 2011-04-02 17:29
应该不错吧,我正在学习Erlang哦。
20 楼 dengzhangtao 2010-12-09 13:06
认识了啥叫Erlang,
19 楼 Montagbissonntag 2010-07-23 13:16
Erlang这么出名了。
1909—1920年丹麦数学家、电气工程师爱尔朗(A.K.Erlang)用概率论方法研究电话通话问题,从而开创了这门应用数学学科,并为这门学科建立许多基本原则。他在热力学统计平衡理论的启发下,成功地建立了电话统计平衡模型,并由此得到一组递推状态方程,从而导出著名的埃尔朗电话损失率公式。
18 楼 smzd 2010-06-28 15:38
不错不错,为什么有人说是灌水呢?
17 楼 eood 2010-05-13 23:32
这位同学这么会灌水
16 楼 mryufeng 2010-04-06 03:08
Erlang最近的发展开始指数上升 得益于多处理期的支持和分布集群特性!

http://blog.yufeng.info
15 楼 approach 2010-03-25 19:16
14 楼 mryufeng 2010-02-26 20:44
非常好的入门文章, 照着学, 很快就入门...

http://blog.yufeng.info
13 楼 langzhe 2010-02-02 21:38
学习中 支持erlang
12 楼 lsb 2009-11-10 18:50
   有个朋友在使用,跟我介绍过这个东东,听说不错的,看了这篇文章有了新的认识,偶还在搞java,有机会看看。
11 楼 mryufeng 2009-10-11 16:04
vivimusing 写道
学erlang,我每天要靠滴眼药水来缓解疲劳!!!这代码太损眼了


你每天都学习erlang 还看不习惯?
10 楼 tf03172003 2009-05-03 13:09
听完作者介绍,感觉Erlang应该有很好的前景啊,
不知道在多大程度上能简化分布式系统开发,Attention
9 楼 cqu903 2009-03-30 22:33
正在熟悉一些erlang源代码,从Java过来,逐渐喜欢上erlang的语法和逻辑,强烈推弦大家看看“面对软件错误构建可靠的分布式系统”,erlang发明者的博士论文。
8 楼 whaosoft 2009-03-20 21:29
原来是爱立信的东西啊
7 楼 litaocheng 2009-03-05 10:41
vivimusing
我没有感觉到哦.习惯了感觉非常好!
6 楼 vivimusing 2009-02-21 23:29
学erlang,我每天要靠滴眼药水来缓解疲劳!!!这代码太损眼了
5 楼 whaosoft 2009-02-19 07:05
有机会我会去学习他
4 楼 bohemia 2009-02-10 09:40
有条理. ERlang值得关注.
3 楼 litaocheng 2009-02-09 21:27
:) 呵呵,谢谢夸奖~~
2 楼 andywu 2009-02-09 00:26
看上去很美。(文笔不错)

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics