Contenu connexe
Similaire à Erlangやってみた (20)
Erlangやってみた
- 2. Erlang
● PTT
■ 話者:檜山正幸(檜山正幸事務所)
■ 話者:檜山正幸(檜山正幸事務所)
■ 題名: Erlang を用いたウェブ交換機(仮)
■ 題名: Erlang を用いたウェブ交換機(仮)
■ 概要:
■ 概要:
Erlang の簡単な紹介と Erlang を用いたウェブ上でのメッセージ交換
Erlang の簡単な紹介と Erlang を用いたウェブ上でのメッセージ交換
システムについて述べる。 Erlang は 1980 年代末にエリクソンで開発
システムについて述べる。 Erlang は 1980 年代末にエリクソンで開発
された関数型プログラミング言語である。 Erlang は軽量な並行プロ
された関数型プログラミング言語である。 Erlang は軽量な並行プロ
セスの概念を備え、並行処理を簡潔に記述するとともに、マルチコ
セスの概念を備え、並行処理を簡潔に記述するとともに、マルチコ
ア PC あるいは複数 PC 上での並列・分散処理を容易に可能にする点を
ア PC あるいは複数 PC 上での並列・分散処理を容易に可能にする点を
特徴とする。この Erlang を用い、ウェブブラウザ間で双方向リアル
特徴とする。この Erlang を用い、ウェブブラウザ間で双方向リアル
タイム通信を行うシステムを開発している。複数ブラウザの間にジ
タイム通信を行うシステムを開発している。複数ブラウザの間にジ
ャンクチャと呼ばれる中継サーバーを介した通信路を張り、任意の
ャンクチャと呼ばれる中継サーバーを介した通信路を張り、任意の
ブラウザ間で通信したり、同報通信を行ったりすることができる。
ブラウザ間で通信したり、同報通信を行ったりすることができる。
ジャンクチャは Erlang により実装されており、サーバー・ブラウザ
ジャンクチャは Erlang により実装されており、サーバー・ブラウザ
間の Comet 技術を利用した非同期通信と、 Erlang のプロセス間通信
間の Comet 技術を利用した非同期通信と、 Erlang のプロセス間通信
を透過的に扱うように設計した。
を透過的に扱うように設計した。
これはやらねば
- 3. 入門 Erlang
● 文法は Prolog っぽい
– , で式を区切る hello_world() ->
A = 10 * 2 + 1 + (1 + 2) * 100,
– ; で条件を区切る io:fwrite(integer_to_list(A)),
– . でおしまい io:fwrite("Hello, World!n").
● 単一代入
– 変数がちょっと特殊
1> A = 10.
10
2> B = 20.
20
3> A + B.
30
4> A = 20.
** exception error: no match of right hand side value 20
5> A = 5 + 5.
10
- 4. データ構造
● 変数 大文字から始める (A,B,Size,Count)
● アトム 小文字からはじまる (read,write,text)
● タプル {a,b,c}
● リスト [1,2,3]
● 文字列もリスト {person,
{name, joe},
{height, 1.82},
{footsize, 42}}
- 5. パターン照合
X = 10.
X = 5 + 5.
{name,Name} = {name,ina}.
{_,_,_,Age} = {ina,uec,ipl,23}.
[Head|Tail] = [1,2,3,4].
=> Head = 1, Tail = [2,3,4]
- 7. 関数を書いてみよう 2
タプルの正しい使い方
ここもパターン照合
convert({X,cm}) ->
{X/2.54,inch};
convert({X,inch}) ->
{X*2.54,cm}.
タグとしてアトムを利用
なかなか素敵
>convert({20,cm}).
{7.874015748031496,inch}
- 8. 並列処理
● Erlang の得意分野
– 複数の処理が並んで実行される
● 単一代入なので変数の変更の同期などは不要
– (そもそも変更できない)
● 複数の処理がメッセージを投げあって協調動作
- 9. 並列処理
spawn で別スレッドを生成
PID が帰ってくる
PID ! メッセージ
で特定のスレッドにメッセージを送る
Pid = spawn(hoge),
Pid ! {mes ,”Hello”}.
receive で受け取る
receive
{mes , Msg} -> Sample
Sample
io:fwrite(mes).
end.
- 10. 並列処理と GUI
● GS(tk) や wxErlang などの GUI ライブラリ
– Receive を用いてイベントの処理を行う
– 書きやすいのか?
Sample
Sample
- 11. GUI と Erlang
● 気兼ねなく spawn できる
● タプルの型のチェックは実行時
● オブジェクト指向ではない
– コントロールと処理が分離されている
● Button = wxButton:new(),
wxButton:setLabel(Button,”label”).
ライブラリの設計に問題?
●
● 不意に落ちる
– セグメンテーションフォールト
- 12. 話してないこと
● 普通に spawn や receive を使って処理を書い
ておけば、複数コアのマシンで平行に処理でき
るだけでなく 複数マシンで処理を分担させる
ことも可能
● サーバを止めずに処理を差し替える
● エラーハンドリング(死体回収)
● 分散 DB
● 便利なデバッガ