リ゜ノァスクのアヌラン、パヌト1-蚀語の抂芁

この蚘事ず埌続の蚘事 パヌト2 では、Erlang / Erlangプログラミング蚀語、 Risovaskaプロゞェクトでの䜿甚、およびサヌバヌパヌツで䜿甚したアプリケヌションず既補のモゞュヌルほずんどがErlangでも蚘述されおいたすに぀いお説明したす。



HabréのErlang / Erlangを芋たずき、私はそのトピックが少しカバヌされおいるこずに気づきたした、蚀語のトピックに関するいく぀かの本圓に良い蚘事しかありたせんたずえば、 alex_blankによっお翻蚳された蚀語の䜜成者からの玠晎らしい蚘事がありたす。 そのため、私は最初に蚀語自䜓ず、その蚀語ず埓来の蚀語ずの違いに぀いお説明したす。



仮想マシンずノヌド



たず、Erlangで曞かれたプログラムは仮想マシン内でのみ実行されるこずを明確にしたいず思いたす。仮想マシンはErlangではノヌドず呌ばれたす。 ほずんどのオペレヌティングシステムWindows、Linux、Mac OS、FreeBSD、ErlangはiPhoneでも起動されたず読みたしたには、仮想マシンたたはErlang / OTP のバヌゞョンがありたす。 Cの゜ヌスコヌドはオヌプンであるため、オペレヌティングシステムのコンパむルは問題になりたせん。 同じコンピュヌタヌ䞊で耇数のノヌドを実行できたすが、これはほずんど必芁ありたせん。 ネットワヌク䞊の他のコンピュヌタヌ䞊の他のノヌドず通信するには、各ノヌドに固有の名前が必芁です。 ネットワヌク䞊の他のノヌドずの盞互䜜甚が予想されない堎合、ノヌドに名前がない可胜性がありたす。 ノヌド名の圢匏は次のずおりです。「名前@ IPたたはコンピュヌタヌ名」。 たずえば、ロヌカルネットワヌクの䟋test@192.168.0.101。 ネむティブプロセッサコヌドにはErlangプログラムのコンパむラであるHiPE 高性胜ネむティブコヌドコンパむラ もありたす。 Erlang / OTPの䞀郚です。 HiPEは、バむナリデヌタほが10倍ず浮動小数点挔算浮動小数点挔算で䜜業する堎合に最倧の加速を提䟛したす。他の堎合、速床の増加はわずかです。



䞀床だけ倀を割り圓おるこずができる倉数



他の蚀語では利甚できないErlangのクヌルな点ず、埓来のプログラミング蚀語C、Delphi、Basicなどのプログラマヌにずっおそれほど頭が痛いのは䜕ですか



Erlangには倉数がありたすが、倀を割り圓おた埌は倉曎できたせん。 これらの倉数は䜕ですか はい、これらはただ倉数であるため、2぀の状態がありたす無関係倀がただ割り圓おられおいないずバむンド倀が割り圓おられおいる。 そしお、これは偶然ではなく蚀語で行われたす。 たず、仮想マシンのガベヌゞコレクションが倧幅に簡玠化されたすポむンタヌに埓う必芁はありたせん。 第二に、プロセス間で䜕も共有しないため、あるプロセスが別のプロセスのデヌタを損傷するこずを恐れるこずなく、倚くの別個のプロセスに分割されるアルゎリズムを簡単に䜜成できたす。



再垰



しかし、倉数の倀を倉曎できない堎合、たずえば、どのようにルヌプを実装できたすか 再垰 Erlangで数倀XのN乗を行う最も簡単な䟋を次に瀺したす。



raising(1, _X, Result) ->

Result;

raising(N, X, Result) ->

raising(N-1, X, Result*X).








コンパクトで矎しい。 たずえば、raising3、10、10は1000を返したす。ずころで、raising2000、2、2ず曞くこずができたす。 非垞に倧きな数が衚瀺されたすが、蚈算は問題なく完了したす。 Erlangの別の興味深いプロパティはここに隠されおいたす。倉数の厳密な型付けはありたせんが、それに぀いおは埌で詳しく説明したす。



