yarv-dev:438
From: Hiroki Asakawa <ml asakawa.net>
Date: Sat, 5 Mar 2005 21:18:07 +0900
Subject: [yarv-dev:438] Re: Ruby.NET Compiler
淺川です。 > ささだです。 > お返事が遅れてすみません。 > そーいえば、どうもお互い、未踏期間お疲れ様でした。 お疲れ様でした。あっという間という感じです。 楽しかったので、また何かやりたいなぁと思います。 > メソッドディスパッチを二分木を利用することで行っているわけですが、 > ひとつのクラスではそれでいいと思うのですが、いくつか継承したときの > パフォーマンスってどうなりますか。 継承していたとしても、一番下のクラスからアクセスできるすべてのメソッド を2分検索しますので、検索するメソッド数が多くなるだけで、 遅くはなりません。メソッド数によって、速度が大きく変わることは ないようです。 > 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 が呼ばれるときにしか作られないのですが、こういうことでしょうか? 作り置きというのは考えていませんでした。 確かに作り置きできますね。今後取り入れます。 > > 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 によって定義されるかどうかが変わります。 > > tarai 17.5 0.031 x650 > これ謎だよね。どんな IL を吐くんですか? よく分からないですけど、やたら早いですね。 検証していないので理由が分かりません。 > これ、関数呼び出しのときに一時的に利用するだけですか? > それとも、環境として使う? 再帰呼び出しとかしたときに大丈夫 > かな、とちょっと不安になりました。 引数は、すべてIObject[]型の配列に入れられて渡されるのですが、 受け取った側では、引数の数をチェックしたり、仮引数への代入があるので、 IObject[]型の配列は一時的にしか使われません。 > > 今後 > リリースはー? 3月中を目標にしていますが、かなり微妙です。 いつまでたっても終わらない感じがしますので、 適当にきりをつけて公開したいと思います。 そういえば、 http://www.asakawa.net/ruby/rubynet_memo.html この中で、論文にしてもよさそうな物はありますか? 研究室配属されたので、なんか書いてみたいと思っているのですが。 論文とは?や研究とは?とうことがよく分からないので アドバイス頂けたらと思います。 w Σ+ )_ Hiroki Asakawa 〜〜( __/〜 mailto:hiroki asakawa.net 〜〜〜〜〜 http://www.asakawa.net -- 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 ]