erlang开发入门

来源:互联网 发布:手机办公软件 编辑:程序博客网 时间:2024/05/16 00:34

erlang开发入门

最先接触erlang是在今年的年初,当时是因为RabbitMQ而结识的erlang,了解后才知道的COP(Concurrency Oriented Programming)面向并发编程。

为什么我会决定要学习 Erlang ,首先是因为我对函数式编程的好奇,一直以来我都觉得很神秘,然后主要的原因还是我想通过学习 Erlang 去了解RabbitMQ、ejabberd、Tsung这几个比较出名的技术,RabbitMQ是高性能的消息中间件, ejabberd 是基于XMPP协议的高性能的IM服务器, Tsung 是高并发的负载测试工具。决定学习 Erlang 后,我选择了一本教程《Erlang程序设计》开始了 erlang 的学习之路,而且这本书是由Erlang之父Joe Armstrong编写的,这本书由基础开始,比较适合我。

开始编程之前要先安装Erlang的运行环境和开发环境,我安装的是otp_win32_R16B02.exe,因为我用的是32位的windows7,这个otp带了erts-5.10.3,erts是运行 Erlang 的VM(虚拟机),otp则是开放的erlang的一些函数 库,开发工具的选的是经常使用的Eclipse+erlide插件。

以下是我在学习 Erlang程序设计的基础知识时的笔记:

1,原子:就是常量,全局有效

2,元组:大括号括起来的项,逗号隔开,首位可表示意义

3,列表:中括号括起来,逗号隔开,表头与表尾

4,模式匹配:变量与常量或表达式的对应关系,提取元素

5,字符串:ASCII码整数列表,$引用

6,模块:.erl文件,编译后为.beam文件

7,erlang中的三种标点符号的使用:逗号(分隔参数),分号(分隔子句),句点(分隔完整的函数和表达式)

8,函数的目:就是函数拥有的参数个数,用 /n 表示

9,fun:匿名函数

10,命名原则:变量大写开头,原子(常量)小写开头

11,类似与JAVA中的重载写法:分号分隔,模式匹配成功执行,不同目的函数是完全不相同的两个函数

12,函数式编程:fun函数既可以作为函数的参数,又可以作为函数的结果,还可以赋给变量(类似JS里的function)

13,高阶函数:能够返回fun或接受fun为参数的函数

14,恒等测试符号:=:=,返回true或false

15,list:map/2这样的函数:list模块中的函数很常见

16,注释:%与%%(自动缩排功能)

17,erlang中为什么没有for循环:因为有了强大的模式匹配

18,申明:-import(模块名,[逗号分隔人方法名]),申明导入的外部模块,与-export([逗号分隔人方法名]),申明导出的模块给外部调用

19,断言与断言序列:when,可以用分号隔开

20,记录(元组的伪装):-record(记录名,{ 名称(记录中的字段名)=元组中的元素,逗号分隔开 }),当元组庞大时方便记忆

21,需要知道的语法含义:-behaviour,-module,-export,-include,-define,-ifdef,-type,-spec,-endif,-record

22,erlang中的任何东西都是表达式,所有的表达式都有值

23,异常处理:模式匹配不成功时会有异常,try...of...catch...after...end,catch的是描述错误的一个元组,但常用case...of...end处理异常

24,BIF:内建函数,类似于JAVA中JDK提供的API,也就是库函数,所有的BIF都在erlang模块(module)中

25,二进制数据:<< 数据值 >>,ASCII码值

26,BIF apply:尽量少用

27,预定义模块属性与用户属性:-AtomTag(...),-module,-export,-import,-compile,-vsn

28,表达式序列与表达式块的值是最后一个表达式的值:begin...end,逗号隔开

29,包含文件:-include_lib(Name),引入库中的包含文件

30,列表操作符++与--:二元操作运算符,功能是列表的合并与删除

31,宏:-define(Constant,Replacement),条件宏,-undef(Macro),-ifdef(Macro),-ifndef(Macro),-else,-endif

32,进程字典:类似JAVA中的ThreadLocal,避免使用

33,各种比较表达式:>,<,=<,>=,等于==,不等于/=,恒(全)等于=:=,不全等于=/=

34,可视化工具:webtool:start(). http://127.0.0.1:8888/

35,并发原语:spawn、send、receive

总结一下:

其实 Erlang 集成了很多语言的特点,首先要理解什么是函数式编程语言和面向并发编程,当然,对于初学者的我还只有一个模糊的概念。看 Erlang 的代码到处是函数,我个人觉得 Erlang 还有一个核心的设计就是模式的匹配,像类C的语言里的for循环在Erlang 中就找不到,代替的就是模式匹配。下面举个例子:

-module(test).%% ====================================================================%% API functions%% ====================================================================-export([area/2]).area(c,{R,L,H}) ->  R * L * H;area(t,{R,L}) ->  R * L;area(m,{R}) ->  R * R.
测试 的结果如下:

Erlang里面还有一个重要的语法,就是元组(tuple),对于元组还有一个外衣叫记录(record),上面area的第二个参数就是元组,再给个元组的另一个简单用法:

-module(test).%% ====================================================================%% API functions%% ====================================================================-export([look/0]).-record(person,{      name=vince,      age=25,      sex=male    }).look() ->  X = #person{}.

测试结果如下:

Erlang还有热替换的功能,在我改代码后不需要重新启动就可以得出修改后的结果。

今天介绍的只是入门级的知识,在我深入学习并用Erlang编写程序后再断续更新,最后解读 ejabberd和Erlang的高并发之迷。

0 0
原创粉丝点击