Erlang

プログラミング言語 >>他のプログラミング言語 ■カテゴリ / ■テンプレート Erlang（アーラン）は、コンピュータにおいて汎用的な用途に使うことができる並行処理指向のプログラミング言語および実行環境。 Erlangの直列処理のサブセットの言語は、関数型言語であり、先行評価を行い、変数への代入は1回限りであり、動的型付けである。 Erlangはエリクソンにより次の条件のシステムを構築できるよう設計された。 分散化された環境 障害に耐性をもつ (フォルトトレラント) ある程度のリアルタイム性を備える 無停止で稼働する ホットスワップが可能であり、稼働中のシステムを停止すること無くErlangのプログラムを変更することができる。Erlangは、当初はエリクソン社内部だけで使われる非公開の技術であったが、1998年にオープンソースとして公開された。エリクソンによるErlangの実装は基本的にはインタプリタであるが、HiPEというコンパイラも同社の実装に含まれている。ただしHiPEはErlangが動作する全てのプラットフォームで使えるわけではない。 Erlangにおいては、マルチスレッドの処理の並行性はプログラム開発者（プログラマ）にとって明瞭である。これに対し、ほとんどのプログラミング言語においては、マルチスレッドは複雑で誤りを犯しがちな分野である。 Erlangで「プロセス」(スレッド) を生成し管理する手法はごく平凡な方法である。 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が実行され　関数fun(A,B)という関数がＦに代入されてからqsortが実行される %% qSortは大小の比較関数としてby_lengthで定義したSmallerつまりＦを使っている 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の仮想機械(VM)によって管理される。 「プロセス」の生成オーバーヘッドは約300ワード程度に抑えられており、大量の「プロセス」を、性能を低下させずに生成できる。 あるベンチマークでは2000万個の「プロセス」を並行実行できることが示された。 これ以降の記述ではErlangにおける「プロセス」を括弧無しで言及する。 Erlangにおけるプロセス間の通信は、非共有かつ非同期のメッセージ転送システムによって行われる。 Erlangのプロセスは全てそれぞれの「メールボックス」をもつ。 メールボックスには他のプロセスから受信したメッセージが格納される。 その後、メールボックスに格納されたメッセージがメールボックスを所有するプロセスによって処理される。 そのときErlangのプロセスはメッセージを得るためにreceiveという基本操作を行う。 メッセージを得る過程ではパターンマッチングが行われる。 まずメッセージ制御ルーティンが1番目のメッセージに対して各パターンがマッチするかどうか調べる。 2番目以降のメッセージに対しても同様のことを行う。 マッチングは、マッチするメッセージに出会うまで行われる。 メッセージが処理されると、メッセージはメールボックスキューから除去され、プロセスは復帰して続きの処理を行う。 Erlangの構成要素は何であれメッセージとして使うことができる。 Erlangの基本要素である整数、浮動小数点数、文字、アトムも、またタプル、リスト、さらには関数さえも、メッセージとして扱うことができる。 ソースコードの例を示す。 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をオープンソースとして公開する方針を採ってからは、世界中のいくつもの企業によって採用されている。 ノベル・ネットワークス、ティー・モバイルなどの企業がErlangを採用している。同社ではこれまで何十ものプロジェクトでErlangを採用してきた。とりわけ大規模なものは非常にスケーラブルな AXD301 ATM スイッチのプロジェクトである。Erlangを採用しているエリクソン以外の組織としては、ノルテル、ドイチェ・フルークズィヒャルング（航空管制を担うドイツの政府組織）、ティー・モバイルなどが挙げられている。 2014年にはWhatsApp、ドワンゴ、LINEなどがErlangを採用していることを表明した。 2015年現在、Erlangは活発に開発が続けられており、定期的に新リリースを公開している。 Erlangは、いくつかのUNIXに似たオペレーティングシステムおよびWindows上で使うことができる。 並行計算 アクターモデル ガード (プログラミング) Concurrency and Coordination Runtime ejabberd（英語版） - Erlangを使って開発された XMPP/Jabber インスタントメッセージングサーバ Yaws (ウェブサーバー)（英語版） - Erlangで開発された十分な機能を備え高い性能を発揮する Riak - アマゾン・ダイナモの論文に基づいて実装されている NoSQL データベース ウェブサーバ Tsung（英語版） — 高性能なベンチマークツール ^ Erlang OTP 21.2 is released ^ Ulf Wiger (2005年11月14日). “Stress-testing Erlang”. comp.lang.functional.misc. 2006年8月25日閲覧。 ^ 英: integer ^ 英: float ^ 英: character ^ 英: atom ^ 英: tuple ^ 英: list ^ 英: function ^ 英: Nortel Networks ^ 英: T-Mobile ^ 「Who uses Erlang for product development?」Erlangに関してよく尋ねられる質問集。この資料によるとErlangを最も大規模に採用している組織はエリクソン社である。エリクソン社は電気通信システムの開発にErlangを使っている。 ^ 丁: Nortel ^ 独: Deutsche Flugsicherung Joe Armstrong、2003年、「Making reliable distributed systems in the presence of hardware errors」、博士論文 (Ph.D.) 、スウェーデン王立ストックホルム工科大学 Erlang - 公式サイト Erlang - オープンディレクトリプロジェクト Erlang World - 日本語によるErlangの解説サイト