Erlang不能错过的盛宴

  • 1,546 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,546
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
59
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Erlang不能错过的盛宴 (快步进入 Erlang 的世界) 作者:成立涛 (litaocheng@gmail.com) v1.0 作为程序员,我们曾经闻听很多“业界动态”“技术革新” , ,曾经接触很多“高手箴言”,“权威推荐” 。这些正确与否,都已成过去! 现在,让我们迎接 Erlang 盛宴!经历 2007 年 11 月在 koders.com 搜索代码时,发现*.erl 格式的源文件,感叹开发语言的花样百出,此时,我觉得 erlang 是一个丑陋的小家伙,看名字就没有对它提起多少兴趣。 2008 年初的时候,公司的项目开发中,我有缘认识了 ejabberd,一个采用 Erlang 开发的开源 jabber 服务器。我开始为其诱人的特性所倾倒。是时候认真看看 Erlang 到底什么样了! 2008 年 4 月,通过各种资料的搜集,了解,我决定系统的学习 Erlang。 今天,通过 4 个月的认真学习,我已经熟悉了 Erlang,已经在使用 Erlang 开发项目。作为 C++程序员,我不敢妄自使用“熟悉”“精通”之类的字眼,但是对于 Erlang 我可以 ,很负责任的说,Erlang 很巧,很强大!困惑 面对一个新的事务,我们本性都会充满好奇,可是作为程序员,很多时候对于新的语言我都充满了抵触:这个新东西值得学习么?它会不会让我抛弃我的旧爱?它文档丰富么?其是不是很难理解?它的前景如何?...等等,相信大家跟我有一样的苦恼。 但是,请听我说!我们是程序员,我们走在技术革新的最前沿。用户的产品,体验是通过我们来产生!我们不能畏缩不前,我们的固步自封,就是我们的公司,乃至整个我们的行业的停滞不前!口号可能有些响亮,但是认真思考,我相信朋友们一定有所感悟。
  • 2. 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 种基本的数据类型:Integer、float、atom、reference、fun、port、pid、bitstring
  • 3. 同时提供 2 种复合结构:tuple,list,这就是 Erlang 的所有数据类型。模式匹配 在 Erlang 的函数中,某些语法中,我们可以使用 Pattern 匹配,这是一个非常好的特性,我们可以让代码自己去决定如何执行 :比如,我们定义一个函数,其告诉我们某种水果的价格:price(apple) -> 2.0;price(banana) -> 1.2.我们随后调用 price(Fruit),会根据 Fruit 变量的内容返回具体的价格。这样做的好处就是节省了我们的代码量,我们不用 if...else…或者 switch…case 的来伺候了。也便于代码的扩展:加一个新的水果品种,我们只需要加一行就可以了。 学习 Erlang 一个非常重要的内容就是模式匹配,但是请不要混淆,这个匹配和正则表达式没有任何干系。变量单次赋值 这个是一个匪夷所思的特性,变量竟然只能单次赋值!是的 Erlang 中变量一旦绑定某个数值以后,就不能再次绑定,这样做的好处是便于调试出错。当发生错误时,某个变量是什么就永远是什么,不用顺藤摸瓜的查找谁修改过它,省了好多事情。唯一的麻烦就是需要一个信的变量时,你必须再为它想一个名字。丰富的libs Erlang 中提供丰富的 libsstdlib 中包含大量的数据结构如 lists,array,dict,gb_sets,gb_trees,ets,dets 等mnesia 提供一个分布式的数据库系统inets 提供 ftp client,http client/server,tftp client/servercrypto 提供加密解密相关函数,基于 openssl 相关实现ssl 实现加密 socket 通信,基于 openssl 实现ssh 实现 ssh 协议
  • 4. 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中提供一般语言所提供的 exception, try…catch 等语法, catch, 同时 Erlang 支持 Link 和 Monitor两种机制,我们可以将 Process 连接起来,让他们组成一个整体,某个 Process 出错,或推出时,其他 Process 都具有得知其推出的能力。而 Monitor 顾名思义,可以用来监控某个Process,判断其是否退出或出错。所有的这些 Erlang 都提供内在支持,我们快速的开发坚固的产品,不在是奢望。代码热替换 你的产品想不间断的更新么?Erlang 可以满足你这个需求,Erlang 会在运行时自动将旧的模块进行替换。一切都静悄悄。天生的分布式 Erlang 天生适合分布式应用开发,其很多的 BIF(内建函数,相 API)都具有分布式版本,我们可以通过 BIF 在远程机器上创建 Process,可以向远程机器上的某个 Process 发送消息。在分布式应用的开发中,我们可以像 C、C++,JAVA 等语言一样,通过 Socket 进行
  • 5. 通讯,也可以使用 Erlang 内嵌的基于 Cookie 的分布式架构,进行开发。当然也可以两者混合。分布式开发更加方便,快速。Erlang 的 Process 的操作,Error 的处理等都对支持分布式操作。超强的并发性 由于采用其自身 Process,而没有采用操作系统的进程和线程,我们可以创建大规模的并发处理,同时还简化了我们的编程复杂度。我们可以通过几十行代码实现一个并发的 TCP服务器,这在其他语言中都想都不敢想!多核支持 Erlang 让您的应用支持多个处理器,您不需要为不同的硬件系统做不同的开发。采用Erlang 将最大限度的发挥你的机器性能。跨平台 如同 JAVA 一样,Erlang 支持跨平台(其目前支持 linux,mac,windows 等 19 种平台),不用为代码的移植而头疼。我们仅仅需要了解平台的一些特性,对运行时进行优化。开源 开源是我非常喜欢的一个词汇,开源意味这更加强壮,更加公开,更加的追求平等。开源会让 Erlang 更好。Erlang与外界的交互 Erlang 可以与其他的语言进行交互,如 C、C++,Java。当然也有热心的朋友提供了与其他语言的交互,如果需要你也可以根据 Erlang 的数据格式,提供一个库,让 Erang 与您心爱的语言交互。 Erlang 支持分布式开发,您可以创建一个 C Node,其如同一个 Erlang 节点,前提是你遵照 Erlang 的规范。
  • 6. 当然最常用的交互还是再同一个 Node 上,比如我们要调用某个 lib,调用一些系统提供的功能,这时候主要有两种方式:Port 和嵌入式执行。 Port 是 Erlang 最基本的与外界交互的方式,进行交互的双方通过编码,解码,将信息以字节流的方式进行传递。(具体这个通道的实现方式,根据操作系统的不同而不同,比如unix 环境下,采用 PIPE 实现,理论上任何支持对应 Port 通道实现的语言都可以与 Erlang 进行交互)。Erlang 为了方便 C 和 JAVA 程序员,提供了 Erl_Interface 和 Jinterface。 采用 Port,您的代码在 Erlang 的平台之外运行,其崩溃不会影响 Erlang。嵌入式执行,通过 Erlang 平台加载,因此这是非常危险的,如果您的程序崩溃,没有任何理由,Erlang 也会崩溃。Erlang应用场景分布式产品,网络服务器,客户端,等各种应用环境。Erlang 也可以作为一种快速开发语言,进行原型开发。Erlang的学习过程1. 安装首先从Erlang官方网站,下载安装Erlang(http://www.erlang.org/download.html)linux:获取源代码,根据说明编译;windows:直接安装2. 认真阅读《programming erlang》 (中文版图书已经问世),并不断动手练习书中的例程。3. 遇到问题时,不要退却,坚持下去找到解决办法4. 对语言熟悉时,浏览一些好的开源项目5. 有信心时,开始动手做一个小项目6. 不间断的与大家交流,共同提高可能遇到的困难:a) 对于语法的不适应? 坚持看下去,代码继续写下去,我相信 1 个月,你会喜欢上 Erlang 的语法b) 有些数据类型不清楚? 认真看资料,或者询问朋友,比如我c) 中文资料的缺乏? Erlang 中文的资料会越来越多,此外,Erlang 的相关的英文资料也比较容易理解,还是
  • 7. 那句话,别怕麻烦Erlang开源项目 排名不分先后  disco Map-Reduce框架,Erlang + Python  ejabberd 性能出众,使用广泛的Jabber开源服务器  mochiweb 轻便,高效的HTTP应用框架  rabbitmq 中间服务器,实现AMQP协议  yaws 高效的web server  etorrent Bittorrent客户端  Scalaris 分布式的key-value存储遇到问题参看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 中搜索答案推荐阅读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.orghttp://trapexit.org (国内封锁,可以使用http://trapexit.org.nyud.net:8080/ 或其他代理登录)http://toquick.com http://blog.socklabs.com/ http://www.planeterlang.org/