Hatena::ブログ(Diary)

やねうらお−ノーゲーム・ノーライフ このページをアンテナに追加 RSSフィード

GT-Rの買取ならここですわ。どこよりも高く買取ってもらえるはず。お勧め!GT-R 買取
電王戦出場記念! 書籍化されたで! 監修したで!(`ω´) 絶版なってしもた Kindle版で復活!! 記事書いたで!
解析魔法少女美咲ちゃん マジカル・オープン!

YaneuLabs / やねうら王公式 / やねうらおにメール / twitter / プロフィール

 | 

2004-05-25 やねう企画のほげほげソリューション その1(2)

[][][][] 携帯開発用言語(2)  携帯開発用言語(2)を含むブックマーク  携帯開発用言語(2)のブックマークコメント

continuationを用いれば次のようにコーディングできる。

class Hoge {
    coroutine void some_callback_function(){
        A(); yield();
        B(); yield();
        while (C()){
            D(); yield(); E(); yield();
        }
        F();
    }

    //    呼び出し側
    static void test(){
        some_callback_function.Start();
        while (some_callback_function.MoveNext())
                ;
    }
}

これは、次のようにFSM(有限状態マシン)モデルとして以下のように等価変換される。

class Hoge {
    void some_callback_function(){
    retry:;
        switch(state){
        case 0: A(); state++; break;
        case 1: B(); state++; break;
        case 2: if (!C()) { state = 4; goto retry; }
                D(); state++; break;
        case 3: E(); state=2; break;
        case 4: F(); state++; break;
        }
    }
    int state;

    //    呼び出し側
    static void test(){
        state = 0;    //        some_callback_function.Start();
        while (true){
            some_callback_function(); // some_callback_function.MoveNext()
            if (state==5) break;
        }
    }
};

可読性を犠牲にすることもないし、また、タスクシステムでの制御に関数ポインタ等を持ち出す必要もなくなる。これによりJava/C++共通の言語基盤を与えることが出来るというわけだ。この他にも細かい工夫がいろいろあるんだ。詳しくはこの言語を実装してから書くことにする。<まだ構想だけなので。


..これで、brewJava仕事が、たくさん来るといいなぁ..(´Д`)

atsats 2004/05/24 14:09 Schemeでcontinuationを見たんだけど、何だかよくわからんです <= 馬鹿

yaneuraoyaneurao 2004/05/24 14:48 ↑のソースの意味がわかればok。

atsats 2004/05/24 14:54 関数の実行状態を保存して途中から実行しているようにしか見えんでつ。

mihael2mihael2 2004/05/24 15:05 すんません。しょーもないことを質問してもよろしいでしょうか。この綺麗なソースはどうやって生成しているんでつか?

hideahidea 2004/05/24 15:26 はじめまして。恥ずかしながら昨日の日記で初めて continuation を知ったのですが,調べてみるとなかなか面白いですね。Modula2のコルーチンを思い出しました。

yaneuraoyaneurao 2004/05/24 16:36 それで合ってるヨ>ats

yaneuraoyaneurao 2004/05/24 16:40 ソースの変換は santa martaさんのCodeToHTMLを使ってます。>http://santamartadotnet.hp.infoseek.co.jp/releases/freewares/codetohtml.html

yaneuraoyaneurao 2004/05/24 16:51 continuationは、タスクシステムで肝となる概念なので、これなしにプログラムを書こうとすると、すべてFSMモデルで書かないといけなくなるので大変なのです。関連項目→マイクロスレッド

randyrandy 2004/05/24 20:14 「JavaとC++の上限言語」って発想が面白いですよね。私もそんな風な言語、作ってみようかなぁ。

yaneuraoyaneurao 2004/05/24 21:12 randyさんも、じゃあとりあえずメールをくださいヽ(´ー`)<そればっかしやがな

polpol 2004/05/24 23:49 自分もそうい言語作ってみたいと思ったけどその前にC/C++系以外の言語も知っておいたほうがよさそうな。それとyacc+lexとかも要りますよね?

yaneuraoyaneurao 2004/05/24 23:58 yacc+lexみたいなもんは無くても何とでもなります。別にたいしたことしてくれないんで。まあ、使えれば便利ですけどいま使えないならわざわざ使うこともないような..自分の設計した言語のBNFを用意してLR(1)でparseできるかどうかをチェックする時とかは便利そうですけど。<あまり使ってないんで詳しくは知らない

きゆききゆき 2004/05/27 00:50 some_callback_function内ではローカル変数は使わずに、メンバ変数を使うのですね。

yaneuraoyaneurao 2004/05/27 01:26 いや、coroutine宣言している関数におけるローカル変数は自動的にメンバ変数に割り当てられるのです。また、再帰に関しては..とか書き出すと、それだけで結構の量になるので、また気が向いたら続きを書きますです。

きゆききゆき 2004/05/27 10:53 C++で、yieldの前でauto変数定義(コンストラクタ)、yieldの後でスコープアウト(デストラクタ)というような状況をどう変換するのか興味あり…Javaと共用だから組込型以外のauto変数は使わない(ポインタとnewで対応)のかな?

yaneuraoyaneurao 2004/05/27 16:50 意味がちょっとわからんですけど、C++でauto変数を使ったとしても、普通、スタック上で動的に確保なんてしないんでは?コンパイル時にスタックイメージは固定してしまって、関数のエントリで最大使用するスタック量を確保するわけで、coroutineも再帰的な呼び出しを行なわないことが保証されているならば、そのなかで使うローカル変数すべてをメンバとして保持すればいいわけです。

きゆききゆき 2004/05/27 17:55 { Object a(1,2); ...; yield(); ... }のようなのをどう変換するのかな?ということです

きゆききゆき 2004/05/27 17:56 {の直後にa用のコンストラクタ呼び出し、}の直前にa用のデストラクタ呼び出しが必要ですよね

きゆききゆき 2004/05/27 17:59 Object* pa;をメンバ変数にして

きゆききゆき 2004/05/27 18:01 case 9: pa=new Object(1,2); ...; state++; break; case 10: ...; delete pa; ...; break;

きゆききゆき 2004/05/27 18:02 のようにするのでしょうか。

yaneuraoyaneurao 2004/05/27 18:51 概念的にはそれで正しい理解です。ただし、実際はそう単純ではないです。たとえば、deleteなんか使ったらJavaのほうのコードではデストラクタ(ファイナライザ)の呼び出しが強制できないのでいかんです。また、C++のコード生成の場合ですがデストラクタが存在しないクラスならば作りっぱなしでかまわないため、newで動的に確保する必要はないです。

hmorihmori 2004/06/04 20:49 確か rubyで使えた気がする。文字コードの変換ライブラリーなんかを作る時に便利ですよね。ただ、私は電子回路のように生産者がsend(send_data) とやると、途中にFIFOが入っていて、送信先に送られ、FIFOがいっぱいになったら生産者側がサスペンドするような機構が回路図のようにして記載できて、実装はマルチスレッドになるような言語にならないかと考えています。

elel 2004/06/16 12:15 continuation といえば、ECMA-Script の正規表現の実装を思い浮かべます。

みかのみかの 2004/07/02 02:21 brewはBREWね

yaneuraoyaneurao 2004/07/22 07:06 ああ大文字なのか。なるほろ。

トラックバック - http://d.hatena.ne.jp/yaneurao/20040525
 | 

1900 | 01 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 06 | 08 | 10 | 11 | 12 |
2015 | 01 | 02 |


Microsoft MVP
Microsoft MVP Visual C# 2006.07-2011.06