Реализация динамической отправки - PullRequest
4 голосов
/ 10 мая 2011

В настоящее время я ищу различные способы реализации динамической диспетчеризации.

Насколько я знаю, есть два "простых" способа реализовать это:

  • Таблицы виртуальных функций, как в C ++
  • Диспетчер сообщений, как в SmallTalk (что несколько похоже на идею Python хранить методы в качестве атрибутов в __dict__)

Я бы отметил, что насколькоЯ знаю, что VFT были выбраны потому, что они работали разумно и легко для реализации (а также потому, что они хорошо подходили для отдельной модели компиляции C ++), а не потому, что они были самыми быстрыми возможными методами.

Я уже прочитал пару статей и публикаций, однако большинство из них являются «старыми» (последние, которые я прочитал (*), упомянул, используя Pentium 200 МГц ... гул), поэтому я сомневаюсь, что они представляют состояние-арт, если исследования не пришли в стойло.

Меня интересуют:

  • Стратегии динамической отправки, тем лучше, если они поддерживают мульти-методы.
  • Тесты различных стратегий

Меня особенно интересуют последние статьи и необычные стратегии (даже если они не доказали свою эффективность).

Публикации приветствуются, было бы лучше, если бы они были в свободном доступе, ив противном случае краткое изложение представленной техники и результат будут отличными.

Технические статьи реальных реализаций компилятора также приветствуются.

(*) Эта статья о Eiffel иллюстрируетКак анализ всей программы может помочь удалить сайты виртуальных вызовов.

1 Ответ

4 голосов
/ 13 мая 2011

Я наткнулся на следующую мультиметодную стратегию, читая о реализации объектных систем на основе прототипов. Он написан с учетом этой области, но не составит труда адаптировать его к более традиционному языку классов.

Раздел 3 детализирует это, а рисунок 5 представляет собой полезную диаграмму. Идея состоит в том, что каждый объект (или, возможно, класс), на который можно отправить, имеет свою собственную таблицу методов. (В этом смысле он сопоставим с C ++.) Каждый метод, отправляющий этот объект (или класс), помещается в таблицу. Умная часть состоит в том, что таблица разделена на подразделы, которые соответствуют позициям параметров.

Для пояснения: представьте, что у вас есть метод, который специализируется на классе "Foo" для первого аргумента и классе "Quux" для второго аргумента. Раздел 1 таблицы диспетчеризации класса Foo будет содержать указатель на метод. И в разделе two для таблицы диспетчеризации класса Quux также будет указатель на метод. Чтобы выполнить диспетчеризацию, необходимо обратиться к таблицам диспетчеризации классов. Если указатели на методы совпадают (как в нашем примере), это метод для вызова.

Бумага называется "Прототипы с множественной отправкой". http://lee.fov120.com/ecoop.pdf

...