Erlang

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

## 概要
の直列処理のサブセットの言語は、関数型言語であり、先行評価を行い、変数への代入は1回限りであり、動的型付けである。
はエリクソンにより次の条件のシステムを構築できるよう設計された。
*分散化された環境
*障害に耐性をもつ（IT用語における「フォルトトレラント」）。
*ある程度のリアルタイム性を備える
*無停止で稼働する
ホットスワップが可能であり、稼働中のシステムを停止すること無くのプログラムを変更することができる。は、当初はエリクソン社内部だけで使われる非公開の技術であったが、1998年にオープンソースとして公開された。エリクソンによるの実装は基本的にはインタプリタであるが、というコンパイラも同社の実装に含まれている。ただしはが動作する全てのプラットフォームで使えるわけではない。

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

## 命名
は数学者のアグナー・アーランから名前をとって命名された。
一方で、エリクソン社内で非常によく使われたため「」にちなんで命名されたと一部の人々は思っている。
当時エリクソンのコンピュータ科学研究所の所長であったビャーネ・デッカーによれば、この名前に関する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`を選択する。」と読むことができる。
このようにではリストを非常に簡単に扱うことができる。
では異なる2つのデータ型の値の間であらゆる論理式を評価できるため、式の評価は単純である。
例えば、`1 &lt; a`は`true`を返す。

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

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

```erlang
-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).
```


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

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

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

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

```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.
```

では異なるノード (コンピュータ) に分散した複数のプロセスを互いに連携させて動作させるためのサポートも組み込みで備えている (分散処理) 。
プロセスは遠隔のノードに生成することができ、遠隔ノード上のプロセスとのプロセス間通信は透過的である。
すなわち、遠隔ノード上のプロセスとのプロセス間通信は、同じノード上のプロセスとのプロセス間通信と全く同じように行われる。

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

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

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

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

## 関連項目
*並行計算
*アクターモデル
*ガード (プログラミング)
*
* - を使って開発された XMPP/Jabber インスタントメッセージングサーバ
* - で開発された十分な機能を備え高い性能を発揮する
*Riak - アマゾン・ダイナモの論文に基づいて実装されている NoSQL データベース
ウェブサーバ
* &mdash; 高性能なベンチマークツール

## 脚注

### 注釈

### 出典


## 参考文献
*、2003年、「」、博士論文 (Ph.D.) 、スウェーデン王立ストックホルム工科大学

## 外部リンク
*
* - オープンディレクトリプロジェクト
*  - 日本語によるの解説サイト