新城@筑波大学情報です。こんにちは。

In article <m3oew4562s.fsf@maedapc.cc.tsukuba.ac.jp>
        MAEDA Atusi <maeda@cc.tsukuba.ac.jp> writes:
> > 実はおんなじ引数で呼ぶってのがたくさんあるからinlineにしたい
> > わけなので、それらが共用される可能性があるからspecialization
> > の方が優れていると思います。(subroutine のoverhead が小さければ...)
> 「おんなじ引数で呼ぶってのがたくさんある」というのは良く分からないなあ.
> それも静的にですよね.そんなことがそれほどあるのかしらん.

私の感じだと、(静的に) specialization かけられるプログラムと
いうのは、ゴロゴロしていると思っています。たとえば、こんな感
じのプログラムは、よく見ませんか。
------------------------------------------------------------
f()
{
    for( x=0; x<10; x++ )
    {
        g( x,y,10 );
    }
}

g( x,y,z )
{
    if( z >= 10 )
    {
        h( x, y );
    }
    else
    {
        i( x, y );
    }
}
------------------------------------------------------------

ループの中で変らない変数を引数で渡したりします。10 などの定
数があからさまに出てくることもあるだろうし、x とか y と書い
てあっても、実は定数というのもあるでしょう。10 で
specialization かけるとこうなります。

------------------------------------------------------------
f()
{
    for(...)
    {
        g_10( x,y );
    }
}

g_10( x,y )
{
        h( x, y );
}
------------------------------------------------------------

こうすると、インライン展開は別にやらなくても、g_10() の中で
if文外したり、計算を進めたりできるわけです。まあ、関数呼出し
のインライン展開も、分類上は、specialization の一種ではある
んですけれど。

さらに、x でループの展開もできます。

> 「polymorphicな関数を型についてspecializeする」とかなら価値はあると思
> うけど.

C++のテンプレートの展開以外にも、上のようなコードは、けっ
こうあります。あと、実行時にしか型がわからなくても、実行時 
specialization というのもあります。実行時にコード生成します。
型ごとと言わず、オブジェクトごとにコード生成してもいい場合も
あるでしょう。

たぶん、今までは人間が specialization をしていたんだと思いま
す。これからは、コンパイラに任せる部分を増やしていこうという
方向でいいんだと思います。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\