Elixirと他言語の
比較的紹介
ver.2
Elixir Meetup #2
Agenda
はじめに
|> 自己紹介
|> Elixirとは
|> Elixirの特徴
|> Elixirの良い/悪い点
|> Elixirの仕組み
|> 他言語比較
|> まとめ
|> コミュニティの紹介
|> 最後に(例のやつ
はじめに
※個人の見解であり所属する組織の公式見解ではありません
はじめに
※個人の見解であり所属する組織の公式見解ではありません
ル
ビ
ー
パ
イ
ソ
ン
Elixir
はじめに
ス
カ
ラ
Elixir
Elixir
※個人の見解であり所属する組織の公式見解ではありません
はじめに
Perl
Elixir
※個人の見解であり所属する組織の公式見解ではありません
はじめに
PHP
※個人の見解であり所属する組織の公式見解ではありません
はじめに
という話ではあり
ません。
プログラミング言語にはそれぞれ向き不向きな
領域があります。用途に応じて使い分けるのが
大切です。
今日はまだまだ知名度はイマイチなElixirの紹
介をします。
自己紹介
• おーはら(@ohrdev)
• 好きなBehaviours:GenEvent
• FF14(光の戦士: Lv60白魔)
– 中2っぽい名前のライブラリがElixirには多い
• 普段やってる事
– 寺社仏閣巡り/写経/仏像彫り/丸太収集
– RedBull / ダイエット
• その他
– 株式会社ドリコム 技術基盤部
– 広告システムの開発/メンテ/etc
• Elixir/Phoenix, Erlang/OTP, Lisp, Ruby/Rails
• プロダクションで実際にElixirを使ってます(1年程)
Elixirとは
• JoseValimが開発しているErlangVM上で動作
する汎用プログラミング言語
• http://elixir-lang.org/
• https://github.com/elixir-lang/elixir
• 動的な関数型言語
• スケーラブル/メンテナブルなアプリを書ける
• 低レイテンシ/分散性/耐障害性をもつVM
• Ruby/Erlang/Clojureに影響を受けた言語
Elixirの特徴
• ErlangVM上で動作する
• Erlangの特徴をほぼ踏襲している
– 並行/耐障害/分散/etc
– Elixirの独自機能(Stream/Pipe/遅延処理/マクロ/
プロトコル/etc)
• Erlangのエコシステムの恩恵を受けられる
– オーバーヘッドなしにErlangの関数をcallできる
• SyntaxはRubyチック
– ただし見た目”だけ”、Rubyの皮を被ったErlang
Erlangの特徴
• Elixirの特徴はErlangの特徴でもある
• アクターモデル(Scalaで言う所のAkka)
• Let It Crash(Defensive Programmingと逆の思想)
– 障害が起きたらクラッシュさせて、Supervisorで再起動
• 超軽量プロセス
– 1プロセス30word程度、起動に数マイクロ秒、上限は2.6
億プロセス程度、GCはプロセス単位
• OTP(OpenTelecomPlatform)が強力
– 汎用的な並列/分散/障害処理のF/W
– Elixirの言語自体もOTPのアプリとして言語ランタイムを提
供している
OTP
• OpenTelecomPlatform
– アプリケーション作成を助けるモジュール/パター
ン(振る舞い/ビヘイビア)のセット
– ElixirはErlangのOTPのラップしたものを提供
– 振る舞いが要求するcallbackを実装してアプリを
組み立てる
• 振る舞い(ビヘイビア)
– Application
– Supervisor
– GenServer
– GenEvent
– Agent(GenFsm)
– Task
– etc
Elixirの良い/悪い点
• 良い点
– Erlangの良い所全部
– 目に優しい(Erlangのコードに比べると)
– Erlangのエコシステムを利用可能
– スケーリングが(比較的)楽にできる
Elixirの良い/悪い点
• 悪い点
– Erlangの悪い所全部
– ドラスティックに言語仕様が変わる
• 開発スピード/言語仕様更新が早い
• 開発スピード/言語仕様更新がとても早い
– Erlang知らないとdebug辛い(中身はErlang)
– ErlangVMはそんなに速く無い
– Erlangのバージョン縛りがわりと強い
– エコシステムがまだ十分に成熟してない
– 静的型付けではない
Elixirのしくみ
• OTPアプリケーションとして言語ランタイムを
提供
• コンパイルすると最終的にErlangの実行バイ
ナリ(Beam)を吐く
• ElixirからErlangのモジュールを呼んだり、
ErlangからElixirのモジュールを呼べる(オー
バーヘッド無し)
Elixirの仕組み
• コンパイラはErlang実装
– Leex(Lexical analyzer generator for Erlang)
• 現在は使われていない(elixir_tokenizerモジュールを
JoseValimがElixir用に作成)
– Yecc(LALR-1 Parser Generator for Erlang)
• カーネルはElixir実装
• 周辺ツール
– eex/ex_unit/iex/logger/mix
• サブ/関連プロジェクト
– plug/ecto/hexpm
Erlangのコンパイル
• Erlangのコンパイル
1. ソースファイルをスキャン(erl_scan)して文字列に
変換
2. ソースの文字列をトークンに変換
3. トークンをパース(erl_parse)してASTに変換
4. ASTをerl_evalして実行 or
5. ASTをコンパイル(compile)して実行ファイル
(beam)に変換
6. BeamをVMにloadして実行
Erlangのコンパイル
ソースコード
xxx.erl
文字列 Token AST
erl_scan erl_parse
実行ファイル
xxx.beam
compile
VMにload
&実行
erl_eval
Elixirのコンパイル
• Elixirのコンパイル
1. ElixirのソースフィルをElixirのASTに変換
2. ElixirのASTをErlangのASTに変換
3. ErlangのASTをerl_evalして実行 or
4. ASTをコンパイル(compile)して実行ファイル
(beam)に変換
5. BeamをVMにloadして実行
Elixirのコンパイル
ソースコード
xxx.ex
Elixir AST Erlang AST
実行ファイル
xxx.beam
compile
VMにload
&実行
erl_eval
ASTレベルで変換 オーバー
ヘッドなし
ElixirのOTPアプリ
ケーションで実現
シームレスにerlang
のコードをcallできる
他言語比較
• Elixir vs Scala vs Ruby
– エコシステム,コミュニティ規模,ユーザー数
• Ruby > Scala > Elixir
– 採用事例/仕事
• Ruby >> Scala >>> Elixir
– 主要WAF
• Elixir: Phoenix
• Ruby: Rails
• Scala: Play
Elixir vs Ruby
• 関数型 vs 手続き型/OOP
– Elixir: 関数型、メタプログラミング、マクロ
– Ruby: 手続き型、OOP、メタプログラミング
• ElixirコミュニティにはRubyクラスタの人達が
多い
Elixir vs Scala
• アクターモデルのアーキテクチャ
– Elixir:言語(ErlangVM)レベルで実装
– Scala:ライブラリ(Akka)レベルで実装
– 自由度:Elixir < Scala
• ex) メールボックスの処理アルゴリズム(自前実装も可
能)
– 処理性能:Elixir > Scala ※そこまで気にならない?
• ElixirはGCによるStopTheWorldがない
• 同時処理数/プロセス起動時間/プロセスマイグレー
ション性能/プロセスの使用メモリ/スケーリング/etc
コードサンプル(Elixir)
コードサンプル(Elixir)
コードサンプル(Erlang)
まとめ
• 見た目はRuby、中身はErlang
• Elixirを使う前にErlangを勉強したほうが捗る
(と思います)
• Erlangのエコシステムに乗っかれるよ
• Erlangも(見た目以外は)面白い言語です
• OTPに乗っかろう(レールに乗ろう)
• (Erlang)VMはそんなに速く無い
• (Erlang)VMのスケーリングは(比較的)楽
まとめ
見た目はRuby
中身はErlang
コミュニティの紹介
• meguro.ex
– 4/19(火)に#1を予定しています
– 会場はアカツキさんのオフィスの予定
http://aktsk.jp/recruit/category/new_service_engin
eer.html
• sapporo beam
http://sapporo-beam.github.io
おまけ
• トラッキングしておくと良いかもしれない言語
– Pony
• http://www.ponylang.org/
• http://www.slideshare.net/matsu_chara/pony-
concurrency-built-into-the-type-system-59778750
• OOP
• アクターモデル
• HighPerformance
• ErlangのOTP相当のものもある
• Post Erlang?
ドリコムは(プログラミング言語好きな)
エンジニアを募集しています。
http://www.drecom.co.jp/recruit/
[PR]

Elixirと他言語の比較的紹介 ver.2