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