次に来るWeb言語はこれだ!「Elixir」を導入して触れてみよう


次に来るWeb言語はこれだ!「Elixir」を導入して触れてみよう

こんにちは、バックエンドエンジニアの銀シャリです。

今回は、役立つ最新技術をつまみ食い的に試してみる連載「最新バックエンド技術つまみ食い」の第一回目。

昨年頃からWebエンジニア界隈で大きな盛り上がりを見せている言語、「Elixir(エリクサー)」について紹介します。

Elixirとは?

Elixirは、BEAMと呼ばれるErlang(アーラン)仮想環境上で動作する関数型言語で、Ruby on RailsのcoreチームメンバーでもあるJosé Valimによって2012年に開発されました。

小難しく書きましたが、ErlangとElixirについては、JavaとScala、JavaScriptとCoffeeScriptのような関係性だと思ってください。

Elixirが盛り上がる2つの理由

そんなElixirが最近盛り上がっているのには、以下のような理由があります。

  • Erlang仮想環境上で動作することで、大量の並行処理を行うアプリケーションを高い信頼性で実現できる
  • とっつきにくかったErlangの文法をRubyに近づけ、Erlangにはなかったパッケージマネージャ、ビルドツール、マクロなどを持つことでRubyプログラマに馴染みやすい言語になっている

Elixirを導入しよう

それでは、実際にElixirを導入してみましょう。

Erlangのインストール

まずはErlangをインストールしましょう。
以下のリンクから最新のものをダウンロードしてください。

Macをお使いの方であれば、Homebrewでインストールすることもできます。

brew install erlang

Elixirのインストール

ErlangがインストールできたらElixirをインストールしましょう。
以下の公式手順が参考になります。

Macをお使いの方は、Erlang同様にHombebrewでインストールするのが楽です。

brew install elixir

Windows向けのインストーラーも用意されています。(クリックでダウンロードされます)

RubyでRVMやrbenvで言語自体のインストールバージョンを管理されていた方向けに、kiexというバージョンマネージャーも作られています。まだRubyほどバージョンも多くはありませんが、僕はこれを利用して新しいバージョンをインストールしています。

Windows版はないみたいです。

インストールの確認

インストールが終了したら、REPL(対話式実行環境)を起動してインストールの確認をしましょう。
ElixirのREPLはiexというものが最初から用意されています。

$ iex # Windowsであればiex.batがインストールされていると思います
Erlang/OTP 18 [erts-7.2.1] 1 [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.2.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> # 入力待ちになります

「iex(1)>」と表示されて入力待ち状態になれば起動成功です。インストールが完了したことになります。

iexを終了するには、まずCtrl+Cを入力します。

iex(1)> # Ctrl+Cを入力
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution

処理が中断し、何やらメニューが表示されます。この状態でaを入力するか、もう一度Ctrl+Cを入力することでiexを終了することができます。

Elixirはじめの一歩

せっかくなので、iexでElixirに少しだけ慣れていきましょう。

# iex(1)の(1)の部分は、コマンド実行回数が表示されていますので、省略します。
# 四則演算
iex> 40 + 2
42
iex> 30 - 10
20
iex> 3 * 4
12
iex> 15 / 2
7.5
iex> 7.0 / 3.2
2.1875
# 余りの計算
iex> 5 % 2
** (SyntaxError) iex:6: syntax error before: '%' #この記法は無いので怒られます
iex> rem(5, 2) # rem関数を使用して計算します
1
# 商の計算
iex> div(5, 2) # div関数を使用すると計算できます
2
# 文字列
iex> "hello" <> "world" # 文字列は<>で連結します
"helloworld"
# コンソール出力
iex> IO.puts "Hello world from Elixir" # IO.putsで標準出力へ出力します
Hello world from Elixir # これが標準出力への出力結果
:ok # エラーにならずに終了したので、最後に評価されるのはIO.putsの実行結果である:okとなります

基本的な演算は商余の計算が関数を使うくらいで、違和感はないですよね?

Elixirはじめのもう一歩

次に、簡単なスクリプトを作成して実行してみましょう。
ここでElixirの特徴でもあるパイプライン処理にもちょっとだけ触れてみます。

以下のような内容のsample.exsを作成して、ローカル環境のどこか、コマンド実行時に指定しやすい場所に保存してください。

1..10
|> Enum.map(fn(x) -> x * x end)
|> IO.inspect

保存したらelixirコマンドで実行してみましょう。

$ elixir sample.exs 
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

結果が表示されましたか?
それでは書いたコードの解説をします。

1..10

まずこの部分は、Rubyを書く方にはおなじみかと思いますが「1から10までの数値を値として持つ配列」を生成するコードです。

|> Enum.map(fn(x) -> x * x end)

続くこのコードに注目してみます。

先頭に「|>」が記述されていますが、これが「パイプライン演算子」です。パイプライン演算子によって1行目のコードで生成された配列を、この行に記述されたEnum.mapの処理に渡しています。
配列を受け取ったEnum.mapでは、各要素に、この関数の引数に渡された関数(fn(x)で開始してendまで記述されている部分の処理)を実行しています。
ここでは、「配列の各要素に対してその値を二乗する」処理を行っています。

|> IO.inspect

そして最後の行です。前行で処理された結果は、そのまま配列としてこの行でパイプライン演算子によって渡されています。
IO.inspectは与えられた引数の構造に合わせて標準出力に吐き出してくれます。
それによって、結果の配列が表示されたというわけです。

おわりに

Elixirのインストールから、簡単な構文とパイプライン演算子について紹介しましたが、いかがでしたでしょうか。
最後に、もっとElixirを学んでいきたい方向けに、ElixirSchoolというサイトが日本語訳されていますのでご紹介します。

今後ますます注目度が上がってくる言語と思われるElixirに、みなさんもぜひこの機会に触れてみていただければと思います。

それでは!


この記事を書いた人

銀シャリ
銀シャリ バックエンドエンジニア 2015年入社
東京周辺でWebエンジニアをしている流浪のサーバーサイドエンジニア。
エンジニア応援し隊。