Rubyの実装に疑問あり!
■ このスレッドは過去ログ倉庫に格納されています
0303デフォルトの名無しさん
NGNG最近になって、まつもとさんとPerl開発者の一人の間接的な
対談記事を読みました。
Perl開発者から、なぜ構文木を長大なswitch文(rb_eval)で
たどって解析する方法をとったのかと、そんな意味のことを
訊ねられていたと思います。
それに対して、まつもとさんはPerlのように構文木のノードに
関数ポインタを埋め込む方法を試したが、思ったより速度が
上がらなかったと答えていたと思います。
(もちろん、自分の実装コードがまずかったのもあるだろうとも
言っていました)
僕はこの記事で初めてPerlの構文木とその評価方法を聞きました。
それまで、Rubyのソースしか見たことがなかったので。
僕も以前、インタプリタ型の小さな言語をRubyを参考に作りました。
オブジェクトやスタックフレームなど、大いに参考になり助かった記憶があります。
ただ、僕も構文木の評価、つまり解釈実行のルーチンだけは
長大なswitch文を使うのはどうかと迷いました。
結局、C++で書いていたので、構文木のノードの基底クラスに
virtual な評価関数をおくことにし、派生クラスの方の評価関数で
それぞれのノードに応じた処理をする、ということにしました。
下記のように。(まちがいがあるかも。擬似コードとして見てやってください)
しかし今考えると、下手くそなやり方だったと思います。
もっと良いやり方はなかったかと、、、。
class Node {
public:
virtual Value Eval( Node * ) = 0;
};
class NodeAdd : public Node {
public:
Value Eval( Node *node ) {
l = Eval(node->left);
r = Eval(node->right);
return l + r;
}
};
■ このスレッドは過去ログ倉庫に格納されています