posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Erlang的Hello World: 一個計數程序

          Posted on 2008-10-17 20:05 ZelluX 閱讀(1902) 評論(0)  編輯  收藏 所屬分類: Laboratory
          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的特點,尤其是它基于信息發送的本質。

          主站蜘蛛池模板: 通化县| 曲沃县| 通榆县| 萝北县| 平江县| 比如县| 砚山县| 聂拉木县| 台江县| 凤凰县| 阿荣旗| 介休市| 务川| 韶关市| 郎溪县| 伊吾县| 政和县| 海晏县| 三门县| 德钦县| 南平市| 堆龙德庆县| 封开县| 马公市| 蕉岭县| 惠水县| 肃北| 寿阳县| 扶余县| 新干县| 安仁县| 巴中市| 会宁县| 伊吾县| 台中县| 建水县| 平安县| 凌云县| 威海市| 吉林省| 白城市|