4

Je suis actuellement à la recherche de différentes façons de mettre en œuvre la répartition dynamique.Dynamic Dispatch Implémentations

Pour autant que je sache, il y a deux « faciles » façons de mettre en œuvre cette:

  • Tables de fonctions virtuelles, comme en C++
  • message Dispatcher, comme dans Smalltalk (ce qui est quelque peu semblable à Python idée de stocker des méthodes comme attributs dans __dict__)

Je note que, pour autant que je sache VFT ont été choisis parce qu'ils effectuaient raisonnablement et faciles à mettre en œuvre (et aussi parce qu'ils étaient bien adaptés à la compilation séparée C de modèle), pas parce qu'ils étaient les plus rapides méthodes possibles. J'ai déjà lu quelques articles et publications, mais la plupart sont "vieux" (le dernier que j'ai lu (*) mentionné en utilisant un Pentium 200MHz ... hum), donc je doute qu'ils représentent l'état de l'art à moins que la recherche ne vienne à l'étalage.

Je suis intéressé par:

  • stratégies dynamiques Dispatch, mieux si elles prennent en charge multi-méthodes.
  • Repères des différentes stratégies

Je suis particulièrement intéressé par les articles récents et hors du commun des stratégies (même si elles ne sont pas révélés efficaces).

Les publications sont les bienvenues, il serait préférable qu'elles soient disponibles gratuitement, sinon un résumé de la technique présentée et le résultat serait génial.

Les articles techniques des implémentations réelles du compilateur sont également les bienvenus.

(*) This article about Eiffel illustre comment l'analyse de programme entier peut aider à supprimer les sites d'appels virtuels.

Répondre

4

Je suis tombé sur la stratégie multi-méthode suivante en lisant sur l'implémentation de systèmes d'objets basés sur des prototypes. Il est écrit avec ce domaine en tête, mais il ne serait pas difficile de s'adapter à un langage basé sur les classes plus traditionnel.

La section 3 le détaille, et la figure 5 est un diagramme utile. L'idée est que chaque objet (ou classe, peut-être) qui peut être distribué a sa propre table de méthodes. (En ce sens, il est comparable à C++.) Chaque méthode qui distribue sur cet objet (ou classe) est mis dans la table. La partie intelligente est que la table est séparée en sous-sections, qui correspondent aux positions des paramètres. Pour clarifier: imaginez que vous avez une méthode qui se spécialise sur la classe "Foo" pour le premier argument, et la classe "Quux" pour le second argument. La section 1 de la table de distribution de la classe Foo contiendrait un pointeur vers la méthode. Et, section deux pour la table de répartition de Quux de classe aurait également un pointeur vers la méthode. Pour faire l'expédition, alors, les tables d'expédition des classes 'classes' sont consultées. Si les pointeurs de la méthode correspondent (comme dans notre exemple), c'est la méthode à appeler.

Le papier est appelé "Prototypes avec répartition multiple". http://lee.fov120.com/ecoop.pdf

+0

Belle implémentation de Multiple Dispatch. Il est très similaire aux tables virtuelles et contourne l'explosion combinatoire qu'un tel support nécessite généralement. Merci :) –