Альтернативы vtable - PullRequest
       37

Альтернативы vtable

8 голосов
/ 10 августа 2011

Vtables вездесущи в большинстве реализаций ОО, но есть ли у них альтернативы?На вики-странице для vtables есть небольшая реклама, но не слишком много информации (и коротких ссылок).

Знаете ли вы о какой-то языковой реализации, которая не использует vtables?

Есть либесплатные онлайн страницы, которые обсуждают альтернативы?

1 Ответ

14 голосов
/ 10 августа 2011

Да, есть много альтернатив!

Vtables возможны только при соблюдении двух условий.

  1. Все вызовы методов могут определяться статически. Если выВы можете вызывать функции по строковому имени или, если у вас нет информации о типе объектов, для которых вы вызываете методы, вы не можете использовать vtables, потому что вы не можете сопоставить каждый метод с индексом в некоторой таблице.Точно так же, если вы можете добавлять функции к классу во время выполнения, вы не можете назначать всем методам индекс в vtable статически.
  2. Наследование может определяться статически. Если вы используете наследование прототипаили другая схема наследования, где вы не можете статически определить, как выглядит структура наследования, вы не можете предварительно вычислить индекс каждого метода в таблице или метод конкретного класса, помещаемый в слот.

Обычно наследование реализуется с помощью табличных таблиц, отображающих имена функций в их реализации вместе с указателями, позволяющими каждому классу искать свой базовый класс.Диспетчеризация метода затем реализуется путем обхода этой структуры в поисках низшего класса на уровне или выше класса объекта-получателя, который реализует метод.Для ускорения выполнения часто используются такие методы, как встроенное кэширование, где сайты вызовов хранят предположение о том, какой метод следует вызывать, основываясь на типе объекта, чтобы избежать затрат времени на обход всей этой структуры.Язык программирования Self использовал эту идею, которая затем была включена в JVM HotSpot для обработки интерфейсов (стандартное наследование по-прежнему использует vtables).

Другой вариант - использовать трассировку, где компилятор генерирует код, который угадывает типобъекта, а затем жестко кодирует метод для вызова в след.Mozilla Firefox использует это в своем интерпретаторе JavaScript, поскольку нет способа построить vtables для каждого объекта.

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

Надеюсь, это поможет!

...