並行計算について下調べ中

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.

参考書籍

プログラミングErlang

プログラミングErlang

Erlangプログラミング

Erlangプログラミング

下調べ中

協調型計算システム―分散型ソフトウェアの技法と道具立て

協調型計算システム―分散型ソフトウェアの技法と道具立て

ホーアCSPモデルの理論

ホーアCSPモデルの理論

*1:Erlangは動的型付け言語