SlideShare a Scribd company logo
1 of 29
Elixirについて私
が知ってる二、
三の事柄
歌舞伎座.tech #9 2016/3/20
異種プログラミング言語格闘勉強会
(Elixir枠)
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年程)
※週4〜5リットル程飲んでますが、体に異常はありません
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)
– 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
まとめ
• 見た目はRuby、中身はErlang
• Elixirを使う前にErlangを勉強したほうが捗る
(と思います)
• Erlangのエコシステムに乗っかれるよ
• Erlangも(見た目以外は)面白い言語です
• OTPに乗っかろう(レールに乗ろう)
• (Erlang)VMはそんなに速く無い
• (Erlang)VMのスケーリングは(比較的)楽
まとめ
見た目はRuby
中身はErlang
コミュニティの紹介
• ElixirMeetup#2
– 3/21(月)
http://beam-lang.connpass.com/event/25287
• meguro.ex
– 4/19(火)に#1を予定しています
– 会場はアカツキさんのオフィスの予定
http://aktsk.jp/recruit/category/new_service_engineer.html
• sapporo beam
http://sapporo-beam.github.io
ドリコムは(プログラミング言語好きな)
エンジニアを募集しています。
http://www.drecom.co.jp/recruit/
[PR]

More Related Content

Viewers also liked

elixirを使ったゲームサーバ
elixirを使ったゲームサーバelixirを使ったゲームサーバ
elixirを使ったゲームサーバHidetaka Kojo
 
Regular expressions à la carte
Regular expressions à la carteRegular expressions à la carte
Regular expressions à la carteHikaru Yoshimura
 
Pony concurrency built into the type system
Pony concurrency built into the type systemPony concurrency built into the type system
Pony concurrency built into the type systemmatsu_chara
 
Ruby 風シンタックスな静的言語 Crystal の紹介
Ruby 風シンタックスな静的言語 Crystal の紹介Ruby 風シンタックスな静的言語 Crystal の紹介
Ruby 風シンタックスな静的言語 Crystal の紹介Kazuki Matsushita
 
プログラミング・パラダイム
プログラミング・パラダイムプログラミング・パラダイム
プログラミング・パラダイムYusuke Matsushita
 
TravisCIでErlang/OTP (最小構成版)
TravisCIでErlang/OTP (最小構成版)TravisCIでErlang/OTP (最小構成版)
TravisCIでErlang/OTP (最小構成版)Masatoshi Itoh
 
Getting Rest With Webmachine
Getting Rest With WebmachineGetting Rest With Webmachine
Getting Rest With Webmachinekevsmith
 
Terraform始めました
Terraform始めましたTerraform始めました
Terraform始めましたw1mvy pine
 
中高生向けUnity講座
中高生向けUnity講座中高生向けUnity講座
中高生向けUnity講座Makoto Ito
 
Unityで使うRabbitMQ
Unityで使うRabbitMQUnityで使うRabbitMQ
Unityで使うRabbitMQMasatoshi Itoh
 
非同期データ更新のためにメッセージキューを導入した(い)話
非同期データ更新のためにメッセージキューを導入した(い)話非同期データ更新のためにメッセージキューを導入した(い)話
非同期データ更新のためにメッセージキューを導入した(い)話Takaaki Hirano
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる5t111111
 
Experiments in Sharing Java VM Technology with CRuby
Experiments in Sharing Java VM Technology with CRubyExperiments in Sharing Java VM Technology with CRuby
Experiments in Sharing Java VM Technology with CRubyMatthew Gaudet
 
Elixir v1.3 で入るかもしれない機能
Elixir v1.3 で入るかもしれない機能Elixir v1.3 で入るかもしれない機能
Elixir v1.3 で入るかもしれない機能hayabusa333
 
Windows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー についてWindows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー についてOsamu Monoe
 

Viewers also liked (20)

elixirを使ったゲームサーバ
elixirを使ったゲームサーバelixirを使ったゲームサーバ
elixirを使ったゲームサーバ
 
