暗黙の型変換の目処が立った

8月4日追記
  この方法だとうまくいかない場合がありました。bm_so_mandelbrotを試していたのですが、このプログラムでは、ループカウンタを浮動小数点演算の式の中で使っています。この方法だとループカウンタが浮動小数点型になってしまいます。多分動くのでしょうが、速度が大幅に低下してしまいます(でも、型変換の方が重くて実はこっちの方がいいのかもしれない)。また、他の場所も整数で演算できるところが、浮動小数点演算になってしまいます。そういうことで、解決策を考えています。無条件ではなく、条件を絞って型変換するようにするとよいのではないかなと思っています。

追記2
bm_so_mandelbrotとbm_so_nbodyのオリジナルが動くようになりました.まだ根本的なバグがあるかもしれないので、もうちょっとテストして詳細は後日書きます.github(http://github.com/miura1729/yarv2llvm/tree/master) にはアップしました。


yarv2llvmの近況です。まだ、実験段階ですが、暗黙の型変換(Fixnum -> Float)が動きました。bm_so_nbodyの

   SOLAR_MASS = 4 * Math::PI**2

が無修正で動いています。

対応方法はこんな感じです。

  1. yarv2llvmで扱うオブジェクトの型を表現するRubyTypeに@src_typeというメンバーを追加する
    • @src_typeはそのオブジェクトの本当の型を表します
    • 今までの@typeには、そのオブジェクトは外から見るとその型であるように振舞うという意味に変わります
    • @src_typeと@typeが違うときは必要に応じて型変換処理が生成されます
  2. 型推論中にFixnumとFloatで型が衝突した場合の処理を変更する。これまでは、単にType Conflictエラーを出してVALUE型にしていた
    • Fixnum側の型の@src_typeを@typeに変更する
    • Fixnum側の@typeをFloatに変更する
    • つまり、Fixnum側の型を外から見るとFloatのように振る舞い、内部がFixnumであるという型であるとする
  3. 後は必要に応じて@typeと@src_typeを比較して型変換のコードを生成する処理を足していく
    • とりあえず、bm_so_nbodyで必要なところだけ作って試してみたのですが、全部の処理に足していくのがこれからの課題です。普通に足していくと、ただでさえカオスなコードがメンテ不能になるのでちょっと工夫する必要があります。
  4. 暗黙の型変換のカスタマイズ(coerce)なんかもやりたいけどまだ方針が決まっていません。