Erlang是一個結構化,動態(tài)類型編程語言,內建并行計算支持。最初是由愛立信專門為通信應用設計的,比如控制交換機或者變換協(xié)議等,因此非常適 合于構建分布式,實時軟并行計算系統(tǒng)。
使用Erlang編寫出的應用運行時通常由成千上萬個輕量級進程組成,并通過消息傳遞相互通訊。進程間上下文切換對于Erlang來說僅僅 只是一兩個環(huán)節(jié),比起C程序的線程切換要高效得多得多了。
使用Erlang來編寫分布式應用要簡單的多,因為它的分布式機制是透明的:對于程序來說并不知道自己是在分布式運行。
Erlang運行時環(huán)境是一個虛擬機,有點像Java虛擬機,這樣代碼一經編譯,同樣可以隨處運行。它的運行時系統(tǒng)甚至允許代碼在不被中斷的情況下更新。另外如果你需要更高效的話,字節(jié)代碼也可以編譯成本地代碼運行。
Yaws: 一個Erlang寫的服務器,據(jù)說并發(fā)能是apache的15倍
排序算法的原理無需多說,直接上代碼
1 -module(quicksort).
2 -export([start/1]).
3
4 %% 程序入口
5 %% List:用戶輸入的待排序的數(shù)值列表
6 start(List) ->
7 SortedList = calu(List),
8 io:format("sorted list:~w~n", [SortedList]).
9
10 %% 得到排序后的數(shù)值列表
11 calu([Key|RestList]) ->
12 {LittleList, GreatList} = calu_sort(Key, RestList, [], []),
13 calu(LittleList) ++ [Key] ++ calu(GreatList);
14 calu([]) ->
15 [].
16
17 %% 快速排序算法
18 %% Key:列表中的第一個元素
19 %% [Element|RestElements]:列表中的其它元素
20 %% LittleList:小于等于Key的數(shù)值組成的列表
21 %% GreatList:大于Key的數(shù)值組成的列表
22 calu_sort(Key, [Element|RestElements], LittleList, GreatList) ->
23 if
24 Element =< Key ->
25 calu_sort(Key, RestElements, [Element] ++ LittleList, GreatList);
26 Element > Key ->
27 calu_sort(Key, RestElements, LittleList, [Element] ++ GreatList)
28 end;
29 calu_sort(_Key, [], LittleList, GreatList) ->
30 {LittleList, GreatList}.
注意事項:代碼第一次運行的時候,結果怎么都不對,調試之后發(fā)現(xiàn)問題出在24行的Element =< Key(變量)表達式,寫成了Element =< key(原子),由于Element是數(shù)值,key是原子,根據(jù)Erlang的排序規(guī)則,數(shù)值小于原子,所以結果不正確。由于變量名必須以大寫開始,需要按住shirt鍵輸入,有時候不注意沒按住shirt就變成了原子。
這種問題在其它編程語言中是很難出現(xiàn)的,對于靜態(tài)類型語言,直接就給出未定義符號的編譯錯誤,對于動態(tài)語言,不同類型的數(shù)據(jù)一般是不予比較的。所以在Erlang編程中要萬分小心,不要把變量名寫成原子,否則會出現(xiàn)編譯通過而運行時出現(xiàn)各種異常結果的情況。