Реализации динамического связывания на ОО-языках - PullRequest
0 голосов
/ 20 апреля 2009

Какие два способа используются для реализации динамического связывания в ОО-языках. Например, как реализовано динамическое связывание для чистого OOL, такого как Smalltalk, по сравнению со смешанным OOL, например как C ++?

1 Ответ

1 голос
/ 20 апреля 2009

Я не знаю, есть ли два пути, и я не знаю, чистые ли это или смешанные ОО языки.

В основном, C ++ использует диспетчеризацию виртуальной таблицы - каждый экземпляр несет таблицу функций (в случае C ++ он содержит указатель на таблицу, но это не играет никакой роли в механизме диспетчеризации), и когда вы вызываете x.my_method(), компилятор знает его например. второй метод объекта, поэтому он генерирует код для перехода ко второму указателю в таблице виртуальных методов.

В динамических языках (и ObjC) это обычно решается наличием где-то словаря методов, где во время выполнения ищется имя my_method и выполняется любая найденная функция.

Существуют смешанные подходы - в COM вы просматриваете интерфейс по идентификатору; затем вы выполняете метод из его таблицы.

Иногда для ускорения второго подхода генерируется код, похожий на оператор switch (например, switch в зависимости от типа объекта).

...