From: SASADA Koichi Date: 2007-06-14T12:17:24+09:00 Subject: [ruby-dev:30978] Re: Supporting Fiber  ささだです。 Yusuke ENDOH さんは書きました: > 長文失礼します。Lua と Modula-2 をちょっとだけ試してみたので報告します。 > はじめての Lua と Modula-2 なので間違いがあったらごめんなさい。 > 検証したコードは末尾に載せます。 > > > Lua の coroutine は semi-coroutine で、coroutine 間に親子関係がありました。  うう、そういえばそうでした。 > 実行を移すコマンドが二種類 (resume と yield) あります。 > resume で他の coroutine を駆動し、その coroutine が yield するのを待ちま > す。 > resume は親から子を、yield は子から親を駆動する感じです (親は子を選べま > すが、 > 子は親を選べません) 。 > coroutine が終了すると、その coroutine が yield したのと同じ動作をしまし > た。 > 親子関係を壊すような遷移 (子から親を resume する) はエラーになりました。 > 終了した coroutine を resume してもエラーでした。  Pythonと同じですね。 > Modula-2 の coroutine は純粋 (?) な coroutine で、coroutine 同士は対等で > す。 > 従って実行を移すコマンドは一種類 (TRANSFER) だけです。 > TRANSFER で他の coroutine を駆動します。TRANSFER した coroutine は他の > coroutine から TRANSFER されるまで絶対に動きません。 > coroutine が終了するとプログラムごと終了しました。 > > Lua 式と Modula-2 式のどちらがいいかは一長一短だと思います。  はい。 > 1.9 の Fiber は Lua と Modula-2 の中間 (やや Modula-2 寄り) にいる感じ > でしょうか。coroutine 終了時に yield するのは Lua っぽいですが、 > 実行を移すのが 1 種類だけのは Modula-2 っぽいです。  そのとおりです。その意図で作りました。 > Lua は resume と yield の区別によって coroutine の親子関係が保証されてお > り、 > coroutine の終了時の挙動 (親に戻る) が関数呼び出しっぽくてわかりやすいで > す。 > Modula-2 は親も子もなく実行はただ一本で、それが途切れたら全部終わり、と > いう、 > 乱暴な挙動ではありますが、これはこれで筋が通っていると思います。 > 1.9 の現状の Fiber はこのあたりが中途半端なので prev が変なところを > 指している感じがします。  中途半端ととるか、Ruby らしいいいとこ取りととるかは人による 感じでしょうかね。「親子関係をもったような何か」もやりやすい し、「対等な関係」を実現することも可能、というように作りました。  Lua や Python のように、機能を制限しちゃったほうが、やっぱり 幸せな人は多い気がしますねぇ。うーん、どうしようかなぁ。その場 合は、Fiber という名前は変えないといかんな。 > あと噂では、Simula は Lua 式と Modula-2 式の両方の機能を提供しているらしい > (しかしそのせいで非常に複雑な実装になっているらしい) です。  Siumula は調べてませんでした。これは興味深いですね。両方の機 能を、ってのは今の Fiber みたいなの、ということではないんです かね。 ------  ちょっと、コンストラクタによって上記意味が変わるのはどうだろ う、と考えてみたんですが、それはそれでわかりづらいですよねぇ。  他の言語を見てみると「Fiber(のようなもの)が終わる」ってい うのは「例外的な操作」なので、「気をつけてね」でもいいような気 はします。 -- // SASADA Koichi at atdot dot net