Erlang(プログラミング言語)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

Erlang
Erlangのlogo.svg
パラダイムマルチパラダイム同時機能
によって設計された
デベロッパーエリクソン
初登場1986 ; 35年まえ (1986
安定リリース
24.1.6 [1] ウィキデータでこれを編集する / 2021年11月18日; 13日前 (202111月18日
規律の入力ダイナミック強い
ライセンスApacheライセンス2.0
ファイル名拡張子.erl、.hrl
Webサイトwww .erlang .org
主な実装
Erlang
に影響を受けた
LispPLEX[2] PrologSmalltalk
影響を受ける
AkkaClojure [要出典]DartElixirF#OpaOzReiaRustScalaGo

アーラン/ ɜːr L æ ŋ / UR -lang)である汎用[要出典]同時機能 プログラミング言語、およびガベージコレクション ランタイムシステム。アーランはアーラン/ OTP、またはと互換的に使用される用語オープン通信プラットフォーム(OTP)、アーランから成るランタイムシステム、主にErlangで書かれたいくつかのすぐに使用できる構成要素(OTP)、および一連の設計原理アーラン用プログラム。[3]

Erlangランタイムシステムは、次の特性を持つシステム向けに設計されています。

Erlangプログラミング言語には、不変のデータ、パターンマッチング関数型プログラミングがあります。[5] Erlang言語のシーケンシャルサブセットは、先行評価単一割り当て、および動的型付けをサポートます

通常のErlangアプリケーションは、何百もの小さなErlangプロセスから構築されています。

もともとはエリクソン内のプロプライエタリソフトウェアであり、1986年にジョーアームストロング、ロバートヴァーディング、マイクウィリアムズによって開発されましたが[6]、1998年にフリーでオープンソースのソフトウェアとしてリリースされました。[7] [8] Erlang / OTPはサポートされています。エリクソンのOpenTelecom Platform(OTP)製品ユニットによって保守されています。

歴史

名前アーランBjarneDäckerに起因するには、電話でこれらの作業により推定されたデンマークの数学者やエンジニアに基準となる(言語を設計した人のために)スイッチアグナー・アーラン音節略語「エリクソン言語」の。[6] [9] [10] Erlangは、テレフォニーアプリケーションの開発を改善することを目的として設計されました。[要出典] Erlangの初期バージョンはPrologに実装されており、プログラミング言語PLEXの影響を受けていました。以前のエリクソン交換で使用されました。 1988年までに、Erlangは電話交換機のプロトタイピングに適していることを証明しましたが、Prologインタープリターは遅すぎました。エリクソン内のあるグループは、本番環境での使用に適したものにするためには、40倍高速である必要があると見積もっています。 1992年に、パフォーマンスとディスク容量のバランスをとるために、ネイティブにコンパイルされたコードとスレッド化されたコードの組み合わせを使用してErlangをCにコンパイルするBEAM仮想マシン(VM)の作業が開始されました[11]アームストロングによると、1995年にAXE-Nという名前の次世代AX電話交換機が崩壊した後、言語はラボ製品から実際のアプリケーションに移行しました。その結果、Erlangが次の製品に選ばれました。非同期転送モード(ATM)交換AXD[6]

1998年にエリクソンはアーランの百万を超える行を含む、AXD301スイッチを発表し、達成するために報告された高可用性9「9」秒[12]その後まもなく、Ericsson Radio Systemsは、非独占的な言語の好みを理由に、新製品へのErlangの社内使用を禁止しました。禁止により、アームストロングと他の人々はエリクソンを去りました。[13]実装は、年末にオープンソース化されました。[6]エリクソンは最終的に禁止を解除し、2004年にアームストロングを再雇用した。[13]

2006年に、ネイティブ対称型マルチプロセッシングのサポートがランタイムシステムとVMに追加されました。[6]

プロセス

Erlangアプリケーションは、Erlangランタイムシステムの非常に軽量なErlangプロセスで構築されています。Erlangプロセスは、データのカプセル化とメッセージパッシングを備えた「生きている」オブジェクト(オブジェクト指向プログラミング)と見なすことができますが、実行時に動作を変更することができます。Erlangランタイムシステムは、Erlangプロセス間の厳密なプロセス分離(これには、各Erlangプロセスによって個別に分離されたデータとガベージコレクションが含まれます)と、異なるErlangノード(異なるホスト上の)上のプロセス間の透過的な通信を提供します。

Erlangの共同発明者であるJoeArmstrongは、博士 論文でプロセスの原則を要約しました[14]

  • すべてがプロセスです。
  • プロセスは強力に分離されています。
  • プロセスの作成と破棄は軽量の操作です。
  • メッセージパッシングは、プロセスが相互作用する唯一の方法です。
  • プロセスには一意の名前があります。
  • プロセスの名前がわかっている場合は、メッセージを送信できます。
  • プロセスはリソースを共有しません。
  • エラー処理は非ローカルです。
  • プロセスは、実行または失敗することになっていることを実行します。

ジョー・アームストロングは、2013年にRackspaceのとのインタビューで述べ:「場合はJavaが『です一度、どこでも実行書き込み、その後、アーランは『一度、永遠に実行する書き込み』です』。」[15]

使用法

2014年、Ericssonは、Erlangがサポートノードで使用され、世界中のGPRS3GLTEモバイルネットワークで使用され、NortelT-Mobileでも使用されていると報告しました[16]

ティム・ブレイ、のWebテクノロジーのディレクターサン・マイクロシステムズで彼の基調講演で表し、オライリーオープンソースコンベンション2008年7月に(OSCON):

誰かが私のところに来て、大規模なメッセージ処理システムを構築するために多額のお金を払いたいと思った場合、それは本当に常に稼働していなければならず、一度に何年も停止する余裕はありませんでした。で構築します。

Erlangは、WhatsAppのコーディングに使用されるプログラミング言語です。[17]

オープンソースとしてリリースされて以来、Erlangはテレコムを超えて広がり、FinTech、ゲーム、ヘルスケア、自動車、IoT、ブロックチェーンなどの他の分野での地位を確立しています。WhatsAppとは別に、Erlangのサクセスストーリーとしてリストされている他の会社があります:Vocalink(MasterCard会社)、Goldman SachsNintendo、AdRoll、GrindrBT MobileSamsungOpenXSITA[18] [19]

関数型プログラミングの例

階乗

階乗Erlangで実装されたアルゴリズム:

-モジュールファクト)。 %これはファイル「fact.erl」、モジュールであり、ファイル名が一致しなければならない
-エクスポート([ FAC / 1 ])。 %これは、アリティ1の関数 'fac'をエクスポートします(1パラメーター、タイプなし、名前なし)

