4

現在、動的ディスパッチを実装するさまざまな方法を探しています。

私の知る限り、これを実装するには 2 つの「簡単な」方法があります。

  • C++ のような仮想関数テーブル
  • SmallTalk のようなメッセージ ディスパッチャー (メソッドを に属性として格納するという Python の考え方に多少似ています__dict__)

私が知る限り、VFT が選択された理由は、パフォーマンスが合理的で実装が簡単だった (また、C++ の個別のコンパイル モデルに適していた) ためであり、可能な限り最速の方法だったからではありません。

私はすでにいくつかの記事や出版物を読んだことがありますが、そのほとんどは「古い」ものであり (最後に読んだ(*) Pentium 200MHz を使用して言及されていました ... うーん)、それらが最新技術を表しているとは思えません。研究が停滞しない限り。

私は、に興味を持っています:

  • ダイナミック ディスパッチ戦略は、複数の方法をサポートしている場合に適しています。
  • さまざまな戦略のベンチマーク

私は特に最近の記事や非凡な戦略に興味があります (たとえそれらが効率的であるとは証明されなかったとしても)。

出版物は大歓迎です。自由に入手できればよりよいでしょう。それ以外の場合は、提示された技術の要約と結果が素晴らしいものになるでしょう。

実際のコンパイラの実装に関する技術記事も歓迎します。

(*) Eiffel に関するこの記事は、プログラム全体の分析が仮想呼び出しサイトの除去にどのように役立つかを示しています。

4

1 に答える 1

4

プロトタイプベースのオブジェクトシステムの実装について読んでいるときに、次のマルチメソッド戦略に出くわしました。そのドメインを念頭に置いて書かれていますが、より伝統的なクラスベースの言語に適応することは難しくありません。

セクション 3 で詳しく説明します。図 5 は便利な図です。アイデアは、ディスパッチできる各オブジェクト (またはおそらくクラス) が独自のメソッド テーブルを持つということです。(その意味では、C++ に匹敵します。) そのオブジェクト (またはクラス) でディスパッチする各メソッドがテーブルに配置されます。巧妙な部分は、テーブルがパラメーターの位置に対応するサブセクションに分割されていることです。

明確にするために、最初の引数のクラス「Foo」と2番目の引数のクラス「Quux」に特化したメソッドがあると想像してください。クラス Foo のディスパッチ テーブルのセクション 1 には、メソッドへのポインタが含まれます。また、クラス Quux のディスパッチ テーブルのセクション2にも、メソッドへのポインタがあります。ディスパッチを行うには、引数のクラスのディスパッチ テーブルが参照されます。メソッド ポインターが一致する場合 (この例のように)、それが呼び出すメソッドです。

この論文は「Prototypes with Multiple Dispatch」と呼ばれています。 http://lee.fov120.com/ecoop.pdf

于 2011-05-13T16:35:42.577 に答える