並行計算について下調べ中
CSPやらアクターモデルやらペトリネットやらを下調べ中……のはずだったのに、気がついたらErlangを触っていた。
Erlangは、基本的にはシンプルな関数型言語っぽい。ただし(Prologの影響を受けているからなのか)ドット・セミコロン・カンマの使い分けが独特で、若干混乱ポイントになっている。流れるように->で処理を記述していけるのは気持ちいい。プロセスっていう概念も楽しい。
リングベンチマークも簡単に書けて、一発で動いた。(N個のプロセスでメッセージをM周させる課題)
やっぱりプログラムのバグを減らすのに最も有効なのは、状態の変化をできるだけ排除することのような気がする。Erlangの実績が示すように、静的な型システムは本質的な所では無いんじゃなかろうか。*1
ソースコード
まだ慣れてないのもあって、あんまりきれいに書けている感じはしない。
-module(ringbench). -export([start/3, ringloop/1]). %-compile(export_all). make_process(P0, 1) -> spawn(?MODULE, ringloop, [P0]); make_process(P0, N) when N > 1 -> NextPid = make_process(P0, N - 1), spawn(?MODULE, ringloop, [NextPid]). ringloop(NextPid) -> receive stop -> NextPid ! stop; {msg, Num, Text} -> NextPid ! {msg, Num, Text}, ringloop(NextPid); _ -> io:format("illegal message received~n") end. start(M, N, Msg) -> NextPid = make_process(self(), N), NextPid ! {msg, 1, Msg}, loop(NextPid, M). loop(Next, M) -> receive stop -> stop; {msg, Num, Text} when Num == M -> io:format("Msg ~p received.~nloop finished.~n", [Text]), Next ! stop, loop(Next, M); {msg, Num, Text} -> Next ! {msg, Num + 1, Text}, loop(Next, M); _ -> io:format("illegal message received~n") end.
参考書籍
- 作者: Joe Armstrong,榊原一矢
- 出版社/メーカー: オーム社
- 発売日: 2008/02/23
- メディア: 単行本(ソフトカバー)
- 購入: 8人 クリック: 284回
- この商品を含むブログ (97件) を見る
- 作者: Francesco Cesarini,Simon Thompson,佐藤嘉一
- 出版社/メーカー: オライリージャパン
- 発売日: 2010/07/26
- メディア: 大型本
- クリック: 29回
- この商品を含むブログ (13件) を見る
下調べ中
- 作者: R.E.フィルマン,D.P.フリードマン,雨宮真人,高橋直久,尾内理紀夫
- 出版社/メーカー: マグロウヒルブック
- 発売日: 1986/07
- メディア: 単行本
- クリック: 1回
- この商品を含むブログ (1件) を見る
- 作者: C.A.R.ホーア,C.A.R. Hoare,吉田信博
- 出版社/メーカー: 丸善
- 発売日: 1992/03
- メディア: 単行本
- 購入: 1人 クリック: 32回
- この商品を含むブログ (4件) を見る