32
Elixir ととととと ととととと ver.2 Elixir Meetup #2

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

Embed Size (px)

Citation preview

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

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

Elixir Meetup #2

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

Agenda

はじめに|> 自己紹介|> Elixir とは|> Elixir の特徴|> Elixir の良い / 悪い点|> Elixir の仕組み|> 他言語比較

|> まとめ|> コミュニティの紹介|> 最後に ( 例のやつ

elixirの紹介します。

今日のゴールは elixirに興味

持ってもらう事。

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

はじめに

※ 個人の見解であり所属する組織の公式見解ではありません

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

はじめに

※ 個人の見解であり所属する組織の公式見解ではありません

ルビーパイソン

Elixir

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

はじめに スカラElixir

Elixir

※ 個人の見解であり所属する組織の公式見解ではありません

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

はじめに

Perl

Elixir

※ 個人の見解であり所属する組織の公式見解ではありません

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

はじめに

PHP※ 個人の見解であり所属する組織の公式見解ではありません

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

はじめにという話ではありません。プログラミング言語にはそれぞれ向き不向きな領域があります。用途に応じて使い分けるのが大切です。今日はまだまだ知名度はイマイチな Elixir の紹介をします。

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

自己紹介• おーはら (@ohrdev)• 好きな Behaviours : GenEvent• FF14( 光の戦士 : Lv60 白魔 )

– 中 2 っぽい名前のライブラリが Elixir には多い• 普段やってる事

– 寺社仏閣巡り / 写経 / 仏像彫り / 丸太収集– RedBull / ダイエット

• その他– 株式会社ドリコム 技術基盤部– 広告システムの開発 / メンテ /etc

• Elixir/Phoenix, Erlang/OTP, Lisp, Ruby/Rails• プロダクションで実際に Elixir を使ってます (1 年程 )

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

Elixir とは• JoseValim が開発している ErlangVM 上で動作する汎用プログラミング言語• http://elixir-lang.org/• https://github.com/elixir-lang/elixir• 動的な関数型言語• スケーラブル / メンテナブルなアプリを書ける• 低レイテンシ / 分散性 / 耐障害性をもつ VM• Ruby/Erlang/Clojure に影響を受けた言語

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

Elixir の特徴• ErlangVM 上で動作する• Erlang の特徴をほぼ踏襲している– 並行 / 耐障害 / 分散 /etc– Elixir の独自機能 (Stream/Pipe/ 遅延処理 / マクロ

/ プロトコル /etc)• Erlang のエコシステムの恩恵を受けられる– オーバーヘッドなしに Erlang の関数を call できる

• Syntax は Ruby チック– ただし見た目”だけ”、 Ruby の皮を被った Erlang

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

Erlang の特徴• Elixir の特徴は Erlang の特徴でもある• アクターモデル (Scala で言う所の Akka)• Let It Crash(Defensive Programming と逆の思想 )

– 障害が起きたらクラッシュさせて、 Supervisor で再起動• 超軽量プロセス

– 1 プロセス 30word 程度、起動に数マイクロ秒、上限は2.6 億プロセス程度、 GC はプロセス単位

• OTP(OpenTelecomPlatform) が強力– 汎用的な並列 / 分散 / 障害処理の F/W– Elixir の言語自体も OTP のアプリとして言語ランタイムを提供している

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

OTP

• OpenTelecomPlatform– アプリケーション作成を助けるモジュール / パターン ( 振る舞い / ビヘイビア ) のセット– Elixir は Erlang の OTP のラップしたものを提供– 振る舞いが要求する callback を実装してアプリを組み立てる

• 振る舞い(ビヘイビア)– Application– Supervisor– GenServer– GenEvent

– Agent(GenFsm)– Task– etc

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

Elixir の良い / 悪い点• 良い点– Erlang の良い所全部– 目に優しい( Erlang のコードに比べると )– Erlang のエコシステムを利用可能– スケーリングが ( 比較的 ) 楽にできる

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

Elixir の良い / 悪い点• 悪い点– Erlang の悪い所全部– ドラスティックに言語仕様が変わる• 開発スピード / 言語仕様更新が早い• 開発スピード / 言語仕様更新がとても早い

– Erlang 知らないと debug 辛い ( 中身は Erlang)– ErlangVM はそんなに速く無い– Erlang のバージョン縛りがわりと強い– エコシステムがまだ十分に成熟してない–静的型付けではない

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

Elixir のしくみ• OTP アプリケーションとして言語ランタイムを提供• コンパイルすると最終的に Erlang の実行バイナリ (Beam) を吐く• Elixirから Erlang のモジュールを呼んだり、

Erlangから Elixir のモジュールを呼べる( オーバーヘッド無し )

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

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

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

Erlang のコンパイル• Erlang のコンパイル1. ソースファイルをスキャン (erl_scan) して文字列に変換2. ソースの文字列をトークンに変換3. トークンをパース (erl_parse) して AST に変換

4. AST を erl_eval して実行 or5. AST をコンパイル (compile) して実行ファイル

(beam) に変換6. Beam を VM に load して実行

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

Erlang のコンパイルソースコード

xxx.erl文字列 Token AST

erl_scan erl_parse

実行ファイルxxx.beam

compile

VM に load& 実行

erl_eval

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

Elixir のコンパイル• Elixir のコンパイル

1. Elixir のソースフィルを Elixir の AST に変換2. Elixir の AST を Erlang の AST に変換3. Erlang の AST を erl_eval して実行 or4. AST をコンパイル (compile) して実行ファイル

(beam) に変換5. Beam を VM に load して実行

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

Elixir のコンパイルソースコード

xxx.exElixir AST Erlang AST

実行ファイルxxx.beam

compile

VM に load& 実行

erl_eval

AST レベルで変換 オーバーヘッドなし

Elixir の OTP アプリケーションで実現

シームレスにerlang のコードを

call できる

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

他言語比較• Elixir vs Scala vs Ruby– エコシステム , コミュニティ規模 ,ユーザー数• Ruby > Scala > Elixir

–採用事例 / 仕事• Ruby >> Scala >>> Elixir

–主要 WAF• Elixir: Phoenix• Ruby: Rails• Scala: Play

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

Elixir vs Ruby

• 関数型 vs 手続き型 /OOP– Elixir: 関数型、メタプログラミング、マクロ– Ruby: 手続き型、 OOP 、メタプログラミング

• Elixir コミュニティには Ruby クラスタの人達が多い

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

Elixir vs Scala

• アクターモデルのアーキテクチャ– Elixir: 言語 (ErlangVM) レベルで実装– Scala: ライブラリ (Akka) レベルで実装– 自由度: Elixir < Scala

• ex) メールボックスの処理アルゴリズム ( 自前実装も可能 )– 処理性能: Elixir > Scala ※ そこまで気にならない ?

