この項目では、プログラミング言語のErlang について説明しています。通信トラフィック量を表す同名の単位については「アーラン 」をご覧ください。
LYME is Erlang -based
Erlang (アーラン)は、コンピュータ において汎用的な用途に使うことができる並行処理 指向のオープンソースソフトウェア(英:Open Source Software、略:OSS) プログラミング言語 および実行環境。
概要
Erlang の直列処理 のサブセットの言語は、関数型言語 であり、先行評価を行い、変数 への代入 は1回限りであり、動的型付け である。
Erlang はエリクソン により次の条件のシステムを構築できるよう設計された。
ホットスワップ が可能であり、稼働中のシステムを停止すること無くErlang のプログラム を変更することができる。Erlang は、当初はエリクソン社内部だけで使われる非公開の技術であったが、1998年にオープンソース として公開された。エリクソンによるErlang の実装 は基本的にはインタプリタ であるが、HiPE というコンパイラ も同社の実装に含まれている。ただしHiPE はErlang が動作する全てのプラットフォーム で使えるわけではない。
Erlang においては、マルチスレッド の処理の並行性 はプログラム開発者(プログラマ )にとって明瞭である。これに対し、ほとんどのプログラミング言語においては、マルチスレッドは複雑で誤りを犯しがちな分野である。
Erlang で「プロセス」(スレッド ) を生成し管理する手法はごく平凡な方法である。
命名
Erlang は数学者 のアグナー・アーラン から名前をとって命名された。
一方で、エリクソン社内で非常によく使われたため「Er icsson lang uage 」にちなんで命名されたと一部の人々は思っている。
当時エリクソンのコンピュータ科学研究所の所長であったビャーネ・デッカーによれば、この名前に関する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] さえも、メッセージとして扱うことができる。
ソースコード の例を示す。
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 をオープンソースとして公開する方針を採ってからは、世界中のいくつもの企業によって採用されている。
ノーテル・ネットワークス [ 注釈 8] 、ティー・モバイル[ 注釈 9] 、ドイチェ・フルークズィヒャルング[ 注釈 10] (航空管制を担うドイツ の政府組織)などがErlang を採用している[ 注釈 11] 。同社ではこれまで何十ものプロジェクトでErlang を採用してきた。とりわけ大規模なものは非常にスケーラブルな AXD301 ATM スイッチのプロジェクトである。
2014年にはWhatsApp、ドワンゴ、LINEなどがErlangを採用していることを表明し、2019年には任天堂がErlangを採用していることを表明した。[ 3]
2022年現在、Erlang は活発に開発が続けられており、定期的に新リリースを公開している。
Erlang は、いくつかのUNIXに似たオペレーティングシステム およびWindows 上で使うことができる。
関連項目
ウェブサーバ
脚注
注釈
出典
^ “Releases ”. GitHub. 2024年8月12日 閲覧。
^ Ulf Wiger (2005年11月14日). “Stress-testing Erlang ”. comp.lang.functional.misc . 2006年8月25日 閲覧。
^ https://speakerdeck.com/elixirfest/otp-to-ejabberd-wohuo-yong-sita-nintendo-switch-tm-xiang-ke-hutusiyutong-zhi-sisutemu-npns-false-kai-fa-shi-li
参考文献
外部リンク
低水準言語 高水準言語
1950年代 1960年代 1970年代 1980年代 1990年代 2000年代 2010年代
架空の言語