acm queue 9月的雜志的主題是The Concurrency Problem,力推了Erlang這個語言,其中有篇文章簡單的介紹了下這個message-oriented語言。
查了下這個名字的讀法,正確的讀法應該是air-lang,這里元音a的發音和bang中的a一樣。
文章中的第一個程序就有點令人費解,主要原因在于Erlang的語法和一般的imperative language差別很大,和functional language比較類似,但是本質上也有很大的不同。
以Java的一個計數程序為例
//?A?shared?counter.
public?class?Sequence?{
????private?int?nextVal?=?0;
?
????//?Retrieve?counter?and?increment.
????public?synchronized?int?getNext()?{
????????return?nextVal++;
????}
?
????//?Re-initialize?counter?to?zero.
????public?synchronized?void?reset()?{
????????nextVal?=?0;
????}
}
這個程序的功能不用多說了,一個同步的計數程序。它的Erlang翻譯版的代碼為
-module(sequence1).
-export([make_sequence/0, get_next/1, reset/1]).
?
% Create a new shared counter.
make_sequence() ->
spawn(fun() -> sequence_loop(0)end).
?
sequence_loop(N) ->
receive
{From, get_next} ->
From!{self(), N},
sequence_loop(N + 1)<SEMI>
reset ->
sequence_loop(0)
end.
?
% Retrieve counter and increment.
get_next(Sequence) ->
Sequence!{self(), get_next},
receive
{Sequence, N} -> N
end.
?
% Re-initialize counter to zero.
reset(Sequence) ->
Sequence! reset.
初看這個程序自然是一頭霧水,不過程序的函數式風格味還是很濃的。
前面提到,Erlang是基于message的,或者說message sending機制是包含在語言系統內部的,語法就是 pid ! message
接下來再來分析這個簡單的程序。開頭兩行是模塊和函數聲明,略去。make_sequence開始這個進程,spawn/1內置函數創建一個新的進程,并返回pid到調用者。
初始時運行的函數是sequence_loop(0),這個函數接收兩種信息,用receive表達式聲明:如果收到形式是{From,
get_next}的信息,就返回當前的N并調用sequence_loop(N+1),這樣下一次收到同樣的信息時就能返回N+1了;reset則等價
于Java版本中的n=0語句。
get_next/1則是發送給pid為Sequence的進程 {self(), get_next}
這樣一個信息,上面解釋的sequence_loop/1函數收到這個信息后會返回一個 {self(), N}
的tuple給get_next/1,收到這個信息后get_next/1就能返回N這個值了。
最后reset/1函數則是發送給Sequence一個reset信息。
這個簡單的程序里能大致窺見一些Erlang的特點,尤其是它基于信息發送的本質。