• Elixir は GC による StopTheWorld がない• 同時処理数 / プロセス起動時間 / プロセスマイグレーション性能 / プロセスの使用メモリ / スケーリング /etc

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

コードサンプル (Elixir)

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

コードサンプル (Elixir)

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

コードサンプル (Erlang)

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

まとめ• 見た目は Ruby 、中身は Erlang• Elixir を使う前に Erlang を勉強したほうが捗る ( と思います )• Erlang のエコシステムに乗っかれるよ• Erlang も ( 見た目以外は )面白い言語です• OTP に乗っかろう ( レールに乗ろう)• (Erlang)VM はそんなに速く無い• (Erlang)VM のスケーリングは ( 比較的 ) 楽

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

まとめ見た目は Ruby中身は Erlang

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

コミュニティの紹介• meguro.ex–4 /19(火 ) に #1 を予定しています– 会場はアカツキさんのオフィスの予定http://aktsk.jp/recruit/category/new_service_engineer.html

• sapporo beamhttp://sapporo-beam.github.io

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

おまけ• トラッキングしておくと良いかもしれない言語– Pony

• http://www.ponylang.org/• http://www.slideshare.net/matsu_chara/pony-concurrency-b

uilt-into-the-type-system-59778750

• OOP• アクターモデル• HighPerformance• Erlang の OTP相当のものもある• Post Erlang?

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

ドリコムは (プログラミング言語好きな )エンジニアを募集しています。http://www.drecom.co.jp/recruit/

[PR]