fac 0  ->  1 ;  %0の場合は1を返し、それ以外の場合は(セミコロンに注意してください; 'else'を意味します
N > 0の場合はfac N  is_integer N -> N * fac N - 1 )。%再帰的に決定し、結果を返します%(ピリオドに注意してください。'endif 'または' function end 'を意味します)%%この関数は、負でない整数以外が指定された場合にクラッシュします。%%これは、Erlangの「Letitcrash」の哲学を示しています。        




フィボナッチ数列

フィボナッチ数列を生成する末尾再帰アルゴリズム

%%モジュール宣言は、ファイル名「series.erl」と一致しなければなりません
-モジュールシリーズ)。

%% exportステートメントには
、モジュールのパブリックAPI
を形成するすべての関数のリストが含まれています。この場合、このモジュールは、単一の公開さ(IE 1のアリティを有する)1つの引数をとりFIB呼ば%%機能を
%% -exportの一般的な構文は、名前とを含むリストである
%%各パブリック関数のアリティ
-輸出([ fib / 1 ])。

%% ------------------------------------------------ --------------------- 
%%パブリックAPI 
%% ----------------------- ----------------------------------------------

%% fib / 1が特定の値を受け取るケースを処理する%%
これらの関数シグネチャが宣言される順序は、
このモジュールの機能の重要な部分です%%

