この項目では、プログラミング言語のErlangについて説明しています。通信トラフィック量を表す同名の単位については「アーラン」をご覧ください。
ErlangErlangのロゴ
パラダイム宣言型プログラミング、関数型プログラミング、並行計算、マルチパラダイムプログラミング
Erlang(アーラン)は、コンピュータにおいて汎用的な用途に使うことができる並行処理指向のオープンソースソフトウェア(英:Open Source Software、略:OSS)プログラミング言語および実行環境。 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)という関数がFに代入されてからqsortが実行される %% qSortは大小の比較関数としてby_lengthで定義したSmallerつまりFを使っている 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万個の「プロセス」を並行実行できることが示された[2]。 これ以降の記述ではErlangにおける「プロセス」を括弧無しで言及する。 Erlangにおけるプロセス間の通信は、非共有かつ非同期のメッセージ転送システムによって行われる。Erlangのプロセスは全てそれぞれの「メールボックス」をもつ。メールボックスには他のプロセスから受信したメッセージが格納される。その後、メールボックスに格納されたメッセージがメールボックスを所有するプロセスによって処理される。そのときErlangのプロセスはメッセージを得るためにreceiveという基本操作を行う。メッセージを得る過程ではパターンマッチングが行われる。まずメッセージ制御ルーティンが1番目のメッセージに対して各パターンがマッチするかどうか調べる。2番目以降のメッセージに対しても同様のことを行う。マッチングは、マッチするメッセージに出会うまで行われる。メッセージが処理されると、メッセージはメールボックスキューから除去され、プロセスは復帰して続きの処理を行う。Erlangの構成要素は何であれメッセージとして使うことができる。Erlangの基本要素である整数[注釈 1]、浮動小数点数[注釈 2]、文字[注釈 3]、アトム[注釈 4]も、またタプル[注釈 5]、リスト[注釈 6]、さらには関数[注釈 7]さえも、メッセージとして扱うことができる。
概要
分散化された環境
障害に耐性をもつ(IT用語における「フォルトトレラント」(英:Fault tolerant))。
ある程度のリアルタイム性を備える
無停止で稼働する
命名
関数型言語
並行処理指向で分散処理指向の言語
Size:29 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)』
担当:undef