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