[前][次][番号順一覧][スレッド一覧][生データ]

yarv-dev:440

From: SASADA Koichi <ko1 atdot.net>
Date: Sun, 6 Mar 2005 01:03:11 +0900
Subject: [yarv-dev:440] Re: Ruby.NET Compiler

 ささだです。

>> メソッドディスパッチを二分木を利用することで行っているわけですが、
>>ひとつのクラスではそれでいいと思うのですが、いくつか継承したときの
>>パフォーマンスってどうなりますか。
> 
> 
> 継承していたとしても、一番下のクラスからアクセスできるすべてのメソッド
> を2分検索しますので、検索するメソッド数が多くなるだけで、
> 遅くはなりません。メソッド数によって、速度が大きく変わることは
> ないようです。
> 
 ふと、swwitch 命令でしないのは何故だろうと思いました。

(完全ハッシュを作っておけば云々、とか考えたけど、switch 命令があるん
だからいいかなーとか)


>> IronPython などは、Hash 以上に高速な何かをちょっと用意するとかするの
>>ですかね。
> 
> Python の文法はよくしらないのですが、実行時にメソッドが増えたりするの
> ですか? 増えるのであれば難しいと思います。
> 増えないのであれば、今思いついたアイディアですが、
> 最上位のクラスに、定義されているすべてのメソッドを仮想関数として定義して、
> 呼び出されたら例外を呼ぶようにしておく。
> そのメソッドが定義されているクラスで、再定義して、すべてのメソッドを
> 仮想関数コールにすれば、かなり早く呼び出せるのではないかと思う。
> 仮想関数テーブルが馬鹿でかくなりますけど。。
> ただライブラリとか、クラス構造が複雑だと無理ですね。
> 
> class Hoge
>   def hoge1; end
>   def hoge2; end
> end
> 
> class Test
>   def test1; end
>   def test2; end
> end
> 
> 
> class Object
> {
>   virtual Object hoge1(...) { throw new Exception(...) }
>   virtual Object hoge2(...) { throw new Exception(...) }
>   virtual Object test1(...) { throw new Exception(...) }
>   virtual Object test2(...) { throw new Exception(...) }
> }
> 
> class Test : Object
> {
>   override Object hoge1(...) {...}
>   ....
> }

 動的なものを考えなければありなんじゃないかと思います。というか、メ
ソッド表法(メソッドディスパッチの高速化)ってそういう話な気がしました。

> 
> 
>>>ブロック / クロージャの実現
>>
>> Lisp とかで一般的な手法ですね。きちんと解析しているので、環境を作る
>>必要がなければ、そうしない(ヒープに一切何も作らない、作り置きができる)
>>などの最適化が考えられると思います(もう、してるかな)。
> 
> 環境を作る必要がない場合とはどんな場合のことですか?
> if false
>    m {}
> end
> の {} は m が呼ばれるときにしか作られないのですが、こういうことでしょうか?
> 作り置きというのは考えていませんでした。
> 確かに作り置きできますね。今後取り入れます。
> 
 んと、
  def m
    iter{
    }
  end

 で、iter に渡したブロックは m の環境を参照していない場合、そのブロッ
クの情報をコンパイル時に作っておくだけで、とくに何もヒープに作る必要は
ない、と考えてこう書きました。


> 
> 
>>>Ruby と完全に同じです。多重代入も可能です。 
>>
>> 多重代入ってどうやりました? というか、どの仕様、というか・・・。
> 
> 多重代入は Ruby と完全に同じに作れたと思います。たぶん。
> 全体的に、文法は去年の夏の時点のソースコードを参考にしていますので、
> 最新のバージョンとは微妙に異なるかもしれません。
> ほとんどパーザの問題だと思うので、違ってたら直します。
> まず右辺をすべて配列に入れてから、対応する左辺に入れていきます。
> 右辺の配列の要素が、配列で、対応する左辺が()だったら、再帰的に
> 入れていくなど、、括弧や、*なども考慮に入れています。
> 
> 左辺のある変数に、右辺配列の何番目の要素が入るとういことが静的に
> 解析できます(左辺に*がついていても、右辺の配列の何番目の要素から最後まで
> などと解析できます)ので、右辺のその要素が存在するかしないかの
> チェックをして左辺の変数に代入するだけです。

 なるほど、配列を作る方法を取ったんですね。私はそれが嫌だからなんとか
ならんかなぁ、と粘ってみたので、微妙に仕様を満たせていません。

