Erlang
Erlangのロゴ | |
パラダイム | 宣言型プログラミング、関数型プログラミング、並行計算、マルチパラダイムプログラミング |
---|---|
登場時期 | 1986年 |
開発者 | ジョー・アームストロング、エリクソン、Robert Virding |
最新リリース | 27.0.1/ 2024年7月10日[1] |
型付け | 動的型付け、強い型付け |
主な処理系 |
erl |
影響を受けた言語 | ML、Prolog、LISP、PLEX、Smalltalk、Miranda、Ada、Modula-2、CHILL |
影響を与えた言語 | Scala、Clojure、Elixir |
プラットフォーム | Unix系、Windows、macOS |
ライセンス | Apache-2.0、Erlang Public License |
ウェブサイト |
www |
拡張子 | erl、hrl |
Erlang(アーラン)は、コンピュータにおいて汎用的な用途に使うことができる並行処理指向のオープンソースソフトウェア(英:Open Source Software、略:OSS)プログラミング言語および実行環境。
概要
[編集]Erlangの直列処理のサブセットの言語は、関数型言語であり、先行評価を行い、変数への代入は1回限りであり、動的型付けである。 Erlangはエリクソンにより次の条件のシステムを構築できるよう設計された。
ホットスワップが可能であり、稼働中のシステムを停止すること無くErlangのプログラムを変更することができる。Erlangは、当初はエリクソン社内部だけで使われる非公開の技術であったが、1998年にオープンソースとして公開された。エリクソンによるErlangの実装は基本的にはインタプリタであるが、HiPEというコンパイラも同社の実装に含まれている。ただしHiPEはErlangが動作する全てのプラットフォームで使えるわけではない。
Erlangにおいては、マルチスレッドの処理の並行性はプログラム開発者(プログラマ)にとって明瞭である。これに対し、ほとんどのプログラミング言語においては、マルチスレッドは複雑で誤りを犯しがちな分野である。 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)という関数が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上で使うことができる。
関連項目
[編集]- 並行計算
- アクターモデル
- ガード (プログラミング)
- Concurrency and Coordination Runtime
- ejabberd - Erlangを使って開発された XMPP/Jabber インスタントメッセージングサーバ
- Yaws (ウェブサーバー) - Erlangで開発された十分な機能を備え高い性能を発揮する
- Riak - アマゾン・ダイナモの論文に基づいて実装されている NoSQL データベース
- Tsung — 高性能なベンチマークツール
脚注
[編集]注釈
[編集]出典
[編集]- ^ “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
参考文献
[編集]- Joe Armstrong、2003年、「Making reliable distributed systems in the presence of hardware errors」、博士論文 (Ph.D.) 、スウェーデン王立ストックホルム工科大学
外部リンク
[編集]- 公式ウェブサイト
- Erlang - オープンディレクトリプロジェクト
- Erlang World - 日本語によるErlangの解説サイト