| パラダイム | マルチパラダイム:並行、関数型、オブジェクト指向 |
|---|---|
| デザイン: |
|
| 開発者 | エリクソン |
| 初登場 | 1986年 |
| 安定リリース | 27.0.1 [1]
/ 2024年7月10日 |
| タイピングの規律 | ダイナミック、力強い |
| ライセンス | Apache ライセンス 2.0 |
| ファイル名拡張子 | .erl、.hrl |
| Webサイト | エルラン |
| 主な実装 | |
| アーラン | |
| 影響を受けた | |
| Lisp、PLEX、[2] Prolog、Smalltalk | |
| 影響を受けた | |
| Akka、Clojure、[3] Dart、Elixir、F#、Opa、Oz、Reia、Rust、[4] Scala、Go | |
Erlang(/ ˈ ɜːr l æ ŋ / UR -lang)は、汎用、並行、関数型の 高水準 プログラミング言語であり、ガベージコレクション付きの ランタイムシステムです。Erlangという用語は、Erlangランタイムシステム、主にErlangで書かれたいくつかのすぐに使用できるコンポーネント(OTP)、およびErlangプログラムの設計原則のセットから構成されるErlang/OTPまたはOpen Telecom Platform(OTP)と同じ意味で使用されます。[5]
Erlangランタイム システムは、次の特性を持つシステム向けに設計されています。
Erlangプログラミング言語には不変データ、パターンマッチング、関数型プログラミングの機能があります。[7] Erlang言語のシーケンシャルサブセットは、積極的評価、単一代入、動的型付けをサポートしています。
通常の Erlang アプリケーションは、数百の小さな Erlang プロセスから構築されます。
もともとはEricsson社内のプロプライエタリソフトウェアであり、 1986年にJoe Armstrong、Robert Virding、Mike Williamsによって開発されましたが、[8] 1998年にフリーのオープンソースソフトウェアとしてリリースされました。 [9] [10] Erlang/OTPは、 EricssonのOpen Telecom Platform (OTP)製品ユニットによってサポートおよび保守されています。
歴史
Erlangという名前は、ビャーネ・デッカーに由来するが、電話交換機に携わっていた人々(この言語は彼らのために設計された)は、デンマークの数学者でエンジニアのアグナー・クラルプ・エルランと「エリクソン言語」の音節略語を指していると推測している。[8] [11] [12] Erlang は、電話アプリケーションの開発を改善することを目的として設計された。[13] Erlang の最初のバージョンはPrologで実装され、初期のエリクソン交換機で使用されていたプログラミング言語PLEXの影響を受けていた。1988 年までに、Erlang は電話交換機のプロトタイプ作成に適していることが証明されたが、Prolog インタプリタは非常に遅すぎた。エリクソン内のあるグループは、実用化するには 40 倍の速度が必要であると見積もった。 1992年に、パフォーマンスとディスク容量のバランスをとるために、ネイティブコンパイルされたコードとスレッド化されたコードを組み合わせてErlangをCにコンパイルするBEAM仮想マシン(VM)の開発が始まりました。 [14]共同発明者のジョー・アームストロングによると、この言語は、1995年に次世代AXE電話交換機であるAXE-Nが崩壊した後、研究室の製品から実際のアプリケーションに移行しました。その結果、Erlangは次の非同期転送モード(ATM)交換機AXDに選ばれました。[8]

