[#48770] Re: Rubyで静的型 — "Toshiyuki Sasaki" <tsasaki1@...>
> この場合、この例では簡単かもしれませんが、たとえばvarが別のメソッド
10 messages
2014/12/23
[#48771] Re: Rubyで静的型
— Hideki Miura <m-72@...6.so-net.ne.jp>
2014/12/23
三浦です
[ruby-dev:48769] Re: Rubyで静的型
From:
Hideki Miura <m-72@...6.so-net.ne.jp>
Date:
2014-12-23 03:43:47 UTC
List:
ruby-dev #48769
はじめまして 三浦と申します。 Rubyの型推論に興味があって、実際に型推論器を書いたことがあります。 bm_app_pentominoがやっと推論できる水準です。 > これでも分かりにくいので例を。 > Xオブジェクトがメンバーa, b, c, dを、Yオブジェクトがメンバーb, c, > d, eを持ち、 > > if 動的な条件 > var = X > else > var = Y > end > var.b > var.c > > のコードがあるとき。 > varはポリモーフィックに振舞います。その背後では、Xについてのメソッド > b, cの使用(使用だからdは含まない)についてのキャップテーブルが > 存在し、それがvar = xのときvarに代入され、var.bでキャップテーブルの > メンバーbがXオブジェクトのメンバーbを参照して、Xのbを呼び出します。 > var = yのときも同様です。varに入るX, Yのキャップテーブルのレイアウト > (b, cの順)はX, Y共に同じで、だからどちらの(実行時分からない) > キャップテーブルの呼び出しにも静的に束縛できます。 > キャップテーブルはそれぞれ共通点の無いX, Yのメモリーレイアウト > (b, cについての)へのポインタをそのメンバーとして持ちます。 > こうしてダックタイピングが静的型束縛をもってできるようになります。 > この場合、この例では簡単かもしれませんが、たとえばvarが別のメソッド に渡した場合などvarが呼び出すであろうメソッドの集合を得るのは、一般的 に困難または不可能であると思います。 また、変数にどんな値が入りうるのか静的に確定させるのはそれなりに 困難です。 このような理由と、多くの場合メソッド呼び出しはある特定のクラスのインスタンス である場合が圧倒的に多いという経験則(必ずしも正しくない)から、 多相型のメソッド呼び出しについては、次のような戦略が無難かと思います インラインメソッドキャッシュを使用して特定のクラスのメソッド呼び出し の速度を高速化する キャッシュのミス率が多い場合、O(1)でアクセスできることの保障される 連想配列(たとえばCuckoo hashing)を(動的に)構築してこれ経由でメソッド 呼び出しする。 もちろん、これは私個人の意見なのでそう考えない人も多いと思います。 ちょっと否定的な意見で申し訳ありません、失礼します。