2011年10月4日火曜日

7つの言語7つの世界 Io 3日目



ついにIoも3日目、雑ですがメモと感想を。

DSLを作る話。


phonebook.io

わざわざ文字列をパースしなくても、電話帳のリストを構文として解釈するようにIoを変更({}や:の意味をかえる)

phonebook.ioがそれ。ところでp64のforEachはforeachの間違いかな?なんかここだけ違う。Rubyっぽい。

演算子が自由に定義可能なのは2日目で見たけど{}までも変更出来るなんてヤバい。curlyBracketsメソッドを定義することで{}の動作をいじれる。





Ioのmethod_missing

forwardメッセージをいじればいい。

forwardではメッセージが存在してない場合親に転送する事をしているらしい。

なのでこれを上書きしちゃうとIoとは別ものに…

ここらへんから頭がこんがらがる。

Builder := Object clone
Builder forward := method(
writeln("<", call message name, ">")
call message arguments foreach(
arg,
content := self doMessage(arg)
if (content type == "Sequence", writeln(content)))
writeln("</", call message name, ">"))

Builder ul(
li("Io"),
li("Lua"),
li("JavaScript"))


平行性


Ioには3つ平行性ライブラリがある。



  • コルーチン

  • アクター

  • フューチャ

コルーチン

処理を自由に停止・再開出来る。

@や@@をつけて非同期にメッセージを送信する。@はフューチャを返す。@@は自分のスレッドでメッセージを開始出来る。

yieldを呼ぶと別の処理に制御をうつす。yield書かなくても適当に自動でyieldしてくれるらしい。

制御を移すタイミングをyield呼ぶことで自分で指示出来るのがポイントっぽい。

自分で制御を渡すことが出来るので協調動作も書きやすい。

JavaやCベースの言語はプリエンティブマルチタスキングと言われる平行性の概念を用いているらしい。

第12回 Haskellで学ぶ並列プログラミング(その3)並行プログラミングと並列処理 - 本物のプログラマはHas...:ITpro

実行している処理に割り込む形でタスクを切り替えるので,このような形のマルチタスクを「割り込み型(preemptive,プリエンプティブ)マルチタスク」と呼びます。これに対して,スケジューラではなく実行する処理の側で明示的にタスクを切り替える形のマルチタスクを,「非割り込み型(non-preemptive,ノンプリエンプティブ)マルチタスク」あるいは「協調的(co-operative)マルチタスク」と呼びます。

プリエンティブマルチタスキングな平行方式と変更可能な状態を持つオブジェクトを組み合わせると、予測出来ずテスト方法もアレでデバッグが難しくなる云々。

確かに勝手に割り込んで色々変え合ってたら大変だよね。

「アクターのような高レベルの抽象化を実現する基本的な構築ブロック」がコルーチンらしい。

うーん、書いて自分で読み返してみてイミフ orz

アクター

アクターはメッセージの送受信、アクターを作る事が出来るとか。

受信したメッセージはキューに入れてコルーチンで処理していく。

なのでスレッドのように互いに制限なく変更することが出来るわけではないみたい。

キューで処理していくのでちゃんと制御されてるとか。

Ioでは@@で非同期メッセージ送ればそれがアクターになる超絶便利機能。

x @@foo; y @@bar;


すると同時に実行される。fooとbarの中でyieldを呼んで制御を移す事も出来る。Ioかっけー

フューチャ

@で非同期メッセージを送るとFutureオブジェクトが帰って来る。

非同期メッセージが完了する前にFutureオブジェクトを使うと、完了して値が帰って来るまでブロックされる。

時間かかる処理を@で呼び出しといてFutureの値使わない処理ごにょごにょしてから、Futureの値を使う処理をかく(とFutureの値が帰って来るまで待つ)感じなのかな。

Ioにはデッドロックを自動的に検出する機能もあるらしい。

試してみよう


XMLのやつ



  • 本文のLispMLを改良してインデントさせる

  • 本文のLispMLを改良して属性を処理出来るように。第1引数がMapだったら属性を追加



なんかXMLのやつ想像以上に時間かかった。

args first codeをdoStringしてるんだけど、doMessageでも出来んのかな?

自分の場合上手くいかなくてなんか結構汚い感じ。

これは他の人の回答めっちゃ参考にしないといかんなー

角括弧のリスト構文



  • 角括弧を使ったリスト構文を作成



LispMLに苦労したけどこっちは5分ぐらいで出来たw

これだけで[]でリストが作れるようになる。すげー!

添字アクセスまで作る気力は私に無かった。

ちょっと疑問点




  • 最後の連続したとじ括弧は1行にまとめちゃってもいいのかな?

  • インデントどうつけよう

感想


平行性の話がまだきちんと理解出来てない感じ。

でもIoだと、ただ単にメッセージに@@とか@つけりゃ平行動作・協調動作させたり処理待ちも勝手にやってくれてかなり便利そう。

Io奥が深い…




0 件のコメント:

コメントを投稿