%% fib / 1が正確に整数0を渡された場合、0を返します
fib 0  ->  0 ;

%% fib / 1が負の数を受け取った場合は、アトムを返しますerr_neg_val 
%%通常、Erlangの「Let 
%% it Crash」の哲学
により、このような防御的なコーディングは推奨されません。ただし、この場合N < 0- > err_neg_val ;のときにErlangのランタイムエンジン
fib N  がクラッシュする状況を明示的に防止する必要があります。     

%% fib / 1に3未満の整数が渡された場合、1を返します
%%上記の2つの関数シグネチャはN <1のすべてのケースを処理する
ため
%%この関数シグネチャはN = 1またはN = 2 fib N  とき N  <  3  - >  1 

%%他のすべての値については、実行するためにプライベート関数fib_int / 3を呼び出す
計算%% 
FIB Nを - >  fib_int N  0  1 )。

%% ------------------------------------------------ --------------------- 
%%プライベートAPI 
%% ----------------------- ----------------------------------------------

%% fib_int / 3が最初の引数として1を受け取った場合、これで完了です。
%%は引数Bの値を返します
。2番目の引数の%%値には
関心がないため、_を使用してこれを示します。%%の「ドントケア」値
を示すためにfib_int 1  _、 B  ->  B ;

%%他のすべての引数の組み合わせ、再帰的にコールfib_int / 3の場合
、各コールは次の処理を行い%%:
%% -デクリメントカウンタN 
%% -引数Bの前のフィボナッチ値を取るとして渡し
引数Aの%% 
%% -現在のフィボナッチ数の値を計算し、それを渡す
引数Bのように%% 
fib_int N  A  B  - >  fib_int N - 1  B  A + B )。

説明コメントのない同じプログラムは次のとおりです。

-モジュールシリーズ)。
-エクスポート([ fib / 1 ])。

fib 0  ->  0 ; 
N < 0の場合はfib N  -> err_neg_val ; N < 3- > 1の場合のfib N ; FIB N - > fib_int N 0 1 )。     
      
    

fib_int 1  _、 B  ->  B ; 
fib_int N  A  B  ->  fib_int N - 1  B  A + B )。

クイックソート

リスト内包表記を使用したErlangでのクイックソート[20]

%%のqsort:のqsort(一覧)
%%項目のリストをソート
-モジュールのqsort )。     %これはファイル 'qsort.erl' 
- export ([ qsort / 1 ])です。 %1つのパラメーターを持つ関数 'qsort'がエクスポートされます(タイプなし、名前なし)

qsort ([]) ->  []; リストは[]空である%場合は、空のリスト(ソートに何も)を返す
のqsortを([ピボット|休憩]) - > 
    「ピボット」の前にあるべきすべての要素のための「フロント」と%作曲再帰的にリスト
    その後、% 'ピボット' 'の後にあるべきすべての要素のための'ピボット」し、'バック
    のqsort ([フロント || フロント - < 休憩 フロント < ピボット]) ++  
    [ピボット]  ++
    のqsort ([戻る || 戻る < - 残り 戻る > = ピボット])。

上記の例では、qsortソートするものがなくなるまで関数を再帰的に呼び出します[Front || Front <- Rest, Front < Pivot]リスト内包表記であり、のメンバーであり未満であるFrontような要素のリストを作成する」ことを意味します。リスト連結演算子です。 FrontRestFrontPivot++

比較関数は、読みやすくするために、より複雑な構造に使用できます。

次のコードは、リストを長さに従ってソートします。