Regular expressions à la carte
Regular expressions à la carteRegular expressions à la carte
Regular expressions à la carte
 
Pony concurrency built into the type system
Pony concurrency built into the type systemPony concurrency built into the type system
Pony concurrency built into the type system
 
Ruby 風シンタックスな静的言語 Crystal の紹介
Ruby 風シンタックスな静的言語 Crystal の紹介Ruby 風シンタックスな静的言語 Crystal の紹介
Ruby 風シンタックスな静的言語 Crystal の紹介
 
Visulan intro
Visulan introVisulan intro
Visulan intro
 
プログラミング・パラダイム
プログラミング・パラダイムプログラミング・パラダイム
プログラミング・パラダイム
 
Lin 通信
Lin 通信Lin 通信
Lin 通信
 
TravisCIでErlang/OTP (最小構成版)
TravisCIでErlang/OTP (最小構成版)TravisCIでErlang/OTP (最小構成版)
TravisCIでErlang/OTP (最小構成版)
 
Getting Rest With Webmachine
Getting Rest With WebmachineGetting Rest With Webmachine
Getting Rest With Webmachine
 
Terraform始めました
Terraform始めましたTerraform始めました
Terraform始めました
 
Clojure入門
Clojure入門Clojure入門
Clojure入門
 
tokyo.ex3 LT
tokyo.ex3 LTtokyo.ex3 LT
tokyo.ex3 LT
 
中高生向けUnity講座
中高生向けUnity講座中高生向けUnity講座
中高生向けUnity講座
 
Unityで使うRabbitMQ
Unityで使うRabbitMQUnityで使うRabbitMQ
Unityで使うRabbitMQ
 
非同期データ更新のためにメッセージキューを導入した(い)話
非同期データ更新のためにメッセージキューを導入した(い)話非同期データ更新のためにメッセージキューを導入した(い)話
非同期データ更新のためにメッセージキューを導入した(い)話
 
IEXを学ぶ
IEXを学ぶIEXを学ぶ
IEXを学ぶ
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる
 
Experiments in Sharing Java VM Technology with CRuby
Experiments in Sharing Java VM Technology with CRubyExperiments in Sharing Java VM Technology with CRuby
Experiments in Sharing Java VM Technology with CRuby
 
Elixir v1.3 で入るかもしれない機能
Elixir v1.3 で入るかもしれない機能Elixir v1.3 で入るかもしれない機能
Elixir v1.3 で入るかもしれない機能
 
Windows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー についてWindows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー について
 

More from Tsunenori Oohara

More from Tsunenori Oohara (13)

Elixirハンズオン2
Elixirハンズオン2Elixirハンズオン2
Elixirハンズオン2
 
meguro.rb LT
meguro.rb LTmeguro.rb LT
meguro.rb LT
 
Elixir解答
Elixir解答Elixir解答
Elixir解答
 
パンチラに関する考察
パンチラに関する考察パンチラに関する考察
パンチラに関する考察
 
how-to-learn-elixir
how-to-learn-elixirhow-to-learn-elixir
how-to-learn-elixir
 
Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486Elixir-Conf-Japan-2017-session-ohr486
Elixir-Conf-Japan-2017-session-ohr486
 
Re:デブ デブナイト vol.2 LT
Re:デブ デブナイト vol.2 LTRe:デブ デブナイト vol.2 LT
Re:デブ デブナイト vol.2 LT
 
Tokyoex6 EEx
Tokyoex6 EExTokyoex6 EEx
Tokyoex6 EEx
 
running-elixir-in-production
running-elixir-in-productionrunning-elixir-in-production
running-elixir-in-production
 
hello waf, hello phoenix
hello waf, hello phoenixhello waf, hello phoenix
hello waf, hello phoenix
 
Elixir lang bootstrap
Elixir lang bootstrapElixir lang bootstrap
Elixir lang bootstrap
 
elixir in production
elixir in productionelixir in production
elixir in production
 
地獄Spec
地獄Spec地獄Spec
地獄Spec
 

Elixirについて私が知ってる二、三の事柄