1998年2月、エリクソン無線システムズは、非プロプライエタリ言語を優先するとして、新製品での社内Erlangの使用を禁止した。[15]この禁止により、アームストロングらはエリクソンを去る計画を立てた。[16] 1998年3月、エリクソンは、100万行以上のErlangを含み、 9つの「9」の高可用性を達成したと報告したAXD301スイッチ[8]を発表した。[17] 1998年12月、Erlangの実装はオープンソース化され、Erlangチームのほとんどが辞職して新しい会社Bluetail ABを設立した。[8]エリクソンは最終的に禁止を緩和し、2004年にアームストロングを再雇用した。[16]
2006年には、ランタイムシステムとVMにネイティブ対称型マルチプロセッシングのサポートが追加されました。 [8]
プロセス
Erlang アプリケーションは、Erlang ランタイム システム内の非常に軽量な Erlang プロセスで構築されます。Erlang プロセスは、データのカプセル化とメッセージの受け渡し機能を備えた「生きた」オブジェクト (オブジェクト指向プログラミング) として考えることができますが、実行時に動作を変更することができます。Erlang ランタイム システムは、Erlang プロセス間の厳密なプロセス分離(これには、各 Erlang プロセスによって個別に分離されたデータとガベージ コレクションが含まれます) と、異なる Erlang ノード (異なるホスト上) 上のプロセス間の透過的な通信 (場所の透過性を参照) を提供します。
アーランの共同発明者であるジョー・アームストロングは、博士 論文の中でプロセスの原理を次のように要約している。[18]
- すべてはプロセスです。
- プロセスは強力に分離されます。
- プロセスの作成と破棄は軽量な操作です。
- メッセージの受け渡しは、プロセスが対話する唯一の方法です。
- プロセスには一意の名前があります。
- プロセスの名前がわかっている場合は、そのプロセスにメッセージを送信できます。
- プロセスはリソースを共有しません。
- エラー処理は非ローカルです。
- プロセスは、想定どおりに実行するか、失敗します。
ジョー・アームストロングは2013年のRackspaceのインタビューで次のように述べています。「Javaが『一度書けばどこでも実行できる』なら、Erlangは『一度書けば永遠に実行できる』です。」[19]
使用法
2014年にエリクソンは、 Erlangが自社のサポートノード、世界中のGPRS、3G、LTEモバイルネットワーク、さらにノーテルやT-Mobileでも使用されていると報告した。[20]
Erlang はRabbitMQで使用されています。Sun Microsystemsの Web テクノロジ担当ディレクターのTim Bray氏は、2008 年 7 月のO'Reilly Open Source Convention (OSCON) の基調講演で次のように述べています。
もし誰かが私に来て、本当に常時稼働する必要があり、一度に何年もダウンすることが許されない大規模なメッセージ処理システムを構築するために多額のお金を払いたいと言ったら、私はためらうことなく Erlang を使って構築することを選択します。
ErlangはWhatsAppのコーディングに使われるプログラミング言語です。[21]
これは、 XMPPメッセージング サーバーで あるEjabberdの選択言語でもあります。
ElixirはBEAMバイトコード(Erlang Abstract Format経由)にコンパイルされるプログラミング言語です。[22]
Erlangはオープンソースとしてリリースされて以来、通信業界を超えて広がり、フィンテック、ゲーム、ヘルスケア、自動車、モノのインターネット、ブロックチェーンなどの他の垂直市場で地位を確立しています。WhatsApp以外にも、Erlangの成功例として挙げられる企業は、Vocalink(マスターカードの子会社)、ゴールドマン・サックス、任天堂、AdRoll、Grindr、BTモバイル、サムスン、OpenX、SITAなどです。[23] [24]
関数型プログラミングの例
階乗
Erlang で実装された階乗アルゴリズム:
- module ( fact ). % これはファイル 'fact.erl' であり、モジュールとファイル名は一致する必要があります- export ([ fac / 1 ]). % これは、引数 1 の関数 'fac' をエクスポートします (1 つのパラメーター、型なし、名前なし)
fac ( 0 ) -> 1 ; % 0 の場合は 1 を返し、それ以外の場合は (セミコロン ; は 'else' を意味することに注意してください) fac ( N ) N > 0の場合は、is_integer ( N ) -> N * fac ( N - 1 ) です。% 再帰的に決定し、結果を返します% (ピリオド . は 'endif' または 'function end' を意味することに注意してください) %% この関数は、負でない整数以外の値が与えられた場合クラッシュします。%% これは Erlang の「クラッシュさせる」哲学を示しています。
フィボナッチ数列
フィボナッチ数列を生成する末尾再帰アルゴリズム:
%% モジュール宣言はファイル名「series.erl」
- module ( series ) と一致する必要があります。
%% export ステートメント
には、モジュールのパブリック API を構成するすべての関数のリストが含まれています。 この場合、このモジュールは、
1 つの引数 (つまり、引数の数が 1) を取る fib という単一の関数を公開します
。 %% -export の一般的な構文は、各パブリック関数の名前と
引数の数を含むリスト
- export ([ fib / 1 ]) です。
%% ---------------------------------------------------------------------
%% パブリック API
%% ---------------------------------------------------------------------
%% fib/1 が特定の値を受け取るケースを処理します
%% これらの関数シグネチャが宣言される順序は、
このモジュールの機能の重要な部分です
%% fib /1 が負の数を受け取った場合は、アトム err_neg_val を返します。%% 通常、このような防御的なコーディングは Erlang の「クラッシュさせる」哲学により推奨されませんが
、ここでは結果は無限ループになります。fib
( N ) when N < 0 -> err_neg_val ;
%% fib /1 に正確に整数 0 が渡された場合は、0 を返します。fib ( 0 ) -> 0 ;
%% その他のすべての値については、プライベート関数 fib_int/3 を呼び出して、
fib ( N ) -> fib_int ( N - 1 , 0 , 1 )の計算を実行します
。
%% ---------------------------------------------------------------------
%% プライベート API
%% ---------------------------------------------------------------------
%% fib_int/3 が最初の引数として 0 を受け取った場合は完了なので、
%% 引数 B の値を返します。2 番目の引数は、
その値を無視するために _ で示されます。 %%
fib_int ( 0 , _, B ) -> B ;
%% その他のすべての引数の組み合わせについては、fib_int/3 を再帰的に呼び出します。
%% 各呼び出しでは次の処理が行われます:
%% - カウンター N を減分し
ます。%% - 3 番目の引数を新しい 2 番目の引数として渡します。%% - 2 番目と 3 番目の引数の合計を新しい
3 番目の引数として渡します。%%
fib_int ( N 、A 、B ) -> fib_int ( N - 1 、B 、A + B )。
コメントを省略すると、プログラムがはるかに短くなります。
-モジュール(シリーズ)。
-エクスポート([ fib / 1 ])。
fib ( N )、N < 0の場合-> err_neg_val 、fib ( 0 ) -> 0 、fib ( N ) -> fib_int ( N - 1 、0 、1 )。
fib_int ( 0 , _, B ) -> B ; fib_int ( N , A , B ) -> fib_int ( N - 1 , B , A + B )。
クイックソート
リスト内包表記を用いたErlangのクイックソート: [25]
%% qsort:qsort(List)
%% アイテムのリストをソートします
-モジュール( qsort )。% これはファイル 'qsort.erl' です-エクスポート([ qsort / 1 ])。% 1 つのパラメータを持つ関数 'qsort' がエクスポートされます (型なし、名前なし)
qsort ([]) -> []; % リスト [] が空の場合、空のリスト (ソートするものがない) を返します。qsort ([ Pivot | Rest ]) -> % 'Pivot' の前のすべての要素を 'Front' でリストを作成し、次に 'Pivot'、次に 'Pivot' の後のすべての要素を 'Back' でリストを再帰的に作成します。qsort ([ Front || Front <- Rest , Front < Pivot ]) ++ [ Pivot ] ++ qsort ([ Back || Back <- Rest , Back >= Pivot ])。
qsort上記の例では、ソート対象がなくなるまで関数を再帰的に呼び出します。式はリストの内包表記[Front || Front <- Rest, Front < Pivot]で、「のメンバーであり、より小さい要素のリストを構築する」という意味です。はリスト連結演算子です。
FrontFrontRestFrontPivot++
読みやすさを考慮して、より複雑な構造には比較関数を使用できます。
次のコードはリストを長さに従ってソートします。
% これはファイル 'listsort.erl' です (コンパイラはこのように作成されます)
-モジュール( listsort )。
% 1 つのパラメータを持つ 'by_length' をエクスポートします (型と名前は気にしません)
- export ([ by_length / 1 ])。
by_length ( Lists ) -> % 'qsort/2' を使用し、匿名関数をパラメータとして提供しますqsort ( Lists , fun ( A , B ) -> length ( A ) < length ( B ) end )。
qsort ([], _) -> []; % リストが空の場合は、空のリストを返します (2 番目のパラメーターは無視します) qsort ([ Pivot | Rest ], Smaller ) -> % リストを 'Pivot' の前の 'Smaller' 要素と'Pivot' の後の 'Smaller' でない要素で分割し、サブリストをソートします。qsort ([ X || X <- Rest , Smaller ( X , Pivot )], Smaller ) ++ [ Pivot ] ++ qsort ([ Y || Y <- Rest , not ( Smaller ( Y , Pivot ))], Smaller ).
はPivotに与えられた最初のパラメータから取られqsort()、 の残りは とLists名付けられますRest。式
[ X || X <-残り、小さい( X 、ピボット)]
形式的には
[フロント||フロント<-レスト、フロント<ピボット]
(前の例では)最後の部分で比較関数が使用されている点が異なります。「が のメンバーであり、 が真であるXような要素のリストを構築します」と書かれていますが、これは先ほど定義したとおりです。
XRestSmallerSmaller
楽しい( A , B ) ->長さ( A ) <長さ( B )終了
匿名関数は、Smallerの 2 番目の定義のパラメータ リストで名前が付けられているqsortため、その関数内でその名前で参照できます。 の最初の定義では名前が付けられていません。qsortこれは、空のリストという基本ケースを扱うため、この関数は必要なく、名前も必要ありません。
データ型
Erlang には 8 つの基本データ型があります。
- 整数
- 整数は 10 進数のシーケンスとして記述されます。たとえば、12、12375、-23427 は整数です。整数演算は正確であり、マシンで使用可能なメモリによってのみ制限されます。(これは任意精度演算と呼ばれます。)
- 原子
- アトムは、プログラム内で区別された値を表すために使用されます。アトムは、最初の文字が小文字である連続した英数字の文字列として記述されます。アトムは、一重引用符で囲まれ、アトム内で任意の文字を使用できるエスケープ規則が存在する場合、任意の文字を含めることができます。アトムはガベージ コレクションされないため、特に動的なアトム生成を使用する場合は注意して使用する必要があります。
- フロート
- 浮動小数点数はIEEE 754 64 ビット表現を使用します。
- 参考文献
- 参照は、グローバルに一意なシンボルであり、その唯一の特性は、等しいかどうかを比較できることです。参照は、Erlang プリミティブを評価することによって作成されます
make_ref()。 - バイナリ
- バイナリはバイトのシーケンスです。バイナリは、バイナリ データをスペース効率よく保存する方法を提供します。バイナリの合成と分解、およびバイナリの効率的な入出力のために、Erlang プリミティブが存在します。
- ピッド
- Pid はプロセス識別子の略です 。Pid は Erlang プリミティブによって作成され、
spawn(...)Pid は Erlang プロセスへの参照です。 - ポート
- ポートは外部との通信に使用されます。ポートは組み込み関数を使用して作成されます
open_port。ポートとの間でメッセージを送受信できますが、これらのメッセージはいわゆる「ポート プロトコル」に従う必要があります。 - 楽しみ
- Fun は関数のクロージャです。Fun は次の形式の式によって作成されます
fun(...) -> ... end。
3 つの複合データ型:
- タプル
- タプルは、一定数の Erlang データ型を格納するコンテナです。構文は、
{D1,D2,...,Dn}引数が であるタプルを表します。D1, D2, ... Dn.引数は、プリミティブ データ型または複合データ型にすることができます。タプルの任意の要素に定数時間でアクセスできます。 - リスト
- リストは、可変数の Erlang データ型を格納するコンテナです。 構文は、
[Dh|Dt]最初の要素が でDh、残りの要素がリスト であるリストを表しますDt。 構文は[]空のリストを表します。 構文は[D1,D2,..,Dn]の短縮形です[D1|[D2|..|[Dn|[]]]]。リストの最初の要素には、定数時間でアクセスできます。リストの最初の要素は、リストの先頭と呼ばれます。先頭を削除したリストの残りの部分は、リストの末尾と呼ばれます。 - 地図
- マップには、可変数のキーと値の関連付けが含まれます。構文は次のとおりです
#{Key1=>Value1,...,KeyN=>ValueN}。
2 つの形式の構文糖衣が提供されています:
- 文字列
- 文字列は二重引用符で囲まれた文字のリストとして記述されます。これは文字列内の文字の整数Unicodeコード ポイントのリストを表す構文糖です。したがって、たとえば文字列 "cat" は の省略形です
[99,97,116]。[26] - 記録
- レコードは、タプル内の各要素にタグを関連付ける便利な方法を提供します。これにより、位置ではなく名前でタプルの要素を参照できます。プリコンパイラはレコード定義を取得し、適切なタプル参照に置き換えます。
Erlangにはクラスを定義する方法はありませんが、外部ライブラリは利用可能です。[27]
「クラッシュさせる」コーディングスタイル
Erlang は、他の多くのプログラミング言語で使用されている例外処理のようなプロセス内メカニズムではなく、外部プロセスがクラッシュ (またはハードウェア障害) を簡単に監視できるメカニズムで設計されています。クラッシュは他のメッセージと同様に報告され、これがプロセスが互いに通信できる唯一の方法であり、[28]サブプロセスは安価に生成できます (以下を参照)。「クラッシュさせる」という哲学は、重大な障害からの回復を試みることよりも、プロセスを完全に再起動することを好みます。[29]エラー処理は依然として必要ですが、この哲学により、エラー処理コードが高度にコンテキスト依存的で特定の防御プログラミングに割り当てられるコードが少なくなります。[28]
スーパーバイザーツリー
典型的な Erlang アプリケーションは、スーパーバイザ ツリーの形式で記述されます。このアーキテクチャは、最上位のプロセスが「スーパーバイザ」と呼ばれるプロセスの階層に基づいています。スーパーバイザは、ワーカーまたはより下位のスーパーバイザとして機能する複数の子プロセスを生成します。このような階層は任意の深さまで存在でき、アプリケーション機能を実装できる高度にスケーラブルでフォールト トレラントな環境を提供することが実証されています。
スーパーバイザ ツリー内では、すべてのスーパーバイザ プロセスが子プロセスのライフサイクルを管理する責任があり、これには子プロセスがクラッシュする状況の処理も含まれます。どのプロセスも、最初に子プロセスを生成し、次にerlang:monitor/2そのプロセスを呼び出すことでスーパーバイザになることができます。監視対象のプロセスがクラッシュすると、スーパーバイザは、最初のメンバーがアトムであるタプルを含むメッセージを受信します'DOWN'。スーパーバイザは、まずそのようなメッセージをリッスンし、次にエラー状態を修正するために適切なアクションを実行する責任があります。
並行性と分散指向
Erlang の主な強みは並行性のサポートです。プロセスを作成し、プロセス間で通信するための、小さいながらも強力なプリミティブ セットがあります。Erlang は概念的には言語occamに似ていますが、関数型フレームワークで順次プロセス通信(CSP)のアイデアを再構築し、非同期メッセージ パッシングを使用します。 [30]プロセスは、Erlang アプリケーションを構成する主な手段です。プロセスはオペレーティング システム プロセスでもスレッドでもなく、 BEAM によってスケジュールされる軽量プロセスです。オペレーティング システム プロセスと同様に (ただしオペレーティング システム スレッドとは異なり)、プロセスは相互に状態を共有しません。それぞれの推定最小オーバーヘッドは 300ワードです。[31]したがって、パフォーマンスを低下させることなく、多くのプロセスを作成できます。2005 年には、16 GB のランダム アクセス メモリ(RAM、プロセスあたり合計 800 バイト)を搭載したマシンで、64 ビット Erlang を使用して 2,000 万プロセスのベンチマークが正常に実行されました。[32] Erlangは2006年5月のリリースR11B以降 対称型マルチプロセッシングをサポートしています。
ほとんどの言語ではスレッドは外部ライブラリのサポートを必要としますが、Erlangは並行プログラミングを簡素化することを目的として、プロセスを作成および管理するための言語レベルの機能を提供します。Erlangではすべての並行性が明示的ですが、プロセスは共有変数ではなくメッセージパッシングを使用して通信するため、明示的なロックは必要ありません(VM内部ではロックスキームが引き続き使用されます)。[33]
プロセス間通信は、共有なしの 非同期 メッセージ パッシングシステムを介して機能します。すべてのプロセスには、他のプロセスによって送信され、まだ消費されていないメッセージのキューである「メールボックス」があります。プロセスはreceive、プリミティブを使用して、目的のパターンに一致するメッセージを取得します。メッセージ処理ルーチンは、メッセージが一致するまで、各パターンに対してメッセージを順番にテストします。メッセージが消費され、メールボックスから削除されると、プロセスは実行を再開します。メッセージは、プリミティブ (整数、浮動小数点数、文字、アトム)、タプル、リスト、関数など、任意の Erlang 構造で構成できます。
以下のコード例は、分散プロセスの組み込みサポートを示しています。
% プロセスを作成し、関数 web:start_server(Port, MaxConnections) を呼び出します。
ServerProcess = spawn ( web , start_server , [ Port , MaxConnections ]),
% リモートプロセスを作成し、マシン RemoteNode で関数 % web:start_server(Port, MaxConnections)を呼び出します。RemoteProcess = spawn ( RemoteNode 、web 、start_server 、[ Port 、MaxConnections ])、
% ServerProcess にメッセージを送信します (非同期)。メッセージは、
アトム "pause" と数値 "10" のタプルで構成されます。ServerProcess ! { pause , 10 },
% このプロセスに送信されたメッセージを受信します
。receive a_message -> do_something ; { data , DataContent } -> handle ( DataContent ); { hello , Text } -> io : format ( "Got hello message: ~ s " , [ Text ]); { goodbye , Text } -> io : format ( "Got goodbye message: ~s " , [ Text ]) end .
例が示すように、プロセスはリモート ノード上に作成され、リモート プロセスとの通信はローカル プロセスとの通信とまったく同じように機能するという意味で、それらのプロセスとの通信は透過的です。
並行性は、Erlangにおけるエラー処理の主要な方法をサポートします。プロセスがクラッシュすると、プロセスはきちんと終了し、制御プロセスにメッセージを送信します。制御プロセスは、古いプロセスのタスクを引き継ぐ新しいプロセスを開始するなどのアクションを実行します。[34] [35]
実装
Erlangの公式リファレンス実装はBEAMを使用しています。[36] BEAMはErlang/OTPと呼ばれるErlangの公式ディストリビューションに含まれています。BEAMはバイトコードを実行し、ロード時にスレッドコードに変換されます。また、ほとんどのプラットフォームでネイティブコードコンパイラも含まれています。これはウプサラ大学のHigh Performance Erlang Project (HiPE)によって開発されました。2001年10月以来、HiPEシステムはEricssonのオープンソースErlang/OTPシステムに完全に統合されています。[37]また、ErlangのR11B-5リリース以降、スクリプトを介して 抽象構文木を介してソースコードから直接解釈することもサポートされています。
ホットコードの読み込みとモジュール
Erlang は、言語レベルの動的ソフトウェア更新をサポートしています。これを実装するために、コードは「モジュール」ユニットとしてロードされ、管理されます。モジュールはコンパイル ユニットです。システムは、モジュールの 2 つのバージョンを同時にメモリに保持することができ、プロセスはそれぞれのコードを同時に実行できます。バージョンは、「新しい」バージョンと「古い」バージョンと呼ばれます。プロセスは、モジュールへの外部呼び出しを行うまで、新しいバージョンに移行しません。
ホットコードロードのメカニズムの例:
%% カウンターを保持することだけを目的とするプロセス。
%% 最初のバージョン- module ( counter )。- export ([ start / 0 , codeswitch / 1 ])。
開始() ->ループ( 0 )。
loop ( Sum ) -> receive { increment , Count } -> loop ( Sum + Count ); { counter , Pid } -> Pid ! { counter , Sum }, loop ( Sum ); code_switch -> ? MODULE : codeswitch ( Sum ) % 最新の MODULE バージョンの 'codeswitch/1' の使用を強制しますend .
コードスイッチ( Sum ) ->ループ( Sum )。
2 番目のバージョンでは、カウントをゼロにリセットする可能性を追加します。
%% 2 番目のバージョン
-モジュール( counter )。-エクスポート([ start / 0 , codeswitch / 1 ])。
開始() ->ループ( 0 )。
loop ( Sum ) -> accept { increment , Count } -> loop ( Sum + Count ); reset -> loop ( 0 ); { counter , Pid } -> Pid ! { counter , Sum }, loop ( Sum ); code_switch -> ? MODULE : codeswitch ( Sum ) end .
コードスイッチ( Sum ) ->ループ( Sum )。
アトムで構成されるメッセージを受信した場合のみ、code_switchループは codeswitch/1 (?MODULE現在のモジュールのプリプロセッサ マクロ) への外部呼び出しを実行します。メモリ内にcounterモジュールの新しいバージョンがある場合は、その codeswitch/1 関数が呼び出されます。新しいバージョンへの特定のエントリ ポイントを持つことで、プログラマーは状態を新しいバージョンで必要なものに変換できます。例では、状態は整数として保持されます。
実際には、システムは Open Telecom Platform の設計原則を使用して構築され、これにより、より多くのコードをアップグレード可能な設計が実現します。ホット コードの読み込みを成功させるには厳密な手順が必要です。Erlang の機能を活用するには、コードを注意深く記述する必要があります。
分布
1998 年、Ericsson は Erlang をフリーのオープンソース ソフトウェアとしてリリースし、単一ベンダーからの独立性を確保し、言語の認知度を高めました。Erlang は、ライブラリやリアルタイム分散データベースMnesiaとともに、OTP ライブラリ コレクションを形成します。Ericsson と他の数社が Erlang を商業的にサポートしています。
オープンソースとしてリリースされて以来、ErlangはNortelやT-Mobileなど世界中の多くの企業で使用されています。[38] Erlangはニッチな市場を埋めるために設計されたため、存在してからほとんど知られていない言語でしたが、並行サービスの需要により人気が高まっています。[39] [40] Erlangは、大規模多人数参加型オンラインロールプレイングゲーム(MMORPG)サーバーの 実装にも使用されています。 [41]
参照
- Elixir – BEAM上で動作する関数型、並行型、汎用プログラミング言語
- Luerl - Erlang の作成者の 1 人によって設計および実装された、BEAM 上の Lua。
- Lisp Flavored Erlang (LFE) – BEAM上で動作するLispベースのプログラミング言語
- ミックス(ビルドツール)
- Phoenix (ウェブフレームワーク)
- Gleam (プログラミング言語)
参考文献
- ^ 「リリース 27.0.1」。2024年7月10日。 2024年7月19日閲覧。
- ^ カンファレンス、NDC (2014 年 6 月 4 日)。「ジョー・アームストロング - 関数型プログラミング、啓蒙への長い道のり: 歴史的かつ個人的な物語」。Vimeo。
- ^ 「Clojure: Lisp と Java の出会い、そして Erlang も加わる - O'Reilly Radar」。rader.oreilly.com。
- ^ 「影響 - The Rust Reference」。The Rust Reference 。 2023年4月18日閲覧。
- ^ 「Erlang – はじめに」. erlang.org .
- ^ Armstrong, Joe; Däcker, Bjarne; Lindgren, Thomas; Millroth, Håkan. 「オープンソース Erlang – ホワイトペーパー」。2011年10月25日時点のオリジナルよりアーカイブ。2011年7月31日閲覧。
- ^ ヒッチハイカーのBEAMツアー – Robert Virding http://www.erlang-factory.com/upload/presentations/708/HitchhikersTouroftheBEAM.pdf
- ^ abcdef Armstrong, Joe (2007). Erlangの歴史. HOPL III: プログラミング言語の歴史に関する第3回ACM SIGPLAN会議の議事録. ISBN 978-1-59593-766-7。
- ^ “How tech giants spread open source programming love - CIO.com”. 2016年1月8日. 2019年2月22日時点のオリジナルよりアーカイブ。 2016年9月5日閲覧。
- ^ 「Erlang/OTP がオープンソースとしてリリースされました、1998-12-08」。1999年10月9日時点のオリジナルよりアーカイブ。
- ^ 「数学者アーラン?」 1999 年 2 月。
- ^ 「無料オンラインコンピューティング辞書: Erlang」。
- ^ 「Erlang の歴史」Erlang.org。
- ^ Armstrong, Joe (1997 年8 月)。「Erlang の開発」。関数型プログラミングに関する第 2 回 ACM SIGPLAN 国際会議の議事録。第 32 巻。pp. 196–203。doi : 10.1145 /258948.258967。ISBN 0897919181. S2CID 6821037。
{{cite book}}:|journal=無視されました (ヘルプ) - ^ Däcker, Bjarne (2000 年 10 月)。通信のための並行関数型プログラミング: 技術導入のケース スタディ(PDF) (論文)。英国王立工科大学。37 ページ。
- ^ ab 「Erlang の将来についての質問」2010 年 7 月 6 日。
- ^ 「Erlang での並行性指向プログラミング」(PDF) 2002 年 11 月 9 日。
- ^ Armstrong, Joe (2003 年 11 月 20 日)。ソフトウェア エラーが発生した場合でも信頼性の高い分散システムを構築する(DTech 論文)。スウェーデン、ストックホルム: 王立工科大学。
- ^ McGreggor, Duncan (2013年3月26日). Rackspaceが分散コンピューティング向けプログラミング言語Erlangを検証(動画). Rackspace Studios, SFO. 2021年12月11日時点のオリジナルよりアーカイブ。 2019年4月24日閲覧。
- ^ 「Ericsson」. Ericsson.com . 2014年12月4日. 2018年4月7日閲覧。
- ^ 「WhatsAppの成功の背後にある稀有なプログラミング言語、Erlangの内部」fastcompany.com 2014年2月21日2019年11月12日閲覧。
- ^ 「Erlang/Elixir 構文: クラッシュコース」elixir-lang.github.com . 2022 年10 月 10 日閲覧。
- ^ 「どの企業が Erlang を使用していますか? また、その理由は? #MyTopdogStatus」. erlang-solutions.com . 2019 年 9 月 11 日. 2020 年3 月 15 日閲覧。
- ^ 「どの新しい企業がErlangとElixirを使用していますか? #MyTopdogStatus」erlang-solutions.com . 2020年3月2日. 2020年6月24日閲覧。
- ^ 「Erlang – リストの内包表記」. erlang.org .
- ^ 「文字列と文字リテラル」 。2015年5 月 2 日閲覧。
- ^ 「ect – Erlang クラス変換 – Erlang にオブジェクト指向プログラミングを追加 – Google プロジェクト ホスティング」 。2015年5 月 2 日閲覧。
- ^ ab Verraes, Mathias (2014年12月9日). 「Let It Crash」. Mathias Verraesのブログ. 2021年2月10日閲覧。
- ^ 「Reactive Design Patterns —」www.reactivedesignpatterns.com . 2021年2月10日閲覧。
- ^ Armstrong, Joe (2010 年 9 月). 「Erlang」. Communications of the ACM . 53 (9): 68–75. doi : 10.1145/1810891.1810910 .
Erlang は概念的には occam プログラミング言語に似ていますが、CSP のアイデアを関数型フレームワークで作り直し、非同期メッセージ パッシングを使用しています。
- ^ 「Erlang 効率ガイド – プロセス」。2015 年 2 月 27 日時点のオリジナルよりアーカイブ。
- ^ Wiger, Ulf (2005 年 11 月 14 日). 「Stress-testing erlang」. comp.lang . functional.misc . 2006 年8 月 25 日閲覧。
- ^ 「ロックフリーメッセージキュー」。2013年12月24日時点のオリジナルよりアーカイブ。 2013年12月23日閲覧。
- ^ Armstrong, Joe. 「Erlang の堅牢性」。2015 年 4 月 23 日時点のオリジナルよりアーカイブ。2010年7 月 15 日閲覧。
- ^ 「Erlang Supervision の原則」。2015年2月6日時点のオリジナルよりアーカイブ。2010年7月15日閲覧。
- ^ 「Erlang – コンパイルとコードのロード」。erlang.org 。 2017年12月21日閲覧。
- ^ 「High Performance Erlang」 。 2011年3月26日閲覧。
- ^ 「製品開発に Erlang を使用しているのは誰ですか?」。Erlang に関するよくある質問。2007年7 月 16 日閲覧。Erlang
の最大のユーザーは (意外にも!) Ericsson です。Ericsson は、通信システムで使用されるソフトウェアの作成に Erlang を使用しています。多数のプロジェクトで Erlang が使用されており、特に大規模なプロジェクトは、極めてスケーラブルな AXD301 ATM スイッチです。FAQ
に挙げられているその他の商用ユーザーには、Nortel、Deutsche Flugsicherung (ドイツの国立
航空管制
機関)、T-Mobile などがあります。
- ^ 「Erlang プログラミング」 。2008年12 月 13 日閲覧。
事実上、すべての言語は共有状態の並行性を使用します。これは非常に難しく、障害を処理してシステムを拡張するときにひどい問題を引き起こします...金融業界の非常に動きの速い新興企業は Erlang を採用しています。たとえば、スウェーデンの www.kreditor.se などです。
- ^ 「Erlang、次の Java」。2007 年 10 月 11 日のオリジナルからアーカイブ。2008年10 月 8 日に取得。
他の言語がすぐに Erlang に追いつくとは思えません。他の言語が Erlang のような言語機能を追加するのは簡単です。このような高品質の VM と、並行性と信頼性のための成熟したライブラリを構築するには長い時間がかかるでしょう。したがって、Erlang は成功する準備ができています。今後数年間でマルチコア アプリケーションを構築したい場合は、Erlang を検討する必要があります。
- ^ Clarke, Gavin (2011 年 2 月 5 日)。「Battlestar Galactica のベテランがオンライン ロールプレイに必要」。Music and Media。The Reg。2011年2 月 8 日閲覧。
さらに読む
- Armstrong, Joe (2003). ソフトウェアエラーが発生した場合の信頼性の高い分散システムの構築(PDF) (PhD). スウェーデン王立工科大学、ストックホルム。 2015年3月23日時点のオリジナル(PDF)からアーカイブ。 2016年2月13日閲覧。
- Armstrong, Joe (2007)。 「 Erlang の歴史」。プログラミング言語の歴史に関する第 3 回 ACM SIGPLAN 会議議事録 - HOPL III。pp. 6–1。doi :10.1145 / 1238844.1238850。ISBN 978-1-59593-766-7. S2CID 555765。
- Erlangの初期の歴史 2019年8月29日、Bjarne DäckerによってWayback Machineにアーカイブされました
- Mattsson, H.; Nilsson, H.; Wikstrom, C. (1999). 「Mnesia – 通信アプリケーション向けの分散型堅牢 DBMS」。宣言型言語の実用的側面に関する第 1 回国際ワークショップ (PADL '99) : 152–163。
- Armstrong, Joe; Virding, Robert; Williams, Mike; Wikstrom, Claes ( 1996年 1 月 16 日)。Erlang による並行プログラミング (第 2 版)。Prentice Hall。p. 358。ISBN 978-0-13-508301-72012年3月6日時点のオリジナルよりアーカイブ。
- アームストロング、ジョー (2007 年 7 月 11 日)。プログラミング Erlang: 並行世界のためのソフトウェア(第 1 版)。プラグマティック ブックシェルフ。p. 536。ISBN 978-1-934356-00-5。
- Thompson, Simon J.; Cesarini, Francesco ( 2009年 6 月 19 日)。Erlang プログラミング: ソフトウェア開発への並行アプローチ (第 1 版)。カリフォルニア州セバストポル: O'Reilly Media , Inc. p. 496。ISBN 978-0-596-51818-9。
- Logan, Martin; Merritt, Eric; Carlsson, Richard (2010 年 5 月 28 日)。Erlangと OTP の実践(第 1 版)。コネチカット州グリニッジ: Manning Publications。p . 500。ISBN 978-1-933988-78-8。
- Martin, Brown (2011 年5月 10 日)。「Erlang プログラミング入門、パート 1: 基礎」。developerWorks。IBM。2011年5 月 10 日閲覧。
- Martin, Brown (2011 年5月 17 日)。「Erlang プログラミング入門、パート 2: 高度な機能の使用」。developerWorks。IBM。2011年5月 17 日閲覧。
- Wiger, Ulf (2001 年 3 月 30 日)。「生産性と品質が 4 倍向上: 通信クラス製品における産業用強度関数型プログラミング」(PDF)。FEmSYS 2001 分散アーキテクチャへの展開。Ericsson Telecom AB。2019年 8 月 19 日時点のオリジナル(PDF)からアーカイブ。2014年9 月 16 日閲覧。
外部リンク
- 「アーラン:ザ・ムービー」
- 公式サイト