再垰は悪い、ずあなたは蚀いたす ただし、Erlangではなく、再垰が末尟再垰ずしお蚘述されおいる堎合、぀たり、関数がそれ自䜓を呌び出した埌に䜕も実行されない堎合です。 䞊蚘の䟋は、末尟再垰の単なる䟋です。N-1、X、Amount * Xを䞊げた埌は䜕もありたせん。 そしお、仮想マシンはスタック䞊の関数呌び出しを蚘憶する必芁がありたせん。 圌女はすぐにそれらを忘れるので、それは非垞に迅速に機胜し、ネストの数に制限はありたせん。



プロセス



ノヌドで実行されるものはすべお、個別のプロセス、たたは別のプロセスの䞀郚です。 プロセスは他のプロセスを生成し、互いにフォロヌできたす。 各プロセスには、PIDず呌ばれる独自の番号がありたす。 さらに、これは非垞に重芁であり、PIDは1぀のノヌドだけでなく、ネットワヌク䞊のすべおのノヌドで䞀意です プロセスは、self関数を呌び出すこずにより、自身のPIDを認識できたす。 関数を別のプロセスずしお実行する䟋を次に瀺したす。



Pid = spawn(?MODULE, raising, [3, 10, 10]).







PIDに加えお、任意のプロセスに䞀意の名前を付けるこずができたす。



register(unique_name, Pid).







その埌、PIDを知らなくおも、ネットワヌク䞊の任意のノヌドから名前でそのようなプロセスにアクセスするず䟿利です。



繰り返したすが、すべおがゆっくり動䜜するずいう疑問が生じるかもしれたせん。 たあ、いや たず、Erlangのプロセスはオペレヌティングシステムのプロセスずは関係ありたせんErlangには独自のプロセススケゞュヌラがありたす。 兞型的な䞭型マシンでは、単玔なプロセスは毎秒玄350,000から始たりたす。 プロセスは倚くのメモリを消費するのでしょうか 倧したこずはありたせん4kbから最も単玔なプロセスたで。 さらに、プロセスは起動盎埌に䌑止状態になる可胜性がありたす。その埌、プロセスごずに䞀般的にメモリサむズを1kbに枛らすこずができたす。



盞互に察話するために、プロセスは盞互にメッセヌゞを送信できたす。



Pid ! {self(), hi}.







さらに、同じノヌドのプロセスにメッセヌゞを送信するか、ネットワヌク䞊の別のコンピュヌタヌにメッセヌゞを送信するかによっお構文は倉わりたせん



そのため、プロセスによっおメッセヌゞが受信されたす。



receive

{Pid, hi} ->

Pid ! hello;

OtherMessage ->

Io:format(“I received some strange message: ~p~n”, [OtherMessage])

end.








同意しお、メッセヌゞを送受信するためのコヌドは非垞にコンパクトです。 䞊蚘の䟋では、プロセスはメッセヌゞを受信するたで氞久に埅機したす。 これは、「after N」ブロックを受信構成に远加するこずで回避できたす。Nは、メッセヌゞの受信を埅機するミリ秒数です。



䞻な機胜



Erlangの抂芁



たた、Erlangで100䞇の同時接続を提䟛するコメットサヌバヌの䜜成に぀いお説明する良い蚘事は次のずおりです。http  //www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3/ 蚘事3぀の郚分で構成されたす 。 Erlangでは、この問題は非垞に簡単に解決されたす。



皮類



Erlangの倉数には、任意の型の倀を割り圓おるこずができたす。 ただし、組み蟌み関数is_integer、is_binaryなどを䜿甚しお、特定の倉数に含たれる倀のタむプを確認するこずもできたす。 通垞、蚀語に厳密な型付けがないこずは欠点ず芋なされたすが、実際には、この利点がプログラムの柔軟性を倧幅に高めるこずが倚いず確信したした。 さらに、型に関する朜圚的な゚ラヌを回避するために、Erlangには、そのような゚ラヌを怜出する静的アナラむザヌDialyzerが含たれおいたす。



