Erlang

daは、コンピュータにおいて汎用的な用途に使うことができる並行処理指向のオープンソースソフトウェアプログラミング言語および実行環境。

1. 概要
-----

daの直列処理のサブセットの言語は、関数型言語であり、先行評価を行い、変数への代入は1回限りであり、動的型付けである。 daはエリクソンにより次の条件のシステムを構築できるよう設計された。

分散化された環境
障害に耐性をもつ。
ある程度のリアルタイム性を備える
無停止で稼働するホットスワップが可能であり、稼働中のシステムを停止すること無くdaのプログラムを変更することができる。daは、当初はエリクソン社内部だけで使われる非公開の技術であったが、1998年にオープンソースとして公開された。エリクソンによるdaの実装は基本的にはインタプリタであるが、enというコンパイラも同社の実装に含まれている。ただしenはdaが動作する全てのプラットフォームで使えるわけではない。

daにおいては、マルチスレッドの処理の並行性はプログラム開発者にとって明瞭である。これに対し、ほとんどのプログラミング言語においては、マルチスレッドは複雑で誤りを犯しがちな分野である。 daで「プロセス」 を生成し管理する手法はごく平凡な方法である。

2. 命名
-----

daは数学者のアグナー・アーランから名前をとって命名された。 一方で、エリクソン社内で非常によく使われたため「en」にちなんで命名されたと一部の人々は思っている。 当時エリクソンのコンピュータ科学研究所の所長であったビャーネ・デッカーによれば、この名前に関する2重性については意図的なものだとのことである。

3. 関数型言語
--------

daのソースコードの例を示す。

-module. -export.

fac -> 1; fac when N > 0 -> N *fac.<WtXmlEndTag /> 次のソースコードはdaによるクイックソートのアルゴリズムの実装である。 %% quicksort:qsort %% Sort a list of items -module. -export.

qsort -> []; qsort -> qsort ++ [Pivot] ++ qsort.<WtXmlEndTag /> この例では関数qsortの再帰呼び出しを行っている。 再帰呼び出しはソート処理の対象が無くなった時点で終了する。式[ X||X <- Rest, X < Pivot]は「 XをRestの要素として、XがPivotより小さい全てのXを選択する。」と読むことができる。 このようにdaではリストを非常に簡単に扱うことができる。 daでは異なる2つのデータ型の値の間であらゆる論理式を評価できるため、式の評価は単純である。 例えば、1 < aはtrueを返す。

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

次のソースコードではリストをリスト要素の長さを基準にしてソートする。 -module. -export. %% まずby_lengthが実行され　関数funという関数がＦに代入されてからqsortが実行される %% qSortは大小の比較関数としてby_lengthで定義したSmallerつまりＦを使っている by_length -> F=fun when is_list, is_list -> length < length end, qsort.

qsort -> []; qsort -> qsort], Smaller) ++ [Pivot] ++ qsort)], Smaller).<WtXmlEndTag />

4. 並行処理指向で分散処理指向の言語
-------------------

daの主な特長は、並行処理のサポートである。 daにおける並行処理は、複数の「プロセス」を生成し、それらの間で通信を行うための、簡潔で強力な機能群によって支えられている。 なお、daが提供する「プロセス」は、オペレーティングシステムが提供するプロセスやスレッドとは異なり、daの仮想機械によって管理される。 「プロセス」の生成オーバーヘッドは約300ワード程度に抑えられており、大量の「プロセス」を、性能を低下させずに生成できる。 あるベンチマークでは2000万個の「プロセス」を並行実行できることが示された。

これ以降の記述ではdaにおける「プロセス」を括弧無しで言及する。

daにおけるプロセス間の通信は、非共有かつ非同期のメッセージ転送システムによって行われる。 daのプロセスは全てそれぞれの「メールボックス」をもつ。 メールボックスには他のプロセスから受信したメッセージが格納される。 その後、メールボックスに格納されたメッセージがメールボックスを所有するプロセスによって処理される。 そのときdaのプロセスはメッセージを得るためにreceiveという基本操作を行う。 メッセージを得る過程ではパターンマッチングが行われる。 まずメッセージ制御ルーティンが1番目のメッセージに対して各パターンがマッチするかどうか調べる。 2番目以降のメッセージに対しても同様のことを行う。 マッチングは、マッチするメッセージに出会うまで行われる。 メッセージが処理されると、メッセージはメールボックスキューから除去され、プロセスは復帰して続きの処理を行う。 daの構成要素は何であれメッセージとして使うことができる。 daの基本要素である整数、浮動小数点数、文字、アトムも、またタプル、リスト、さらには関数さえも、メッセージとして扱うことができる。

ソースコードの例を示す。 Pid=spawn % execute function Func as new process Pid=spawn % execute function Func in remote node Node

Pid ! a_message % send message to the process 

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; {goodbye, Text} -> io:format end.<WtXmlEndTag /> daでは異なるノード  に分散した複数のプロセスを互いに連携させて動作させるためのサポートも組み込みで備えている  。 プロセスは遠隔のノードに生成することができ、遠隔ノード上のプロセスとのプロセス間通信は透過的である。 すなわち、遠隔ノード上のプロセスとのプロセス間通信は、同じノード上のプロセスとのプロセス間通信と全く同じように行われる。

daでの並行処理では、エラー処理の基本的な方法をサポートしている。 あるプロセスが異常をきたすと、プロセスは手際良く終了し、そのプロセスを制御しているプロセス  にメッセージを送信する。 このエラー処理の方法により、ソースコードの保守性を高め複雑性を低減することができる。

5. 配布
-----

エリクソンはdaをオープンソースとして、1998年に公開した。 その意図は、特定企業からの独立性を確保することと、daに対する人々の認知を高めることであった。ライブラリとリアルタイムデータベース「en」と共に配布される daプログラミング言語の配布形式は、en  と呼ばれている。 エリクソンおよび数社の企業は、da技術に対する商用サポートを提供している。

daをオープンソースとして公開する方針を採ってからは、世界中のいくつもの企業によって採用されている。ノーテル・ネットワークス、ティー・モバイル、ドイチェ・フルークズィヒャルングなどがdaを採用している。同社ではこれまで何十ものプロジェクトでdaを採用してきた。とりわけ大規模なものは非常にスケーラブルな AXD301 ATM スイッチのプロジェクトである。 2014年にはWhatsApp、ドワンゴ、LINEなどがErlangを採用していることを表明し、2019年には任天堂がErlangを採用していることを表明した。

2022年現在、daは活発に開発が続けられており、定期的に新リリースを公開している。 daは、いくつかのUNIXに似たオペレーティングシステムおよびen上で使うことができる。

6. 関連項目
-------

並行計算
アクターモデル
ガード 
ejabberd - daを使って開発された XMPP/Jabber インスタントメッセージングサーバ
Yaws  - daで開発された十分な機能を備え高い性能を発揮する
Riak - アマゾン・ダイナモの論文に基づいて実装されている NoSQL データベースウェブサーバ

Tsung — 高性能なベンチマークツール

7. 脚注
-----

7.1. 注釈
-------

7.2. 出典
-------

8. 参考文献
-------

sv、2003年、「[1]」、博士論文  、スウェーデン王立ストックホルム工科大学

9. 外部リンク
--------

[2] - オープンディレクトリプロジェクト
[3] - 日本語によるdaの解説サイト