Как внутренние интерфейсы Java реализованы? (vtables?)

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

В Java нет множественного наследования реализаций, но есть множественное наследование интерфейсов, поэтому я не думаю, что прямая реализация с одной vtable на класс может это реализовать. Как Java реализует интерфейсы внутри?

Я понимаю, что в отличие от C ++, Java компилируется Jit, поэтому разные части кода могут быть оптимизированы по-разному, а разные JVM могут работать по-разному. Итак, есть ли какая-то общая стратегия, которой придерживаются многие JVM, или кто-нибудь знает ее реализацию в конкретной JVM?

Также JVM часто девиртуализируют и встраивают вызовы методов, и в этом случае вообще не задействованы vtables или эквиваленты, поэтому может не иметь смысла спрашивать о фактических последовательностях сборки, которые реализуют вызовы виртуальных / интерфейсных методов, но я предполагаю, что большинство JVM по-прежнему сохраняйте какое-то общее представление классов для использования, если они не смогли девиртуализировать все. Это предположение неверно? Похоже ли это представление каким-либо образом на таблицу C ++ vtable? Если да, то есть ли у интерфейсов отдельные таблицы vtables и как они связаны с классом vtables? Если да, могут ли экземпляры объектов иметь несколько указателей vtable (на классы / интерфейсы vtables), как экземпляры объектов в C ++? Всегда ли ссылки типа класса и типа интерфейса на один и тот же объект имеют одно и то же двоичное значение или они могут отличаться, как в C ++, где они требуют исправления указателя?

(для справки: этот вопрос задает нечто подобное о CLR, и, похоже, хорошее объяснение содержится в этой статье msdn , хотя она, возможно, уже устарела.Мне не удалось найти ничего похожего для Java.)

Изменить:

  • Я имею в виду «реализует» в смысле «Как компилятор GCC реализует целочисленное сложение / вызовы функций / и т. Д.», А не в смысл «Java-класс ArrayList реализует интерфейс List».
  • Я знаю, как это работает на уровне байт-кода JVM, я хочу знать, какой код и структуры данных генерируются JVM после того, как она загрузит файлы классов и скомпилирует байт-код.
39
задан Community 23 May 2017 в 11:46
поделиться