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上で使うことができる。