#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 но не могу побеспокоиться о том, чтобы перепроверить через платный доступ.