yarv2llvmでduck typingが出来るような気がしてきたメモ
yarv2llvmではポリモフィズムはやらないとずーっといっているわけですが、Inline cachingはやらなくても効率よくduck typingが出来るような気がしてきたのでブランチを切って試してみようかなと思っています。
まだ、曖昧でただの興味本位なんですがこんな方針です。
- 基本的にC++のように仮想関数テーブルを使う
- でも、Rubyの場合、素直に仮想関数テーブルを作るとサイズが爆発してしまうと思う
- とりあえずyarv2llvmでは型推論であるメソッドコールについてレシーバに来るであろうクラスが限定される。そして、よほど特殊なプログラムじゃなければ高々2〜3種類である。
- クラスのアドレス(これはJITなんでコンパイル時にわかる)から、0, 1, 2などの小さくできるだけ連続した整数を生成する式をコンパイル時に生成しこれをインライン展開する。
- 関数のアドレステーブルを作っておいて生成した整数をインデックスに関数のアドレスをgetして直接ジャンプ
4のクラスのアドレスとメソッド番号からできるだけ連続した小さな整数を求める式ですが、完全ハッシュ関数見たいなものを考えています。もちろん、完全ハッシュ関数をメソッドコールごとに行うと重いですが、高々数個のアドレスから大体連続した整数を求めるのであれば、うまい式があるんじゃないかなと楽観的に考えています。
追記
例えば、[]メソッドでHashとArrayがレシーバーになりえる場合、Hashが0x1234440、Arrayが0x1234560だった場合、こんな感じのコードを出します。
tmp1 = self / 0x1234560 jump_table[tmp1](引数) # jump_table[0] Hash用[], jump_table[1] Array用[]