Hatena::ブログ(Diary)

miura1729の日記 このページをアンテナに追加 RSSフィード

2008-12-04

yarv2llvmでduck typingが出来るような気がしてきたメモ

18:15 |  yarv2llvmでduck typingが出来るような気がしてきたメモを含むブックマーク  yarv2llvmでduck typingが出来るような気がしてきたメモのブックマークコメント

yarv2llvmではポリモフィズムはやらないとずーっといっているわけですが、Inline cachingはやらなくても効率よくduck typingが出来るような気がしてきたのでブランチを切って試してみようかなと思っています。

まだ、曖昧でただの興味本位なんですがこんな方針です。

  1. 基本的にC++のように仮想関数テーブルを使う
  2. でも、Rubyの場合、素直に仮想関数テーブルを作るとサイズが爆発してしまうと思う
  3. とりあえずyarv2llvmでは型推論であるメソッドコールについてレシーバに来るであろうクラスが限定される。そして、よほど特殊なプログラムじゃなければ高々2〜3種類である。
  4. クラスのアドレス(これはJITなんでコンパイル時にわかる)から、0, 1, 2などの小さくできるだけ連続した整数を生成する式をコンパイル時に生成しこれをインライン展開する。
  5. 関数のアドレステーブルを作っておいて生成した整数インデックス関数のアドレスをgetして直接ジャンプ

4のクラスのアドレスとメソッド番号からできるだけ連続した小さな整数を求める式ですが、完全ハッシュ関数見たいなものを考えています。もちろん、完全ハッシュ関数をメソッドコールごとに行うと重いですが、高々数個のアドレスから大体連続した整数を求めるのであれば、うまい式があるんじゃないかなと楽観的に考えています。

追記

例えば、[]メソッドでHashとArrayがレシーバーになりえる場合、Hashが0x1234440、Arrayが0x1234560だった場合、こんな感じのコードを出します。

    tmp1 = self / 0x1234560
    jump_table[tmp1](引数)    # jump_table[0] Hash用[], jump_table[1] Array用[]

ささだささだ 2008/12/10 07:00 hash関数の動的生成は,広義の PIC と言えるかも? クラス解析+インラインキャッシュという感じ.

miura1729miura1729 2008/12/10 12:49 どうもInlining Cacheというと、自己書き換えが必須って思い込んでいました。たしかに、PICの一種ですね。新しい方法を考えた!って悦にはいっていたのですが、Selfってすげーなーって思います。

ささだささだ 2008/12/10 13:31 私は逆に自己書き換え必須っぽいのがよくわからんのですよねぇ.だって,キャッシュってエントリーに書き込む話じゃん,みたいな.

miura1729miura1729 2008/12/10 17:20 確かに自己書き換え必須ってのは根拠がないですね。
思うに、普通、自己書き換えなんかやると怒られるところですが、Inlining Casheだよ言うとあら不思議ほめられるみたいな、そんな流れを作ろうと無意識にしているんですかね。多分違いますね。
実際、自己書き換えって速くなるんだろうか?

トラックバック - http://d.hatena.ne.jp/miura1729/20081204/1228382100