Erlang

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
Erlang
パラダイム マルチパラダイム並行処理指向 (アクターモデル) 、関数型言語
登場時期 1986年
開発者 エリクソン
最新リリース R16B01
型付け 動的型付け、強い型付け
主な処理系 Erlang
影響を受けた言語 Prolog
影響を与えた言語 ClojureScala
プラットフォーム UNIXに似たオペレーティングシステムWindowsMac OS X
ライセンス 修正 Mozilla Public License (修正MPL)
Wikibooks logo Erlang Programming - ウィキブックス
LYME is Erlang-based

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]は「 XRestの要素として、XPivotより小さい全てのXを選択する。」と読むことができる。 このようにErlangではリストを非常に簡単に扱うことができる。 Erlangでは異なる2つのデータ型の値の間であらゆる論理式を評価できるため、式の評価は単純である。 例えば、1 < atrueを返す。

ただしErlangにおける戻り値(trueあるいはfalse)を返す基礎的なしくみを変更する必要がある場合には、比較関数を使うことができる。 例えば、a < 1trueと評価される比較順序により順序付けられたリストが必要な場合などである。

次のソースコードではリストをリスト要素の長さを基準にしてソートする。

 -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のプロセスは全てそれぞれの「メールボックス」をもつ。 メールボックスには他のプロセスから受信したメッセージが格納される。 その後、メールボックスに格納されたメッセージがメールボックスを所有するプロセスによって処理される。 そのときErlangのプロセスはメッセージを得るために receive という基本操作を行う。 メッセージを得る過程ではパターンマッチングが行われる。 まずメッセージ制御ルーティンが1番目のメッセージに対して各パターンがマッチするかどうか調べる。 2番目以降のメッセージに対しても同様のことを行う。 マッチングは、マッチするメッセージに出会うまで行われる。 メッセージが処理されると、メッセージはメールボックスキューから除去され、プロセスは復帰して続きの処理を行う。 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に似たオペレーティングシステムおよびWindows上で使うことができる。

関連項目[編集]

ウェブサーバ

脚注[編集]

[ヘルプ]
  1. ^ Ulf Wiger (2005年11月14日). “Stress-testing erlang”. comp.lang.functional.misc. 2006年8月25日閲覧。
  2. ^ "Who uses Erlang for product development?" Erlangに関してよく尋ねられる質問集。この資料によるとErlangを最も大規模に採用している組織はエリクソン社である。エリクソン社は電気通信システムの開発にErlangを使っている。同社ではこれまで何十ものプロジェクトでErlangを採用してきた。とりわけ大規模なものは非常にスケーラブルな AXD301 ATM スイッチのプロジェクトである。Erlangを採用しているエリクソン以外の組織としては、Nortel、Deutsche Flugsicherung(航空管制を担うドイツの政府組織)、T-Mobile などが挙げられている。

参考文献[編集]

外部リンク[編集]