%これはファイル 'listsort.erl'です(コンパイラはこのように作成されます)
-モジュールlistsort )。
1つのパラメータ(種類と名前を気にしない)と'by_length' %輸出
-輸出([ 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」要素があり、「Smaller」要素がないパーティションリスト
    % 'Pivot'の後に、サブリストを並べ替えます。
    qソート([ X  ||  X  < - レスト より小さいX ピボット)]、 より小さい
    ++  [ピボット]  ++
    のqsort ([ Y  || Y  <  -Rest  not Smaller Y  Pivot ))]、 Smaller )。

APivotはに与えられた最初のパラメータから取得されqsort()、残りListsRestという名前になります。式に注意してください

[ X  ||  X  <- 休憩 小さいX ピボット)]

形は

[フロント ||  フロント <- レスト フロント < ピボット]

(前の例では)最後の部分での比較関数の使用を除いて、「のメンバーでありtrueであるXような要素のリストを作成する」と言って前に次のように定義されています XRestSmallerSmaller

fun A B  ->  length A  <  length B  end

匿名関数を命名されたSmallerの2番目の定義のパラメータリストにqsortそれがその関数内でその名前で参照することができるように。の最初の定義では名前が付けられていません。これはqsort、空のリストの基本ケースを処理するため、名前は言うまでもなく、この関数は必要ありません。

データ型

Erlangには8つのプリミティブデータ型があります

整数
整数は10進数のシーケンスとして書き込まれます。たとえば、12、12375、および-23427は整数です。整数演算は正確であり、マシンで使用可能なメモリによってのみ制限されます。(これは任意精度演算と呼ばれます。)
アトム
アトムは、プログラム内で識別値を示すために使用されます。これらは、連続する英数字の文字列として書き込まれ、最初の文字は小文字です。アトムは、一重引用符で囲まれ、アトム内で任意の文字を使用できるようにするエスケープ規則が存在する場合、任意の文字を含めることができます。アトムはガベージコレクションされることはなく、特に動的アトム生成を使用する場合は注意して使用する必要があります。
フロート
浮動小数点数は、IEEE 75464ビット表現を使用します。
参考文献
参照はグローバルに一意のシンボルであり、その唯一の特性は、それらが等しいかどうかを比較できることです。それらはErlangプリミティブを評価することによって作成されmake_ref()ます。
バイナリ
バイナリはバイトのシーケンスです。バイナリは、バイナリデータを格納するためのスペース効率の良い方法を提供します。Erlangプリミティブは、バイナリの作成と分解、およびバイナリの効率的な入出力のために存在します。
ピッド
Pidはプロセス識別子の略ですspawn(...)–Pidは Erlangプリミティブによって作成されますPidはErlangプロセスへの参照です。
ポート
ポートは、外部との通信に使用されます。ポートは組み込み関数で作成されますopen_portメッセージはポートとの間で送受信できますが、これらのメッセージはいわゆる「ポートプロトコル」に従う必要があります。
楽しみ
楽しみは関数クロージャです。楽しみは、次の形式の表現によって作成されます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]。の省略形です[21]
記録
レコードは、タグをタプル内の各要素に関連付けるための便利な方法を提供します。これにより、タプルの要素を位置ではなく名前で参照できます。プリコンパイラはレコード定義を取得し、それを適切なタプル参照に置き換えます。

利用可能な外部ライブラリはありますが、Erlangにはクラスを定義するメソッドがありません。[22]

「クラッシュさせて」コーディングスタイル

Erlangは、他の多くのプログラミング言語で使用されている例外処理のようなインプロセスメカニズムではなく、外部プロセスがクラッシュ(またはハードウェア障害)を簡単に監視できるようにするメカニズムで設計されています。クラッシュは他のメッセージと同様に報告されます。これは、プロセスが相互に通信できる唯一の方法であり[23]、サブプロセスを安価に生成できます。[要出典]「クラッシュさせる」という哲学では、重大な障害からの回復を試みるのではなく、プロセスを完全に再起動することを優先しています。[24]それでもエラーの処理が必要ですが、この哲学により、防御プログラミング専用のコードが少なくなります。ここで、エラー処理コードは非常に文脈的で具体的です。[23]

スーパーバイザーツリー

典型的なErlangアプリケーションはスーパーバイザーツリーの形で書かれています。このアーキテクチャは、最上位のプロセスが「スーパーバイザー」と呼ばれるプロセスの階層に基づいています。次に、スーパーバイザーは、ワーカーまたはそれ以上の下位レベルのスーパーバイザーとして機能する複数の子プロセスを生成します。このような階層は任意の深さまで存在でき、アプリケーション機能を実装できる高度にスケーラブルでフォールトトレラントな環境を提供することが証明されています。

スーパーバイザーツリー内では、すべてのスーパーバイザープロセスが、子プロセスのライフサイクルを管理する責任があります。これには、子プロセスがクラッシュする状況の処理が含まれます。最初に子プロセスを生成し、次にerlang:monitor/2そのプロセスを呼び出すことにより、どのプロセスもスーパーバイザーになることができます。その後、監視対象のプロセスがクラッシュすると、スーパーバイザは、最初のメンバーがアトムであるタプルを含むメッセージを受信します'DOWN'スーパーバイザーは、最初にそのようなメッセージをリッスンし、次にエラー状態を修正するための適切なアクションを実行する責任があります。

並行性と配布の方向性

Erlangの主な強みは並行性のサポートです。プロセスを作成し、それらの間で通信するための、小さいながらも強力なプリミティブのセットがあります。 Erlangは概念的には言語occamに似ていますが、機能フレームワークでシーケンシャルプロセス(CSP)通信するという考え方を再構築し、非同期メッセージパッシングを使用します。[25]プロセスは、Erlangアプリケーションを構築するための主要な手段です。これらはオペレーティングシステム プロセスでスレッドもありませんが、BEAMによってスケジュールされた軽量プロセスです。オペレーティングシステムプロセスと同様に(ただし、オペレーティングシステムスレッドとは異なり)、それらは互いに状態を共有しません。それぞれの推定最小オーバーヘッドは300です。言葉[26]したがって、パフォーマンスを低下させることなく、多くのプロセスを作成できます。 2005年には、16 GBのランダムアクセスメモリ(RAM、合計800バイト/プロセス)を搭載したマシンで、64ビットのErlangを使用して2,000万プロセスのベンチマークが正常に実行されました[27] Erlangは、2006年5月のリリースR11B以降、対称型マルチプロセッシングをサポートしてきました

一方で、スレッドは、ほとんどの言語で、外部ライブラリのサポートを必要とする、Erlangのは、言語レベルは、並行プログラミングを簡素化することを目標にプロセスを作成して管理する機能を提供します。 Erlangではすべての同時実行が明示的ですが、プロセスは共有変数の代わりにメッセージパッシングを使用して通信するため、明示的なロックは不要です(ロックスキームは引き続きVMによって内部的に使用されます)。[28]

プロセス間通信は、共有なしの 非同期 メッセージパッシングシステムを介して機能します。すべてのプロセスには、他のプロセスによって送信され、まだ消費されていないメッセージのキューある「メールボックス」がありますプロセスはreceiveプリミティブを使用して、目的のパターンに一致するメッセージを取得します。メッセージ処理ルーチンは、メッセージの1つが一致するまで、各パターンに対して順番にメッセージをテストします。メッセージが消費されてメールボックスから削除されると、プロセスは実行を再開します。メッセージには、プリミティブ(整数、浮動小数点数、文字、アトム)、タプル、リスト、関数など、任意のErlang構造を含めることができます。