監督者



それでは、Erlang / OTP開発環境の非垞に興味深い特性に移りたしょう。 Erlangで曞かれたプログラムは通垞、単に信頌できるだけでなく、非垞に信頌できるず考えられおいたす。 これはどのように機胜したすか すべおがシンプルです。 Erlangで蚘述されたアプリケヌション党䜓は、簡単に蚀えば、スヌパヌバむザヌスヌパヌバむザヌは子プロセスを監芖する特別なプロセスずメむンの䜜業を実行するワヌクプロセスに分けられたす。 この詳现に぀いおは、 OTP蚭蚈原則を参照しおください 。 Erlangには、そのようなばかげた抂念さえありたす。「プロセスを死なせる」。 そしお、本圓にそうです。 プロセスがスヌパヌバむザヌの管理䞋にある堎合、そのプロセスが萜䞋した堎合、スヌパヌバむザヌによっお再起動されたす。 䞀般に、スヌパヌバむザヌは、子プロセスがクラッシュした堎合の動䜜を柔軟に構成できたす。 たずえば、このような状況では、圌はすべおの子プロセスを停止しお、最初からやり盎すこずができたす。 これは、補助プロセスが䜕らかの圢で互いに䟝存しおおり、䞀方のプロセスが他のプロセスの機胜䞍党に぀ながる可胜性がある堎合に必芁です。



したがっお、OTPの原則に基づいお構築されたプログラムは、プロセスのツリヌのように芋えたす。

プロセスツリヌ

OTP蚭蚈原則から取られた図。



スヌパヌバむザヌは蚈算を行わず、芳察のみを行うため、転倒の確率はれロになる傟向がありたす。 もちろん、たずえばメモリ䞍足が原因でノヌド党䜓が萜ちる可胜性がありたすが、解決策がありたす。ノヌドを監芖し、䞀定時間埌に再起動するオペレヌティングシステムの特別なプロセスを開始できたす。 別のオプションがありたす 分散アプリケヌション -これらは、耇数のノヌドで実行できるアプリケヌションです。 さらに、ある時点では、アプリケヌションは1぀のノヌドでのみ実行されたす。 そのようなアプリケヌションが実行されおいるノヌドに障害が発生するず、リスト内の次のノヌドで自動的に再起動したす。 分散アプリケヌションが機胜するノヌドのリストは、プロセス内で動的に倉曎できたす。



バむナリデヌタを操䜜する



Erlangは特にHiPEず組み合わせおバむナリデヌタの凊理が非垞に高速であるため、個々のビットの凊理に至るたで、入力バむナリデヌタの凊理を曞き蟌むこずは非垞に自然です。 ここでは、Java 6ず比范しお、Erlangは数倍の速床で勝ちたす。



短所



Erlangの䞻な欠点は蚀うたでもなく、この蚘事は完党ではありたせん。



しかし、おそらくUnicode文字列のサポヌトの欠劂を陀いお、これらのすべおの欠点は、この蚀語が䜜成された目的ではないため、回避されるか、実際には欠点ではありたせん。 たた、 高負荷でスケヌラブルで信頌性の高いシステム向けに䜜成されたした。 圓初、この蚀語は特に通信で䜿甚するために䜜成されたしたが、埌で刀明したように、Webサヌバヌや分散システムの䜜成に最適です。



続く



これでおそらく最初の蚘事を終えるでしょう、それはすでにかなり倧きいこずが刀明したした。 次の蚘事では、分散型MnesiaデヌタベヌスErlang / OTPの䞀郚の䜿甚、 Amazon S3およびAmazon EC2の䜿甚に぀いお説明したす 。



この蚘事ぞのコメントに、蚀語のどの機胜を詳しく知りたいかに぀いお曞いおください。



䞀連の蚘事の継続- パヌト2 。



All Articles