プログラミング言語

Elixir えりくさー

関数型プログラミングErlang VM並行処理Phoenix耐障害性リアルタイム
Elixirについて教えて

簡単に言うとこんな感じ!

Elixirは「めちゃくちゃ大勢の人が同時にアクセスしてきても落ちないシステムを作るのが得意」なプログラミング言語だよ!電話網を動かすために生まれた超堅牢な仕組みの上で動くから、チャットや通知システムみたいなリアルタイムなサービスを作るのにピッタリなんだ!


Elixirとは

Elixirは、2012年にJosé Valim(ジョゼ・ヴァリム)によって開発されたプログラミング言語です。Erlang VM(BEAM) という、もともと電話交換機の制御システムのために作られた実行基盤の上で動作します。この「電話網品質」の実行環境により、数百万の同時接続を処理しながらも高い可用性(システムが止まらない性質) を実現できます。

Elixirの特徴は大きく2つあります。1つ目は関数型プログラミングのスタイルを採用していること。データは「変更しない(イミュータブル)」が原則で、バグが混入しにくい設計になっています。2つ目は並行処理の得意さです。Elixirは「プロセス」と呼ばれる超軽量な実行単位を大量に起動でき、1台のサーバーで数十万〜数百万のプロセスを同時に動かすことができます。

ビジネス的な観点では「チャット機能」「リアルタイム通知」「IoTデバイス管理」など、大量の接続を同時に捌きながら止まらないことが求められるシステムに向いています。逆に、単純な業務処理や科学計算には他の言語の方が向いていることもあります。


Elixirの主な特徴・構造

特徴内容実務での意味
BEAM(Erlang VM)上で動作30年以上実績のある実行環境を利用「99.9999999%稼働率」の実績を持つ基盤
関数型パラダイムデータを変更せず、関数で変換を繰り返すバグが混入しにくく、テストがしやすい
軽量プロセスOS のスレッドより遥かに軽い並行実行単位1台で数百万同時接続も可能
パターンマッチング値の形に応じて処理を分岐する記法コードがシンプルで読みやすくなる
耐障害性(Let it crash)プロセスが落ちても自動で再起動する仕組みシステム全体が落ちにくい
マクロ(メタプログラミング)言語自体を拡張できる機能DSL(専用小言語)を作れる柔軟性

覚え方:「エリクサー=不老不死の霊薬」

Elixir(エリクサー)は「不老不死の霊薬」という意味を持つ英単語です。その名のとおり、プロセスが死んでも蘇り(自動再起動)、止まらない(高可用) システムを作れる言語、と覚えると特徴がスッと入ってきますよ!

Elixirコードの雰囲気

# パイプ演算子(|>)で処理をつなぐのがElixirらしい書き方
"hello world"
|> String.upcase()        # "HELLO WORLD"
|> String.split(" ")      # ["HELLO", "WORLD"]
|> Enum.join("-")         # "HELLO-WORLD"

# パターンマッチング
case HTTPClient.get(url) do
  {:ok, response}    -> process(response)
  {:error, reason}   -> Logger.error(reason)
end

パイプ演算子(|>)で処理を「流れるように」つなぐのがElixirの書き方の特徴で、読みやすいコードが書けます。


歴史と背景

  • 1986年 — Ericsson社がErlang言語を開発。電話交換機制御という「止まったら人命に関わる」用途向けに、高可用性・並行処理を最優先設計
  • 1998年 — ErlangがオープンソースとしてEricsson社から公開される
  • 2010年 — José ValimがRuby on Railsのコアメンバーとして活躍しながら、Erlangの堅牢性とRubyの書きやすさを組み合わせた言語の開発を開始
  • 2012年 — Elixir v0.1をリリース。Erlang VMの上でRubyライクな構文を実現
  • 2014年 — Webフレームワーク Phoenix がリリース。高速なリアルタイムWeb開発を可能にする
  • 2016〜 — Discord(ゲーマー向けチャット)、WhatsApp競合、PagerDutyなど大規模サービスでの採用が相次ぐ
  • 2020年代 — LiveView(ブラウザをリアルタイムで更新する仕組み)の普及により、フルスタック開発でも注目度が急上昇

ElixirとほかのWebシステム向け言語の比較

言語・技術スタックの比較 項目 Elixir Node.js Ruby on Rails Go 同時接続の得意さ ◎ 非常に得意 ○ 得意 △ 苦手 ◎ 非常に得意 耐障害性 ◎ 自動再起動 △ 要設計 △ 要設計 ○ 得意 学習のしやすさ △ やや難 ○ 比較的容易 ◎ 非常に容易 ○ 比較的容易 エンジニア採用 △ 少ない ◎ 多い ◎ 多い ○ 増加中 得意な用途 チャット・IoT リアルタイム API・フロント との連携 Webアプリ 業務システム インフラ・CLI マイクロサービス 💡 発注者視点のポイント 「止まれない」「同時に大量接続を捌く」要件があるならElixirは有力候補。 ただしエンジニアが少ないため、採用・外注のしやすさは事前に確認を!

Elixirのエコシステム:主要ライブラリ・ツール

名称役割
PhoenixElixir製Webフレームワーク。リアルタイム通信(LiveView)も標準装備
Ectoデータベース操作ライブラリ(RailsのActive Recordに相当)
Mixプロジェクト管理・ビルドツール
HexElixirのパッケージリポジトリサービスNodenpmに相当)
OTP(Open Telecom Platform)Erlang由来の並行・分散処理の基盤ライブラリ群
NervesIoTデバイス向けにElixirを組み込む仕組み

関連する規格・RFC

※ Elixir自体に対応するIETF RFCやISO規格は存在しませんが、基盤となるErlang VMや関連プロトコルには以下の規格が関連します。

規格・RFC番号内容
RFC 6455WebSocket プロトコル。PhoenixのLiveView・Channelが利用
RFC 7540HTTP/2。Phoenixが対応するHTTPプロトコル

関連用語

  • 関数型プログラミング — データを「変換」する考え方でプログラムを書くパラダイム
  • Erlang — Elixirが動作するBEAM VMを生んだ電話通信向け言語
  • 並行処理 — 複数の処理を同時に進める仕組み。Elixirが最も得意とする領域
  • Phoenix Framework — ElixirのWebフレームワーク。リアルタイム通信に強い
  • マイクロサービス — システムを小さなサービスに分割するアーキテクチャ。Elixirと相性が良い
  • WebSocket — ブラウザとサーバーが双方向通信するプロトコル。Phoenixが標準対応
  • IoT — モノのインターネット。ElixirのNervesプロジェクトで組み込み開発も可能
  • Ruby on Rails — Elixir作者が元コアメンバーだったWebフレームワーク。設計思想に影響を与えた