以下のコード例は、分散プロセスの組み込みサポートを示しています。

 %プロセスを作成し、関数web:start_server(Port、MaxConnections)を呼び出します
 ServerProcess  =  spawn web  start_server  [ Port  MaxConnections ])、

 %がリモートプロセスを作成し、関数呼び出し
 %ウェブ:START_SERVER(ポート、MaxConnectionsを)機械REMOTENODEに
 RemoteProcess  = スポーンREMOTENODE  ウェブ START_SERVER  [ポート MaxConnectionsを])、

 %ServerProcessにメッセージを(非同期で)送信します。メッセージは
 、アトム「pause」と番号「10」
 を持つタプル%で構成されますServerProcess   {一時停止 10 }、

 %このプロセスに送信されたメッセージを受信する
 receive 
         a_message-  >  do_something ; 
         {データ DataContent }  -> ハンドルDataContent ); 
         {こんにちは テキスト}  - >  IO フォーマット"ガットのHelloメッセージ:〜S "  [テキスト])。
         {別れ テキスト}  - >  IO フォーマット"ガットのさよならメッセージ:〜S "  [テキスト])
 終了

例が示すように、プロセスはリモートノード上に作成される場合があり、リモートプロセスとの通信がローカルプロセスとの通信とまったく同じように機能するという意味で、プロセスとの通信は透過的です。

並行性は、Erlangでのエラー処理の主要な方法をサポートしています。プロセスがクラッシュすると、プロセスはきちんと終了し、制御プロセスにメッセージを送信します。制御プロセスは、古いプロセスのタスクを引き継ぐ新しいプロセスを開始するなどのアクションを実行できます。[29] [30]

実装

Erlangの公式リファレンス実装はBEAMを使用しています。[31] BEAMは、Erlang / OTPと呼ばれるErlangの公式ディストリビューションに含まれています。BEAMは、ロード時スレッドコードに変換されるバイトコード実行します。また、ウプサラ大学のHigh Performance Erlang Project(HiPE)によって開発された、ほとんどのプラットフォーム上のネイティブコードコンパイラも含まれています2001年10月以降、HiPEシステムはエリクソンのオープンソースErlang / OTPシステムに完全に統合されています。[32]また、ErlangのR11B-5リリース以降、抽象構文ツリーを介してソースコードから直接、スクリプトを介して解釈することもサポートしています

ホットコードの読み込みとモジュール

Erlangは言語レベルの動的ソフトウェアアップデートをサポートしていますこれを実装するために、コードは「モジュール」ユニットとしてロードおよび管理されます。モジュールはコンパイルユニットです。システムは、モジュールの2つのバージョンを同時にメモリに保持でき、プロセスはそれぞれからコードを同時に実行できます。これらのバージョンは、「新しい」バージョンおよび「古い」バージョンと呼ばれます。プロセスは、モジュールへの外部呼び出しを行うまで、新しいバージョンに移行しません。

ホットコードロードのメカニズムの例:

  %%カウンターを保持することが唯一の仕事であるプロセス。
  %%最初のバージョン
  -モジュールカウンター)。
  -エクスポート([ start / 0  codeswitch / 1 ])。

  start () ->  loop 0 )。

  loop Sum  -> 
    receive 
       { increment  Count }  -> 
          loop Sum + Count ); 
       {カウンター Pid }  -> 
          Pid   {カウンター 合計}、
          ループ合計); 
       code_switch-  > 
          MODULE codeswitch Sum 
          %最新のMODULEバージョン
    endから 'codeswitch / 1'の使用を強制します

  codeswitch Sum  ->  loop Sum )。

2番目のバージョンでは、カウントをゼロにリセットする可能性を追加します。

  %% 2番目のバージョン
  -モジュールカウンター)。
  -エクスポート([ start / 0  codeswitch / 1 ])。

  start () ->  loop 0 )。

  loop Sum  -> 
    receive 
       { increment  Count }  -> 
          loop Sum + Count );
       リセット ->
          ループ0 ); 
       {カウンター Pid }  -> 
          Pid   {カウンター 合計}、
          ループ合計); 
       code_switch-  > 
          MODULE codeswitch Sum 
    end 

  codeswitch Sum  ->  loop Sum )。

