zoukankan      html  css  js  c++  java
  • 进入Erlang的世界

    http://erlang.group.iteye.com/group/wiki/1407-to-enter-the-world-of-erlang

    进入Erlang的世界

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

    现在,让我们迎接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语言特性

    简单小巧

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

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

    同时提供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中提供丰富的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,用来进行单元测试。

    灵活多样的错误处理

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

    代码热替换

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

    天生的分布式

    Erlang天生适合分布式应用开发,其很多的BIF(内建函数,相API)都具有分布式版本,我们可以通过BIF在远程机器上创建Process,可以向远程机器上的某个Process发送消息。在分布式应用的开发中,我们可以像C、C++,JAVA等语言一样,通过Socket进行通讯,也可以使用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的规范。

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

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

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

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

    Erlang应用场景

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

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

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

    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/

    订阅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://www.planeterlang.org/

    http://www.erlangplanet.org/

    http://trapexit.org

  • 相关阅读:
    Digital Video Stabilization and Rolling Shutter Correction using Gyroscope 论文笔记
    Distortion-Free Wide-Angle Portraits on Camera Phones 论文笔记
    Panorama Stitching on Mobile
    Natural Image Stitching with the Global Similarity Prior 论文笔记 (三)
    Natural Image Stitching with the Global Similarity Prior 论文笔记(二)
    Natural Image Stitching with the Global Similarity Prior 论文笔记(一)
    ADCensus Stereo Matching 笔记
    Efficient Large-Scale Stereo Matching论文解析
    Setting up caffe on Ubuntu
    Kubernetes配置Secret访问Harbor私有镜像仓库
  • 原文地址:https://www.cnblogs.com/fvsfvs123/p/4125920.html
Copyright © 2011-2022 走看看