`
bluky999
  • 浏览: 720277 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一位Erlang程序员的自白

阅读更多

 一位Erlang程序员的自白

Erlang 不能错过的盛宴

(快步进入 Erlang 的世界)

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

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

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

一、经历

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

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

2008 4 月,通过各种资料的搜集,了解,我决定系统的学习 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 的语言特性

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 更好。

五、 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 也会崩溃。

六、 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 的相关的英文资料也比较容易理解,还是那句话,别怕麻烦

八、 Erlang 开源项目

排名不分先后

  • couchdb     基于文档等非结构化数据的数据库,提供HTTP 接口
  • 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.org

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

http://toquick.com

http://blog.socklabs.com/

http://www.planeterlang.org/

发表于 @ 2008年11月07日 16:25:00

分享到:
评论
1 楼 luyuwww 2014-03-17  

相关推荐

    程序员开发erlang的资料

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson为了实现分布式高可用系统而设计。在IT行业中,Erlang因其在处理大规模并发连接和容错能力上的优秀表现,被广泛应用于通信、金融以及互联网等...

    ErlangOTP并发编程实战

    《erlang/otp并发编程实战》侧重生产环境下的erlang 开发,主要讲解如何构建稳定、版本控制良好、可维护的产品级代码,凝聚了三位erlang 大师多年的实战经验。 《erlang/otp并发编程实战》主要分为三大部分:第一...

    Erlang编程指南

    不同层次的Erlang程序员都会发现本书是有价值的学习和参考资料。”, ——Steve Vinoski,《IEEE Internet Computing》专栏作家, 《Erlang编程指南》是对Erlang语言的深入介绍。Erlang是任何必须并发、容错和快速响应...

    windows 32位和64位 Erlang 21.0.1下载

    This guide covers Erlang/OTP requirements, recommendations, caveats and commonly used installation sources. Unsupported Versions Erlang/OTP versions older than 19.3 are not supported by currently ...

    Erlang-win64_20.1

    "Erlang-win64_20.1" 是Erlang的一个特定版本,面向Windows 64位操作系统。这个版本可能包含了Erlang的所有核心组件和库,包括编译器、运行时系统、标准库以及相关的工具。20.1版发布于2017年,包含了一些性能改进...

    Erlang程序设计(第2版)1

    本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用Erlang实现基于消息传递的分布式并发系统,这在多核CPU环境下尤为重要,因为Erlang能够自动利用多核优势提升程序性能。 在并发编程方面,...

    erlang 24.0版本 win64 位

    Erlang 24.0是这个语言的一个新版本,针对Windows 64位操作系统进行了优化。 在Erlang 24.0版本中,开发者可以期待一系列的改进和新特性。首先,性能提升是每个新版本的重点。Erlang 24.0可能包含对虚拟机(BEAM)...

    Erlang32位&64位.rar

    Erlang在1991年由爱立信公司向用户推出了第一个版本,经过不断的改进完善和发展,在1996年爱立信又为所有的Erlang用户提供了一个非常实用且稳定的OTP软件库并在1998年发布了第一个开源版本。目前Erlang同时支持的...

    Erlang Windows 64位 安装包

    总的来说,Erlang在Windows 64位系统上的安装是搭建RabbitMQ等基于Erlang技术栈项目的第一步。理解Erlang语言特性和其与RabbitMQ的结合,对于开发者来说至关重要,它将有助于构建稳定、高效的分布式系统。

    erlang23.2版windows64位.zip

    在标题"erlang23.2版windows64位.zip"中,我们了解到这是Erlang的一个特定版本——23.2,专为Windows 64位操作系统设计的安装包。这个版本可能包含了对Windows平台的优化,以确保在该系统上高效运行。 描述中的...

    eclipse的erlang插件 erlide

    Eclipse是一款广受欢迎的开源集成...总之,Erlide是Eclipse中的一款优秀Erlang开发插件,它极大地提升了Erlang程序员在Eclipse中的开发体验。通过其丰富的功能和良好的兼容性,Erlide成为了Erlang开发者的得力助手。

    Erlang语言安装包32位

    Erlang语言安装包,RibbitMQ消息处理所需支持语言,20.0 32bit

    erlang编程 Introducing Erlang

    "Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,旨在帮助初学者理解和掌握Erlang的核心概念和特性。 ### 1. 函数式编程基础 Erlang基于函数式编程范式,这意味着程序由纯函数构成,没有副作用。...

    erlang_otp_win64_25.0

    Erlang OTP 25.0是该平台的一个版本,特别针对Windows 64位操作系统进行了优化。 在"erlang_otp_win64_25.0"这个标题中,我们可以提取出几个关键点: 1. **Erlang**:这是一种函数式编程语言,以其在处理并发性和...

    ERLANG最新版安装包Win64位

    目前官网最新版为20.1,我分别下载了64位和32位的 erlang 20.1 安装包Win64、otp_win64_20.1.exe(官网大小:92M) erlang 20.1 安装包Win32、otp_win32_20.1.exe(官网大小:91.12M) 由于上传文件大小限制,目前只...

    erlang-otp-win64位 25.3版本

    总的来说,"erlang-otp-win64位 25.3版本"的安装是部署RabbitMQ等基于Erlang OTP技术的应用的第一步。理解Erlang OTP的特性和RabbitMQ的工作原理,能够帮助开发者更好地利用这些工具构建高效、可靠的系统。在实际...

    erlang lib of iconv

    它通过封装C语言的iconv库,使得Erlang程序员可以使用Erlang的语法和模式匹配来执行编码转换。这对于处理来自不同来源、使用不同编码的数据尤其有用。 3. **接口介绍** Erlang的iconv库提供了几个主要的函数,包括...

    windows下安装Erlang环境

    **面向并发的编程**:Erlang的语法和语义鼓励程序员以并发思维方式编写代码,而不是将并发作为一种附加功能。 **函数式编程**:Erlang是一种函数式语言,函数无副作用,强调纯函数和不可变数据,这有助于编写简洁、...

    erlang程序设计中文版

    Erlang的设计为程序员提供了处理并发问题的强有力工具,使得程序能够以一种更接近真实世界交互的方式来模拟人类思考过程。 本书适合初学者入门和中级水平程序员进一步学习Erlang编程语言。它不仅包含顺序编程的基础...

Global site tag (gtag.js) - Google Analytics