アトムで構成されるメッセージを受信した場合にのみcode_switch、ループ?MODULEcodeswitch / 1(現在のモジュールのプリプロセッサマクロ)への外部呼び出しを実行します。メモリに新しいバージョンのカウンタモジュールがある場合、そのcodeswitch / 1関数が呼び出されます。新しいバージョンへの特定のエントリポイントを持つことにより、プログラマーは状態を新しいバージョンで必要なものに変換できます。この例では、状態は整数として保持されます。

実際には、システムはOpen Telecom Platformの設計原則を使用して構築されており、コードをアップグレード可能な設計につながります。ホットコードの読み込みの成功は厳密です。Erlangの機能を利用するには、コードを注意深く作成する必要があります。

配布

1998年、エリクソンはErlangを無料のオープンソースソフトウェアとしてリリースし、単一のベンダーからの独立性を確保し、言語の認知度を高めました。Erlangは、ライブラリおよびリアルタイム分散データベースMnesiaとともに、ライブラリのOTPコレクションを形成します。エリクソンと他のいくつかの会社はErlangを商業的にサポートしています。

オープンソースのリリース以来、ErlangはNortelT-Mobileを含む世界中のいくつかの企業で使用されてきました[33] Erlangはニッチを埋めるように設計されており、その存在のほとんどがあいまいな言語のままですが、同時サービスの需要により人気が高まっています。[34] [35] Erlangは、大規模なマルチプレイヤーオンラインロールプレイングゲーム(MMORPG)サーバーのフィールド化に使用できることを発見しました[36]

も参照してください

