2008年8月1日金曜日

プログラミング言語Erlangを覚えよう

このブログ記事をはてなブックマークに追加

以前から関数型プログラミング言語であるErlang(アーラン)を覚えたかったので、「プログラミング言語Erlang入門」を読んだ。この本自体は本当に入門者というか初心者向けの本となっている。しかし、自分自身はほとんど関数型言語について知識がないので、こういった入門書で概略を掴めるのはありがたい。C言語などの命令型プログラミング言語と比べるとスタイルが大きく異なり、それらの知識をベースとすることができないので、先日のLuaの入門書ほどお手軽ではなかったが、内容自体は非常に簡易なので1日あれば余裕で理解できるだろう。

概略以上のことを学びたいのなら最初から「プログラミングErlang」を読むのが良い。こちらも手元にあるが、かなり良い本だと思う。ちゃんとしたプログラムを書きたいのならこちらがお勧め。

ところで、Erlangは並列処理言語としても注目を集めている。非常に効率よく並列処理ができるのが特徴で、それぞれのスレッドが完全に独立して動くように設計されている。独立しているスレッドであるためErlangではそれをプロセスと呼んでいる。spawn()関数で各プロセスを実行することができ、非常に簡単に並列処理プログラムを作ることができる。

プログラミングErlang」に内包リストを使ってアナグラムを標準出力に表示するプログラムが載っていたのだが、それを並列処理化して一つのファイルに書き出すように変更したプログラムを書いたので、このエントリの最後に示しておく。二つの文字列を二つのプロセスを使って同時にアナグラムを生成し、その結果を一つのファイルに書き出している。このコードでおぼろげながらでもErlangの雰囲気が分かるだろうか。

test.erl

-module(test). -export([perms/1, write/3, wait/1, anagram/2]). %% 順列生成. perms([]) -> [[]]; perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])]. %% ファイルへの書き出し. %% S: ファイル, L: 文字列, P: プロセス識別子. write(S, L, P) -> lists:foreach(fun(X) -> io:format(S, "~s~n", [X]) end, perms(L)), P ! L. %% すべてのメッセージを受け取るまで待機. wait(0) -> io:format("terminated.~n", []); wait(N) -> receive Msg -> io:format("Anagram: ~s~n", [Msg]), wait(N - 1) end. %% アナグラム生成 メイン関数. %% File: ファイル名, [L1, L2]: アナグラムを行う文字列のリスト. anagram(File, [L1, L2]) -> P = self(), {ok, S} = file:open(File, write), spawn(test, write, [S, L1, P]), spawn(test, write, [S, L2, P]), wait(2), file:close(S).

コンパイルおよび実行

test.erlをコンパイルし、test:anagram()関数を使ってabcとdefのアナグラムをanagram.txtに書き出す。

1> c(test). {ok,test} 2> test:anagram("anagram.txt", ["abc", "def"]). Anagram: abc Anagram: def terminated. ok

anagram.txt

abc def acb dfe bac edf bca efd cab fde cba fed

0 コメント: