Erlang不能错过的盛宴

(快步进入Erlang的世界)

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

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

如今,让我们迎接Erlang盛宴!

一、经历

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

2008年初的时候,公司的项目开发中,我有缘认识了ejabberd,一个採用Erlang开发的开源jabberserver。我開始为其诱人的特性所倾倒。是时候认真看看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,而没有採用操作系统的进程和线程,我们能够创建大规模的并发处理,同一时候还简化了我们的编程复杂度。我们能够通过几十行代码实现一个并发的TCPserver,这在其它语言中都想都不敢想!

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应用场景

分布式产品,网络server,client,等各种应用环境。

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

八、Erlang开源项目

排名不分先后

  • couchdb     基于文档等非结构化数据的数据库,提供HTTP接口
  • disco       Map-Reduce框架,Erlang + Python
  • ejabberd    性能出众,使用广泛的Jabber开源server
  • mochiweb    轻便,高效的HTTP应用框架
  • rabbitmq    中间server,实现AMQP协议
  • yaws        高效的web server
  • etorrent    Bittorrentclient
  • 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/

转载于:https://www.cnblogs.com/hrhguanli/p/3918336.html

一位Erlang程序猿的自白相关推荐

  1. 一位Erlang程序员的自白

    Erlang不能错过的盛宴 (快步进入Erlang的世界) 作者:成立涛 (litaocheng@gmail.com) 作为程序员,我们曾经闻听很多"业界动态","技术革 ...

  2. 一位Erlang程序员的告白

    Erlang不能错过的盛宴 (快步进入 Erlang的世界) 作者:成立涛 (litaocheng@gmail.com ) 作为程序员,我们曾经闻听很多"业界动态","技 ...

  3. 2019年终总结,一位本命年程序猿的年终总结

      今天是2019年的最后一天,看到朋友圈很多人都在晒网易云音乐的年度报告,我也要晒一晒,不过我和他们不同,我是在博客里面晒(哈哈),主要也是因为这个才想起我还没写年终总结. 本命年的一年   今年是 ...

  4. 一位未来程序猿的成长历程

    在这里记录自己在编程训练过程中的一些想法,欢迎各位大佬前来指点. 编程 PAT甲级 CSP认证 LeetCode:数据结构 PAT甲级 1001 A+B Format 1002 A+B for Pol ...

  5. 【严重抗议】主播都是阿里程序猿的直播,他们也是够了!

    5月29日 10位男程序猿 将聚众直播 没有美女鲜花 没有腹肌火箭 只有技术干货 从项目管理 聊到Dev无感Ops 从创新创业企业 聊到"211"敏捷研发速度 从团队效能动力模型 ...

  6. 程序猿来做一下这套试卷,看看你的实力如何!

    作者:王大伟   微软最有价值专家(MVP) Python爱好者社区唯一小编 选择题(每题4分,共计100分) 1.一个假期在外游玩不会游泳的程序猿看到河边有如下警告后结果如何? A.默默走开 B.程 ...

  7. 单男福利?程序猿用ChatGPT创造的虚拟老婆,被真女友强制「安乐死」

    上一篇:被裁了,想不通,一个人干全组70%的工作,没人干的事都是我在干,就因为不会向上管理吗? "我花了接近7000元购买云服务器,只是为了和她多聊聊天." ChatGPT爆火后, ...

  8. 活捉一枚70岁的程序猿,你会写一辈子的代码吗

    早上一条微博刷新了九章君的认知. 一位70岁的程序猿破了老年组的马拉松记录. 居然有70岁的程序猿?程序猿不是40+就已经很大龄,很稀有了吗? 程序员是一碗青春饭,大多是因为这是一个需要高强度脑力劳动 ...

  9. 连载《一个程序猿的生命周期》-27、新招的两位“高管”相继离职

    一个程序猿的生命周期 微信平台 口   号:职业交流,职业规划:面对现实,用心去交流.感悟. 公众号:iterlifetime 百木-ITer职业交流奋斗 群:141588103    微   博:h ...

最新文章

  1. c语言链表p-%3enext,课程设计报告.c语言程序设计.pdf
  2. 使用jQuery清空表单
  3. 微信计步器怎么不计步_难以关闭的微信朋友圈广告
  4. 苹果手机输入屏保后锁屏_修一块手机屏幕要7080元?
  5. python数据归一化
  6. MQTT 控制报文 - SUBSCRIBE订阅报文,SUBACK,UNSUBSCRIBE,UNSUBACK - 第5章
  7. 汤晓鸥为CNN搓了一颗大力丸
  8. Django-----中间件Cookie
  9. cni k8s 插件安装_使用kind来快速部署k8s环境
  10. mysql建立软链接_MySQL(一)安装
  11. A4纸在屏幕上的像素尺寸
  12. spyder顺眼配色方案记录
  13. 通过uc_client接口方式,更新discuz会员头像
  14. JAVA冰箱评测开题报告_基于CFD的风冷冰箱后风道数值计算和优化设计开题报告...
  15. 用串口(TFTP)给设备升级程序
  16. JAVA面试基础知识整理
  17. Http请求之GET,POST,PUT,DELETE方法详解
  18. 超像素分割算法————综述
  19. Golang实现Raft一致性算法
  20. 软件测试缺陷指标,软件测试质量指标算法(总结)

热门文章

  1. Android 编程下将 Bitmap 转为 InputStream
  2. Java: Queue
  3. javaeye怎么打不开了?当前!2010,10,24,23:08
  4. 印度软件水平和中国的程序员
  5. ubuntu系统编译sh出错 默认dash不是bash
  6. LaTeX公式打出U上面一个小圈表示去心领域的符号:\mathring{U}
  7. 车rc陀螺仪测试软件,利用加速度计和陀螺仪测量车辆运动
  8. 停车场管理系统 java_使用java编写一个停车场管理系统
  9. perl 中文处理 乱码
  10. python大盘点:全局变量、局部变量、类变量、实例变量