Erlang
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Erlang | |
---|---|
パラダイム | マルチパラダイム、並列処理指向、関数型言語 |
登場時期 | 1987年 |
開発者 | エリクソン |
型付け | 動的型付け、強い型付け |
主な処理系 | Erlang |
影響を受けた言語 | Prolog |
プラットフォーム | UNIX系OS、Windows、Mac OS X |
Erlang (アーラン) は、コンピュータにおいて汎用的な用途に使うことができる並列処理指向のプログラミング言語および実行環境である。 Erlangの直列処理のサブセットの言語は、関数型言語であり、先行評価を行い、変数への代入は1回限りであり、動的型付けである。 Erlangはエリクソン社により次の条件のシステムを構築できるよう設計された。
ホットスワップが可能であり、稼働中のシステムを停止すること無くErlangのプログラムを変更することができる。 Erlangは、当初はエリクソン社内部だけで使われる非公開の技術であったが、1998年にオープンソースとして公開された。 エリクソンによるErlangの実装は基本的にはインタプリタであるが、HiPEというコンパイラも同社の実装に含まれている。 ただしHiPEはErlangが動作する全てのプラットフォームで使えるわけではない。
Erlangにおいては、マルチスレッドの処理の並列性はプログラム開発者 (プログラマ) にとって明瞭である。 これに対し、ほとんどのプログラミング言語においては、マルチスレッドは複雑で誤りを犯しがちな分野である。 Erlangで「プロセス」(スレッド) を生成し管理する手法はごく平凡な方法である。
Erlangは数学者のアグナー・アーラン (Agner Krarup Erlang) から名前をとって命名された。 一方で、エリクソン社内で非常によく使われたため ERicsson LANGuage を略して命名されたと一部の人々は思っている。 当時エリクソンのコンピュータ科学研究所の所長であったビャーネ・デッカーによれば、この名前に関する2重性については意図的なものだとのことである。
目次 |
[編集] 関数型言語
Erlangのソースコードの例を示す。
-module(fact). -export([fac/1]). fac(0) -> 1; fac(N) when N > 0 -> N * fac(N-1).
次のソースコードはErlangによるクイックソートのアルゴリズムの実装である。
%% quicksort:qsort(List) %% Sort a list of items -module(quicksort). -export([qsort/1]). qsort([]) -> []; qsort([Pivot|Rest]) -> qsort([ X || X <- Rest, X < Pivot]) ++ [Pivot] ++ qsort([ Y || Y <- Rest, Y >= Pivot]).
この例では関数 qsort
の再帰呼び出しを行っている。 再帰呼び出しはソート処理の対象が無くなった時点で終了する。 式 [ X || X <- Rest, X < Pivot]
は「 X
を Rest
の要素として、X
が Pivot
より小さい全ての X
を選択する。」と読むことができる。 このようにErlangではリストを非常に簡単に扱うことができる。 Erlangでは異なる2つのデータ型の値の間であらゆる論理式を評価できるため、式の評価は単純である。 例えば、1 < a
は true
を返す。
ただしErlangにおける戻り値 (true
あるいは false
) を返す基礎的なしくみを変更する必要がある場合には、比較関数を使うことができる。 例えば、 a < 1
が true
と評価される比較順序により順序付けられたリストが必要な場合などである。
次のソースコードではリストをリスト要素の長さを基準にしてソートする。
-module(listsort). -export([by_length/1]). by_length(Lists) -> F = fun(A,B) when is_list(A), is_list(B) -> length(A) < length(B) end, qsort(Lists, F). qsort([], _) -> []; qsort([Pivot|Rest], Smaller) -> qsort([ X || X <- Rest, Smaller(X, Pivot)], Smaller) ++ [Pivot] ++ qsort([ Y || Y <- Rest, not(Smaller(Y, Pivot))], Smaller).
[編集] 並行処理指向で分散処理指向の言語
Erlangの主な特長は、並列処理のサポートである。 並列処理のサポートは、複数の「プロセス」を生成しそれらのプロセス間通信を行う基本的な機能群の簡潔で強力なセットである。 Erlangにおける「プロセス」は、Erlangのアプリケーションソフトウェアを構成する最も主要な要素である。 Erlangの「プロセス」は、OS (オペレーティングシステム) のプロセスともOSのスレッドとも異なる (それらは軽量なスレッドであり、Javaでいう「グリーンスレッド」とある程度似ている) 。 Erlangを学ぶ際はこのことに注意する必要がある。 結果としてErlangの「プロセス」は非常に軽量となっている。 Erlangの「プロセス」は約309ワードのオーバーヘッドである。 かなり多量の「プロセス」を性能を低減すること無く生成することが可能である。 2000万個の「プロセス」を使ってのベンチマークが行われたことがある[1]。
これ以降の記述ではErlangにおける「プロセス」を括弧無しで言及する。
Erlangにおけるプロセス間の通信は、それらプロセスの間で何も共有することなく非同期のメッセージ転送システムによって、行われる。 Erlangのプロセスは全てそれぞれの mailbox をもつ。 mailbox には他のプロセスから受信したメッセージが格納される。 その後、mailbox に格納されたメッセージが mailbox を所有するプロセスによって処理される。 そのときErlangのプロセスはメッセージを得るために receive という基本操作を行う。 メッセージを得る過程ではパターンマッチングが行われる。 まずメッセージ制御ルーティンが1番目のメッセージに対して各パターンがマッチするかどうか調べる。 2番目以降のメッセージに対しても同様のことを行う。 マッチングは、マッチするメッセージに出会うまで行われる。 メッセージが処理されると、メッセージは mailbox キューから除去され、プロセスは復帰して続きの処理を行う。 Erlangの構成要素は何であれメッセージとして使うことができる。 Erlangの基本要素である整数 (integer) 、浮動小数点数 (float) 、文字 (character) 、atom も、またタプル、リスト、さらには関数さえも、メッセージとして扱うことができる。
ソースコードの例を示す。
Pid = spawn(Mod, Func, Args) % execute function Func as new process Pid = spawn(Node, Mod, Func, Args) % execute function Func in remote node Node Pid ! a_message % send message to the process (asynchronously) receive % receive message sent to this process a_message -> do_something; {data, Data_content} -> do_something_else(); % This is a tuple of a type atom and some data {hello, Text} -> io:format("Got hello message: ~s", [Text]); {goodbye, Text} -> io:format("Got goodbye message: ~s", [Text]) end.
Erlangでは異なるノード (コンピュータ) に分散した複数のプロセスを互いに連携させて動作させるためのサポートも組み込みで備えている (分散処理) 。 プロセスは遠隔のノードに生成することができ、遠隔ノード上のプロセスとのプロセス間通信は透過的である。 すなわち、遠隔ノード上のプロセスとのプロセス間通信は、同じノード上のプロセスとのプロセス間通信と全く同じように行われる。
Erlangでの並列処理では、エラー処理の基本的な方法をサポートしている。 あるプロセスが異常をきたすと、プロセスは手際良く終了し、そのプロセスを制御しているプロセス (何らかのアクションをとることができるプロセス) にメッセージを送信する。 このエラー処理の方法により、ソースコードの保守性を高め複雑性を低減することができる。
[編集] 配布
エリクソン社はErlangをオープンソースとして、1998年に公開した。 その意図は、特定企業からの独立性を確保することと、Erlangに対する人々の認知を高めることであった。 ライブラリとリアルタイムデータベース (Mnesia) と共に配布される Erlangプログラミング言語の配布形式は、Open Telecom Platform (OTP) と呼ばれている。 エリクソンおよび数社の企業は、Erlang技術に対する商用サポートを提供している。
Erlangをオープンソースとして公開する方針を採ってからは、世界中のいくつもの企業によって採用されている。 Nortel Networks、T-Mobile などの企業がErlangを採用している[2]。 ただし2008年現在の時点では、まだ広く普及し主流のプログラミング言語となる段階には至っていない。
2008年現在、Erlangは活発に開発が続けられており、定期的に新リリースを公開している。 Erlangは、いくつかの Unix系 OS および Microsoft Windows 上で使うことができる。
[編集] 関連項目
- ejabberd: Erlang を使って開発された XMPP/Jabber インスタントメッセージングサーバ
- Wings 3D: Erlang で開発された 3D モデラ
- Yet another web server (YAWS) : Erlang で開発された十分な機能を備え高い性能を発揮するWebサーバ
- Tsung: 高性能なベンチマークツール
- ガード
[編集] 脚注
- ^ Ulf Wiger (2005-11-14). "Stress-testing erlang" comp.lang.functional.misc. 2006-08-25閲覧.
- ^ "Who uses Erlang for product development?" Erlangに関してよく尋ねられる質問集。この資料によるとErlangを最も大規模に採用している組織はエリクソン社である。エリクソン社は電気通信システムの開発にErlangを使っている。同社ではこれまで何十ものプロジェクトでErlangを採用してきた。とりわけ大規模なものは非常にスケーラブルな AXD301 ATM スイッチのプロジェクトである。Erlangを採用しているエリクソン社以外の組織としては、Nortel、Deutsche Flugsicherung (航空管制を担うドイツの政府組織) 、T-Mobile などが挙げられている。
[編集] 参考文献
- Joe Armstrong (2003). "Making reliable distributed systems in the presence of hardware errors". 博士論文 (Ph.D.) 、スウェーデン王立ストックホルム工科大学