Реализации динамической отправки

#language-agnostic #compiler-optimization #compiler-theory #dynamic-dispatch

#не зависит от языка #оптимизация компилятора #теория компилятора #динамическая отправка

Вопрос:

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

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

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

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

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

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

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

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

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

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

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

Комментарии:

1. Этот документ может быть полезен, если вы все еще заинтересованы citeseerx.ist.psu.edu/viewdoc /…

2. @BharatMukkala: Спасибо, выглядит интересно, я посмотрю 🙂

Ответ №1:

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

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

Для пояснения: представьте, что у вас есть метод, который специализируется на классе «Foo» для первого аргумента и классе «Quux» для второго аргумента. Раздел 1 таблицы отправки класса Foo будет содержать указатель на метод. И во втором разделе для таблицы отправки класса Quux также будет указатель на метод. Затем, чтобы выполнить отправку, обращаются к таблицам отправки аргументов ‘ classes’. Если указатели на методы совпадают (как в нашем примере), это тот метод, который нужно вызвать.

Статья называется «Прототипы с множественной отправкой». http://lee.fov120.com/ecoop.pdf

Комментарии:

1. Хорошая реализация множественной отправки. На самом деле это очень похоже на виртуальные таблицы и позволяет избежать комбинаторного взрыва, которого обычно требует такая поддержка. Спасибо 🙂

2. Ссылка теперь недоступна. Я подозреваю, что соответствующий документ называется doi.org/10.1007/11531142_14 но не могу побеспокоиться о том, чтобы перепроверить через платный доступ.