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

yarv-dev:52

From: SASADA Koichi <ko1 atdot.net>
Date: Mon, 24 May 2004 03:40:57 +0900
Subject: [yarv-dev:52] why eval reciver last?

 ささだです。

 ちょっと書いていた「メソッド呼び出し時、 reciever を評価す
る順序を最後にしたい」かを、ちょっとまとめておきます。


参考:
http://www.namikilab.tuat.ac.jp/~sasada/diary/vote.cgi?mode=show&no=38
http://shugo.net/jit/20040521.html#p01


recv.selector(arg1, arg2, ..., argN, &block)

のとき、メソッドディスパッチには、必ずメソッドディスパッチのためには
recv の値が必要になります(recv + selector でメソッドが決定するから)。

 さて、そのとき、左から右に評価していくと、スタックは次のように詰まれます。

recv, arg1, arg2, ..., block

 このとき、stack top から N 個目にアクセスしなければなりません。
また、フレームの構造を考えたとき、arg よりもスタックトップ側に置
こう、と決心しました。

 ここで、デメリットがちょっとあります。

1. 数を数えるのが面倒
2. N がでかいと、キャッシュに乗ってないかもしれない
3. 一回コピーが増える(底からスタックトップへ recv のコピーが発生)

 まぁ、些細というか、どうでもいい話です。なので、現状でスタック
の評価順序をきちんとするのは、あまり問題はありません。


 こんど、スタックキャッシュをきちんと実装する予定です。
(2個キャッシュ用レジスタ(7状態)を置くつもりです)

 そうなると、recv はスタックキャッシュに置かれてほしいなぁ、
と思いまして。その辺が結構性能に効いてくるんじゃないかとなんとなく
思っています。まだ見積もりなどきちんとしていないのですが。
(ぱっと考えて、スタックのpushが一回減ります)

 うまいことレジスタ操作のみで閉じると、その辺がきれいに行くん
じゃないかと考えています。


 やってみたら、ぜんぜん性能的なgainが無かった、なんてことも
あるかもしんないんですが、まぁそんときはそんときで。

 というか、現状のメソッドディスパッチ処理は惨たんたる状況に
なってまして。積むもの多杉。



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

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