見出し画像

Erlang - 分散処理に強い関数型言語

今回は、歴史は古いのだけど知名度はあまりない erlang を取り上げます。元々はスウェーデンにある通信メーカであるエリクソンで開発され使われていたプログラミング言語で、1998年にオープンソース化され通信関係などのプロジェクトで採用されている例が増えています。

その特徴は関数型言語であり、強力な並行処理に対するサポートです。実装は独自の仮想マシンによって管理されるインタプリタです。ソースコードは仮想マシンのバイトコードにコンパイルしてから実行されます。いわゆるスレッドによる分散だけではなく複数のマシンに対する分散処理も可能で、高い耐障害性があり、稼働中のシステムを停止すること無くプログラムを変更できる能力を持っています。

Erlang

この言語は、お仕事で通信プロトコルを処理するようなシステムを開発していたときに出会ったのですが、私はどうも関数型言語が苦手で、一通りは読めるようにはなりましたが、プログラムを走らせて怪しいところを直すくらいまでしか出来るようにならず、この言語でシステムを設計するにはどうすればうまくいくのかまでは会得できませんでした。

Practical functional programming for a parallel world - 公式サイト

ErlangはPrologの影響を強く受けており、リストに対してパターンマッチングを行い処理を書いていくパターンが基本です。変数は、いったん値を割り当てる(束縛)と、値を変更することはできなくなります。とはいえ変数なので値を変える手段はあるのですが、それには束縛を解くという手順が必要です。この辺りは分散処理を効率的に行うには有効な考え方で、もしかしたら Rust にも影響を与えたのかもしれません。

Erlang(関数型プログラミング言語)

Erlangで言うところのプロセスは、仮想マシンのプロセスであってOSのプロセスとは異なります。とにかく並行処理ありきという設計思想が隅々にまで行き渡っており、この言語を覚えることにより並行処理で重要なポイントが体に染み込むようになっています。ちょっと取っ付きにくいのは確かですが、テストの手法と共に一度、勉強してみる価値はあります。

お気楽 Erlang プログラミング入門

Erlang で並列プログラミングをやってみた

Erlang/Elixir 事始め

そしてプロセス間で変数の値を始め情報を共有する仕組みが限られているので、グローバルに必要な情報はMnesiaと呼ばれる独自のデータベースに記憶することになります。このMnesiaはデータが失われるかもしれないけど、高速にアクセスできるメモリ上の置く場合と、永続的に値を保存しておくことが出来るディスク上に置くものとを選べるようになっており、マシン間で複製することにより耐障害性を高められるようになっています。

Mnesia

4 Mnesiaデータベースの構築

データベースと言っても、いわゆるリレーショナルな機能はなく基本的にはキーバリューペアを能率よく処理するような作りになっています。

この言語でいわゆるUIを持つようなアプリケーションを書くのには無理がありますが、ネットワークプロトコルを処理するには、良くスケールもするのでうってつけです。とはいえ通信で使うソケットはマシンごとのIPアドレスとポート番号が基本となるので、分散する場合も、その部分がネックとなることは確かで、全体としてどのように処理を分散するのかは設計者の腕の見せどころではあります。

最終的に仮想マシンのパフォーマンスに足を引っ張られるのですが、分散するコストが低いので、マシン単独のパフォーマンスを気にせずに済むように使うのが、この言語の使い方なんだとは思います。

でも、実際に何が起こっているのか追うのはなかなか厳しい言語で、ひたすらテストをしていくしか無いのですが、それもある意味、正攻法なんでしょう。

ヘッダ画像は、以下のものを使わせていただきました。
https://commons.wikimedia.org/wiki/File:Erlang_logo.svg
https://github.com/gilbarbara/logos/blob/master/logos/erlang.svg, パブリック・ドメイン, https://commons.wikimedia.org/w/index.php?curid=52314351による

#プログラミング言語 #erlang #エリクソン #関数型言語 #並行処理 #分散処理 #Mnesia #パターンマッチング

この記事が気に入ったらサポートをしてみませんか?