> 
> 
> 
>>if cond
>>  require 'huga'
>>end
>>
>>ってどうなるんでしょうか。
> 
> require した場所に必ず展開されます。
> つまり if end の間に huga の内容がペーストされることになります。
> cond に関わらずです。
> 文章にしっかり書くのを忘れていたのですが、
> class Hoge
>   if cond
>     def m;end
>     def Hoge.m; end
>   end
> end
> Hoge#m は cond に関わらず定義されてしまいます。Hoge.m は今のところは cond 
> によって定義されるかどうかが変わります。

 なるほど、そういう意味だったんですね。ちなみに、スコープルールはどう
なりますか。トップレベルスコープも変わったり変わらなかったりですが。

----------
a.rb:
a = 1
require 'b'
p a
----------
b.rb:
a = 2
----------


>>>tarai                                17.5   0.031       x650
>>
>> これ謎だよね。どんな IL を吐くんですか?
> 
> よく分からないですけど、やたら早いですね。
> 検証していないので理由が分かりません。

 インライン化とかそういうことしてるんじゃないかしらん、とか思うので、
コンパイルした結果を見せてもらえるといいと思うのですが、どうでしょうか。

> 
> 
> 
>> これ、関数呼び出しのときに一時的に利用するだけですか?
>>それとも、環境として使う? 再帰呼び出しとかしたときに大丈夫
>>かな、とちょっと不安になりました。
> 
> 引数は、すべてIObject[]型の配列に入れられて渡されるのですが、
> 受け取った側では、引数の数をチェックしたり、仮引数への代入があるので、
> IObject[]型の配列は一時的にしか使われません。

 なるほど。ちなみに、一時的に利用するだけなら、要素数ごとに配列を用意
しなくても、一個大きな配列があればいいんじゃないのでしょうか(型の制約
とかあるのかな)

>>>今後
>>
>> リリースはー?
> 
> 3月中を目標にしていますが、かなり微妙です。
> いつまでたっても終わらない感じがしますので、
> 適当にきりをつけて公開したいと思います。

 楽しみにしています。


> そういえば、
> http://www.asakawa.net/ruby/rubynet_memo.html
> この中で、論文にしてもよさそうな物はありますか?
> 研究室配属されたので、なんか書いてみたいと思っているのですが。
> 論文とは?や研究とは?とうことがよく分からないので
> アドバイス頂けたらと思います。

 論文、ということになるとどうなんだろう。ここには査読者の先生方がたく
さん居そうなので、きっと教えてくれるに違いない、といってみるテスト。ど
うでしょうか>査読者様

... というか、私も論文書かないと(卒業できん)。

 私見ですが、査読の無い研究会などでは十分な話だと思います。論文という
形になると、新規性、有用性という点が焦点になると思いますが、そのあたり
を既存のもの(Ruby に限らず)と比較できるものができればいいんじゃない
でしょうか。

 淺川君の場合、他の方式との比較検討の部分が弱いのではないか(方式は A
や B があるが、〜〜な理由から A のほうがよいと思われるので A にした、
みたいな)、と思うのですが、そのあたりがきちんと言えれば通るんじゃない
んでしょうか。いや、論文素人の意見ですが。



--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

       427 2005-02-23 15:12 [ko1 atdot.net       ] Ruby.NET Compiler                       
       428 2005-02-24 00:41 ┗[ko1 atdot.net       ]                                       
       429 2005-02-26 16:35  ┗[ml asakawa.net      ]                                     
       430 2005-02-27 16:13   ┗[ml asakawa.net      ]                                   
       431 2005-02-28 23:43    ┗[ml asakawa.net      ]                                 
       436 2005-03-05 19:36     ┣[ko1 atdot.net       ]                               
       438 2005-03-05 21:18     ┃┣[ml asakawa.net      ]                             
->     440 2005-03-06 01:03     ┃┃┣[ko1 atdot.net       ]                           
       444 2005-03-06 14:23     ┃┃┃┗[ml asakawa.net      ]                         
       445 2005-03-06 16:45     ┃┃┃ ┣[ko1 atdot.net       ]                       
       452 2005-03-06 22:26     ┃┃┃ ┗[shudo computer.org  ]                       
       454 2005-03-06 23:28     ┃┃┃  ┗[ko1 atdot.net       ]                     
       447 2005-03-06 17:33     ┃┃┗[zn mbf.nifty.com    ]                           
       439 2005-03-06 00:27     ┃┗[matz ruby-lang.org  ]                             
       441 2005-03-06 01:11     ┃ ┗[ko1 atdot.net       ]                           
       453 2005-03-06 22:41     ┗[shudo computer.org  ]