参考文献

  1. ^ https://github.com/erlang/otp/releases/tag/OTP-24.1.6
  2. ^ 会議、NDC(2014年6月4日)。「ジョーアームストロング-悟りへの長い道のりの関数型プログラミング:歴史的および個人的な物語」Vimeo。
  3. ^ 「Erlang–はじめに」erlang.org
  4. ^ アームストロング、ジョー; Däcker、Bjarne; リンドグレン、トーマス; ミルロス、ホーカン。「オープンソースのErlang–ホワイトペーパー」2011年10月25日にオリジナルからアーカイブされまし検索された31年7月2011
  5. ^ ビームのヒッチハイカーツアー–ロバートバーディングhttp://www.erlang-factory.com/upload/presentations/708/HitchhikersTouroftheBEAM.pdf
  6. ^ a b c d e Armstrong、Joe(2007)。Erlangの歴史HOPL III:プログラミング言語の歴史に関する第3回ACMSIGPLAN会議の議事録ISBN 978-1-59593-766-7
  7. ^ 「ハイテクの巨人がオープンソースプログラミングの愛を広める方法-CIO.com」2016年1月8日。
  8. ^ 「Erlang / OTPがオープンソースとしてリリースされました、1998-12-08」1999年10月9日にオリジナルからアーカイブされまし
  9. ^ 「数学者、Erlang?」
  10. ^ 「コンピューティングの無料オンライン辞書:Erlang」
  11. ^ アームストロング、ジョー(1997年8月)。「Erlangの開発」。ACMSIGPLANの通知32(8):196–203。土井10.1145 /258948.258967ISBN 0897919181S2CID  6821037
  12. ^ 「Erlangでの並行性指向プログラミング」(PDF)2002年11月9日。
  13. ^ a b "Erlangの将来についての質問"2010年7月6日。
  14. ^ http://erlang.org/download/armstrong_thesis_2003.pdf
  15. ^ McGreggor、Duncan(2013年3月26日)。Rackspaceは、分散コンピューティング(ビデオ)用のErlangプログラミング言語を調べますRackspace Studios、SFO 2019年4月24日取得
  16. ^ 「エリクソン」Ericsson.com2014年12月4日2018年4月7日取得
  17. ^ 「Erlangの内部、WhatsAppの成功の背後にある珍しいプログラミング言語」fastcompany.com2014年2月21日2019年11月12日取得
  18. ^ 「どの企業がErlangを使用しているのか、そしてその理由は?#MyTopdogStatus」erlang-solutions.com2019年9月11日2020年3月15日取得
  19. ^ 「ErlangとElixirを使用している新しい会社はどれですか?#MyTopdogStatus」erlang-solutions.com2020年3月2日2020年6月24日取得
  20. ^ 「Erlang–リスト内包表記」erlang.org
  21. ^ 「文字列および文字リテラル」検索された5月2 2015
  22. ^ "ect – Erlangクラス変換–オブジェクト指向プログラミングをErlang – Google ProjectHostingに追加" 検索された5月2 2015
  23. ^ a b Verraes、Mathias(2014年12月9日)。「LetItCrash」MathiasVerraesのブログ2021年2月10日取得
  24. ^ 「リアクティブデザインパターン—」www.reactivedesignpatterns.com 2021年2月10日取得
  25. ^ アームストロング、ジョー(2010年9月)。「Erlang」ACMの通信53(9):68–75。土井10.1145 /1810891.1810910Erlangは概念的にはoccamプログラミング言語に似ていますが、機能フレームワークでCSPの概念を再構築し、非同期メッセージパッシングを使用します。
  26. ^ 「Erlang効率ガイド–プロセス」2015年2月27日にオリジナルからアーカイブされまし
  27. ^ Wiger、Ulf(2005年11月14日)。「ストレステストerlang」comp.lang.functional.misc 2006年8月25日取得
  28. ^ 「ロックフリーメッセージキュー」取得した23年12月2013
  29. ^ アームストロング、ジョー。「Erlangの堅牢性」2015年4月23日にオリジナルからアーカイブされまし検索された15年7月2010年
  30. ^ 「Erlangの監督の原則」2015年2月6日にオリジナルからアーカイブされまし検索された15年7月2010年
  31. ^ 「Erlang–コンパイルとコードのロード」erlang.org 2017年12月21日取得
  32. ^ 「高性能Erlang」取得した3月26日に2011
  33. ^ 「製品開発にErlangを使用しているのは誰ですか?」Erlangに関するよくある質問2007年7月16日取得Erlangの最大のユーザーは(驚きです!)Ericssonです。エリクソンはこれを使用して、通信システムで使用されるソフトウェアを作成します。何十ものプロジェクトがそれを使用しており、特に大きなものは非常にスケーラブルなAXD301ATMスイッチです。FAQの一部としてリストされている他の商用ユーザーには、Nortel、Deutsche Flugsicherung(ドイツの全国航空交通管制組織)、およびT-Mobileが含まれます。
  34. ^ 「プログラミングErlang」。取得した13年12月2008年事実上すべての言語が共有状態の同時実行性を使用します。これは非常に困難であり、障害を処理してシステムをスケールアップすると、ひどい問題につながります...金融業界の非常に動きの速いスタートアップの中には、Erlangを利用しているところもあります。たとえば、スウェーデンのwww.kreditor.seです。
  35. ^ 「Erlang、次のJava」2007年10月11日にオリジナルからアーカイブされまし2008年10月8日取得他の言語がErlangにすぐに追いつくことができるとは思いません。彼らがErlangのような言語機能を追加するのは簡単です。並行性と信頼性のために、このような高品質のVMと成熟したライブラリを構築するには長い時間がかかります。したがって、Erlangは成功の準備ができています。今後数年間でマルチコアアプリケーションを構築したい場合は、Erlangを検討する必要があります。
  36. ^ クラーク、ギャビン(2011年2月5日)。「オンラインロールプレイに必要なバトルスターギャラクティカの獣医」音楽とメディアReg 取り出される8年2月2011

さらに読む

外部リンク