resueltos interfaz interfaces herencia ejercicios ejemplos clases abstractas java interface internals vtable language-implementation

interfaz - interfaces en java ejercicios resueltos



¿Cómo se implementan las interfaces java internamente?(vtables?) (1)

La característica clave de HotSpot JVM es el almacenamiento en caché en línea . Esto no significa en realidad que el método objetivo esté en línea, pero significa que se asume en el código JIT que cada llamada futura al método virtual o de interfaz apuntará a la misma implementación (es decir, que el sitio de llamada es monomórfico). En este caso, se compila una verificación en el código máquina si la suposición realmente se cumple (es decir, si el tipo de objeto objetivo es el mismo que la última vez), y luego transfiere el control directamente al método objetivo - sin tablas virtuales involucrado en absoluto. Si la afirmación falla, se puede intentar convertir esto en un sitio de llamada megamórfico (es decir, con múltiples tipos posibles); si esto también falla (o si se trata de la primera llamada), se realiza una búsqueda larga y regular, utilizando tablas vtables (para métodos virtuales) e itables (para interfaces).

Editar : The Hotspot Wiki tiene más detalles sobre los vtables e itable stubs. En el caso polimórfico, todavía pone una versión de caché en línea en el sitio de llamadas. Sin embargo, el código en realidad es un stub que realiza una búsqueda en un vtable o un itable. Hay un stub vtable para cada desplazamiento vtable (0, 1, 2, ...). Las llamadas de interfaz añaden una búsqueda lineal a través de una matriz de elementos acumulables antes de buscar en el elemento (si se encuentra) en el desplazamiento dado.

C ++ tiene herencia múltiple. La implementación de la herencia múltiple en el nivel de ensamblado puede ser bastante complicada, pero hay buenas descriptions línea sobre cómo se hace normalmente (vtables, correcciones de puntero, thunks, etc.).

Java no tiene herencia de implementación múltiple, pero sí tiene herencia de interfaz múltiple, por lo que no creo que una implementación directa con un único vtable por clase pueda implementar eso. ¿Cómo implementa Java las interfaces internamente?

Me doy cuenta de que, al contrario que C ++, Java está compilado por Jit, por lo que diferentes partes del código podrían optimizarse de forma diferente, y diferentes JVM podrían hacer las cosas de manera diferente. Entonces, ¿hay alguna estrategia general que muchas JVM sigan en esto, o alguien sabe la implementación en una JVM específica?

Además, las JVM a menudo desvirtualizan y llaman a métodos en línea, en cuyo caso no hay tablas ni equivalentes involucrados, por lo que no tiene sentido preguntar sobre secuencias de ensamblaje reales que implementan llamadas a métodos virtuales / de interfaz, pero supongo que la mayoría de las JVM todavía conservan algunas tipo de representación general de las clases para utilizar si no han sido capaces de desvirtualizar todo. ¿Esta suposición es incorrecta? ¿Esta representación se ve de alguna manera como una tabla de C ++? Si es así, ¿las interfaces tienen tablas virtuales separadas y cómo se vinculan éstas con los vtables de clase? Si es así, ¿pueden las instancias de objetos tener múltiples punteros vtable (a vtables de clase / interfaz) como las instancias de objeto en C ++? ¿Las referencias de un tipo de clase y un tipo de interfaz para el mismo objeto siempre tienen el mismo valor binario o pueden diferir como en C ++ donde requieren correcciones de puntero?

(para referencia: esta pregunta pregunta algo similar sobre el CLR, y parece que hay una buena explicación en este artículo msdn, aunque puede que ya esté desactualizado. No he podido encontrar nada similar para Java).

Editar:

  • Me refiero a ''implements'' en el sentido de "Cómo hace el compilador de GCC la implementación de adiciones de números / funciones / etc", no en el sentido de "clase de Java ArrayList implementa la interfaz de lista".
  • Soy consciente de cómo funciona esto en el nivel de bytecode de JVM, lo que quiero saber es qué tipo de código y estructuras de datos genera la JVM una vez que ha terminado de cargar los archivos de clase y compilar el bytecode.