Elixirプログラミングの基礎【現役エンジニアがわかりやすく解説】

PROGRAM

Elixirプログラミングの基礎を知りたい方に。

この記事を読まれている方は、

  • Elixirのプログラミングがどんなものか知りたい
  • Elixir言語の簡単な書き方が知りたい
  • Elixirが使われる場面を知りたい

おそらくこのように考えている方が多いと思います。

この記事を書いている私は、
プログラミング未経験から転職を果たした現役のWeb系エンジニアです。
エンジニア歴は3年ですが、本業とは別にフリーランスの副業で月10万円ほど、多いときで20万円ほどの収入があります。

この記事では、現役のエンジニアが、Elixirプログラミングの基礎を解説しています。

プログラミング言語のElixirの特徴

プログラミング言語のElixirの特徴

Elixirはプログラミング言語のひとつで、動的型付けの言語で関数型言語であり、コンパイルしてもしなくても動作します。

動的型付けの言語とは、簡単に言うと、データを文字列型や数値型、論理型などに分ける必要がない言語のことです。実際、タプル(配列)などの中にはどんな型のものでも入れられます。

コンパイルとは、プログラムの実行前に、開発者の方でコンパイラーを使って構文チェックなどをしたうえで中間言語に変換する行為のことです。

Elixirはコンパイルをしてもしなくても動作するので、する場合はコンパイラーが、しない場合はインタプリタが命令を解析します。

関数型言語とは、再帰的に呼び出すなどして、プログラム上で状態を変化させないように(再代入などをしないで)実行する手法を取るプログラミング言語のことです。関数の組み合わせで動かす言語のことです。

一方、オブジェクト指向型言語とは、オブジェクトという概念を持つ言語のことで、簡単に言うと、データ構造として、配列や構造体に加えて、オブジェクト(クラス)があるということです。
オブジェクトのおかげで、ソースコードのメンテナンスがしやすかったり、機能の流用ができます。

Elixirは、Erlangというプログラミング言語で作られており、Erlangの仮想マシン上で動作します。
そのため、Erlangの各機能が使えるとともに、拡張機能としてメタプログラミングやポリモフィーズムなどが実装されています。

もととなっているErlangについて軽く触れておきますと、もともとは通信機器メーカーであるエリクソン社の内部で使われていた言語でした。通信において分散処理が必要だったため、Erlangは並行処理が得意な言語です。

実際にTwitter等でメッセージングシステムに“ejabberd”というErlangで書かれたIMサーバーが使われています。

つまり、大規模なシステムでの実績があるというわけです。
そのErlangに拡張機能を付けることで、Elixirはさらに注目を集めた言語となっています。

Elixirは言語的にはRubyに似ています。しかし内容的には先述したようにErlangとなっています。

見た目がRubyと似ていて動的型付けの言語のため、コーディングはとてもしやすいです。
たとえば、タプルという他言語で言うところの「配列」には、どんな型のデータも入れることができ、極力プログラマーが型を決めるわずらわしさを排除しています。

そのため、初心者には学習障壁が低い言語なのではないかと思われます。

Elixirの用途

Elixirの用途

ElixirはRubyライクに書けるので、学習コストが低く、多くのエンジニアにとって書きやすいものとなっています。

また、Erlangの特徴から、大規模な並行処理が必要とされる場面で使われるケースが多いです。他言語と比べ、1プロセスが非常に軽量なので、分散処理に関してはRubyよりもはるかに得意な言語となっています。

Erlangよりもコードがわかりやすくなっているため基本的には使いやすいのですが、動的型付けという点が気に入らないエンジニアも多いです。データの型を決めずに済むというのはメリットでもありますが、データの役割がころころ変わるというのは同時にデメリットでもあります。

Elixirの書き方

Elixirの書き方

ここでは簡単に書き方を少しだけ紹介します。実際に始める気になったら、ぜひ参考書などの教材を参考にして、試してみて下さい。

Hello World!を画面に出力する

まずはお決まりのHello World!という文字列を画面に出力する方法から。

IO.write "Hello Wolrd!"

これだけで出力することができます。
コンパイルは強要されていませんので、してもしなくてもプログラムを実行できます。

変数宣言と分岐処理

次は少し踏み込んで、変数宣言と分岐処理をしてみます。

age = 19
if age<20 do
    IO.write "未成年"
else
    IO.write "成人"
end

上記の例では、まずageという数値型の変数を作り、その中に19という数値を入れています。
次にageが20未満であれば”未成年”という文字列を、それ以外であれば”成人”という文字列を出力するような分岐処理をしています。

配列と繰返処理

続いて、配列の使い方と繰返処理について、解説します。

ここでは配列を作って、以下のようにデータを出力することにしましょう。

佐藤,田中,小林

これを出力するコードは以下です。

students = {"佐藤", "田中", "小林"}

for i <- 0..tuple_size(students)-1 do
  IO.write elem(students,i)
  if i < tuple_size(students)-1 do
    IO.write ","
  end
end

上記の例では、まず文字列型のタプルstudentsに「佐藤」「田中」「小林」の3つの文字列を格納しています。
その後、数値型のカウンタ変数iを0に初期セットし、タプルstudentsの要素の数に到達するまでループでiを1ずつ増やしてまわしていきます。その際に、write関数を使い、タプルstudentsのi番目の要素の値を出力し、最後の要素以外、その後に「,(カンマ)」を出力しています。

構造体の取り扱い

最後に構造体の取り扱い方法について解説します。

ここではエクセルのようなデータを作って、以下のようにデータを出力することにしましょう。

名前:佐藤,性別:男性
名前:田中,性別:女性
名前:小林,性別:女性

これを出力するコードは以下です。

first_row = [{:A, "佐藤"}, {:B, "男性"}]
second_row = [{:A, "田中"}, {:B, "女性"}]
third_row = [{:A, "小林"}, {:B, "女性"}]
excel_data = {first_row, second_row, third_row}

for i <- 0..tuple_size(excel_data)-1 do
  IO.write elem(excel_data,i)[:A]
  IO.write ","
  IO.puts elem(excel_data,i)[:B]
end

上記の例では、まずfirst_row, second_row, third_rowという、キー・値がともに文字列型の連想配列を3つ作り、Aというキー(列)に名前を、Bのキーに性別の値を入れていきます。
そして、それら全てをexcel_dataというタプルに入れます。
その後、数値型のカウンタ変数iを0に初期セットし、タプルexcel_dataの要素の数に到達するまでループでiを1ずつ増やしてまわしていきます。その際に、write関数を使い、タプルexcel_dataのi番目の要素の中のA列とB列の値を出力しています。

まとめ:ElixirはErlangの拡張言語で並行処理に強い言語

まとめ:ElixirはErlangの拡張言語で並行処理に強い言語

Elixirの良さを簡単にまとめると、以下のとおりです。

  • コードが書きやすい ← 動的型付けの言語
  • 並行処理に強い ← プロセスが超軽量
  • Erlangの関数が使える← Erlangの拡張言語

つまりElixirは、Erlangの良さを使いつつ、Elixirの拡張機能も使え、さらに並行処理に強い言語となっています。

Elixirの登場でErlangからElixirに使用言語を変えている現場もあり、大規模なアプリケーションでは、Elixirを利用しているところも多いです。知名度としてはまだまだ低いですが、習得していると他のエンジニアと差別化できることは間違いないでしょう。

Elixirは動的型付けの言語でRubyライクに書けるので、独学は可能だと思いますが、もし独学でできなさそうな方は、プログラミングスクールも手段の一つに入れると良いと思います。