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的高併發之迷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章