最先接觸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中就找不到,代替的就是模式比對。下面舉個例子:
測試的結果如下:

Erlang裡面還有一個重要的文法,就是元組(tuple),對于元組還有一個外衣叫記錄(record),上面area的第二個參數就是元組,再給個元組的另一個簡單用法:
測試結果如下:
Erlang還有熱替換的功能,在我改代碼後不需要重新啟動就可以得出修改後的結果。
今天介紹的隻是入門級的知識,在我深入學習并用Erlang編寫程式後再斷續更新,最後解讀ejabberd和Erlang的高并發之迷。