ElixirElixirはマルチプロセスを前提とした関数型プログラミング言語でエリクソンが電話交換機プログラムのために開発したErlangという仮想マシンシステム上で動作します。Elixirが流行ってきた背景として、CPUが複数コアで構成されるようになり個人のパソコンでも8コアや16コアのCPUが使われるようになってきたのがあると思います。CやJava,Pythonなどの現在主流の言語はシングルコアのCPUを前提にした言語なのでマルチコアをうまく扱えません。そこでGoやRustなど新しい言語が登場してきたのですが、Elixirはその中でも比較的とっつきやすく関数型プログラミングのよさもうまく取り込んだ言語です。古いタイプの言語に慣れている人にはそこがとっつきにくい部分かもしれません。最新の情報を得たかったのでこちらの本で学びました。ペーパーバックこの商品を含むブログを見るElixirを使ってみて私がいいなと思ったのはこんなところでした。複数プロセス間のメッセージ通信が簡単Lispっぽいリスト昔、EmacsというエディタでLispという言語を使ったことがありますが、Elixirの配列はLispによく似てると思いました。Lispはリスト構造が基本でcarやcdrというリストの先頭やそれ以外を取得する関数があります。それと同じような機能がElixirにもあります。配列の先頭を取得するには以下のように書きます。]ちなみにiexはElixirのシェルみたいなものでRubyでいうirbと同じものです。この言語を作った人は明らかにLisperですね。mapというデータタイプを使うことができます。map[:a]1mapとはキーと値がペアになっているデータで、他の言語では連想配列と呼ばれているものです。スキャン処理などを高速に行えるようにハッシュ値のようなデータです。Rubyのシンボルを同じですね。再帰を使ってループを使わないLispでは再帰呼び出しというテクニックをよく使いますが、Elixirでもよく使われます。再帰とは関数の中で自分自身を呼ぶことをいいます。フィボナッチ数を計算する関数はこんな感じです。2)endフィボナッチ数は最初0と1から始まるので停止条件として書いておくべきなのですが上の例では省略しました。CやJavaで書く場合はforループなどで集計していくことが多いですが、再帰で書くことによってシンプルな記述になるところがいいですね。再帰は慣れていないと訳がわからないコードになりがちなのでプログラマーの習熟が必要です。再帰は普通スタック領域をたくさん消費したり実行速度が遅かったりするのですが、Elixirではうまく最適化してくれているようです。関数シグネチャーを使って条件分岐を行う例えば、C言語でエラー処理のコードはこんな感じになります。}}Cでコード書いていると条件分岐でエラー処理だらけになることが多いです。Elixirではこういう書き方ができます。endend波括弧の引数はタプルと呼ばれているデータ型で変更できない配列です。上の例では同じ名前で引数の違う関数func1が定義されます。Elixirでは同じ関数名でも引数を変えることにより別の関数として定義することができます。したがって、この例では:okを引数に与えると通常の処理をして:errorを与えるとエラー処理が行われます。このように、Elixirではifなどの条件分岐をできるだけ使わないようにしてコードの見通しをよくすることができます。関数を複数つなぐパイプオペレーターシェルをご存知の方はコマンド同士をつなぐパイプという機能があるのをご存知だと思います。-lUnixのコマンドは一つ一つは単純な処理しかできませんが、パイプで組み合わせることによって様々な処理を行わせることができます。Elixirにもパイプオペレーターというものがあり、関数をつないで複雑な処理を行わせることができます。rocks"という文字列がString.upcase()関数の第一引数として与えられます。rocks")を呼んでるのと同じことになります。次のString.split()も同様にデータが流れます。Unixエンジニアにはあたかもシェルスクリプトを書いているみたいでたまらない機能ですね。大量プロセスを起動してもオーバーヘッドが少ないElixirでは簡単に複数のプロセスを立ち上げて並列で処理させることができます。ここでいうプロセスとはOSネイティブのプロセスではなくElixirのVM上で実行するプロセスなのでとても軽いものになっています。プロセスの生成は以下のように行います。[function_params])例えば、複数のプロセスで合計するプログラムはこんな感じになります。endend大まかに説明すると、spawn(..)でプロセスを生成してpsum()という関数を別プロセスで並列に動かしています。psum()関数はcalc_valの要素を合計します。このプログラムをプロセス数1000,10000,100000で動かした結果がこちらです。:ok}run関数のパラメータがプロセス数で結果の数値は実行時間をマイクロ秒で出力します。ご覧の通り、10万プロセスで0.1秒ほどしかかかっていません。プロセスによるオーバーヘッドはほぼないと考えて開発できますね。複数プロセス間のメッセージ通信が簡単Elixirの一番の売りはプロセス間通信が簡単なことです。次の例はエコーサーバーを生成してクライアントのメッセージをそのまま返すプログラムです。World!"というメッセージを送信するとサーバーがそのまま返します。do...のところで受信しています。msg}->のところは送られてきたメッセージのパターンを記述するところでマッチすればそれ以下の処理が実行されます。したがって、このパターンを複数持たせればメッセージパターンによって違う処理をさせることができます。LinuxでC言語でデーモンを書くよりはるかに簡単ですね。触ったところではこんな感じでした。ElixirにはRailsに似たウェブフレームワークのPhenixや組み込み系フレームワークのNervesなどがあっておもしろそうです。Elixirはマルチプロセスで通信しながら処理を行うのが当たり前なのでRubyやPythonとは違った作りにできると思います。次回ウェブアプリ開発を行うときはElixirを使ってみたいなと思いました。(1)注目記事はてなブログをはじめよう!anthony-gさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。