Pregunta

C ++ tiene herencia múltiple. La implementación de la herencia múltiple en el plano de montaje puede ser bastante complicado, pero hay buena en línea en cómo esto se hace normalmente (vtables, fixups puntero, procesadores, etc.).

Java no tiene herencia múltiple aplicación, pero tiene múltiples herencia de interfaces, así que no creo que una aplicación recta hacia adelante con una sola vtable por clase puede implementar eso. ¿Cómo implementar interfaces Java internamente?

Me da cuenta de que, contrariamente a C ++, Java es compilado Jit, por lo que las diferentes piezas de código pueden ser optimizados de forma diferente, y diferentes JVM pueden hacer las cosas de manera diferente. Entonces, ¿hay alguna estrategia general de que muchos JVM siguen en esto, o ¿alguien sabe la puesta en práctica de una JVM específica?

También JVM menudo desvirtualizar y las llamadas de método en línea, en cuyo caso no hay vtables o equivalente involucrado en absoluto, por lo que podría no tener sentido para preguntar acerca de las secuencias de montaje reales que implementan el método de interfaz / llamadas virtuales, pero supongo que la mayoría de las JVM aún mantener algún tipo de representación general de clases en torno a su uso si no han sido capaces de desvirtualizar todo. ¿Está mal suposición? ¿Esta mirada representación de ninguna manera como una vtable C ++? Si es así no interfaces tienen vtables separadas y cómo están vinculados con estos vtables clase? Si es así puede instancias de objeto tienen múltiples punteros vtable (a la clase / vtables interfaz) como instancias de objetos en C ++ lata? Qué referencias de un tipo de clase y un tipo de interfaz con el mismo objeto siempre tienen el mismo valor binario o pueden diferir éstas como en C ++ donde se requieren fixups puntero?

(para referencia: esta pregunta pide algo similar sobre el CLR, y parece que hay una buena explicación en este artículo de MSDN pesar de que podría no corresponder a ahora. no he podido encontrar nada similar para Java.)

Editar

  • I '' implementos medias en el sentido de "¿Cómo funciona el compilador GCC implementar número entero llamadas Además / función / etc", no en el sentido de "Java implementa la clase ArrayList la interfaz de la lista".
  • Soy consciente de cómo funciona este a nivel de código de bytes JVM, lo que quiero saber es qué tipo de código y estructuras de datos son generados por la JVM después de que se carga hacerlo los archivos de clase y compilar el código de bytes.
¿Fue útil?

Solución

La característica clave de la HotSpot JVM es en línea de almacenamiento en caché . Esto no significa realmente que se colocarán en línea del método de destino, sino que significa que una suposición se pone en el código JIT que cada futura llamada al método virtual o interfaz apuntará la misma aplicación (es decir, que el sitio llamado es monomórficos). En este caso, una cheque se compila en el código de la máquina si la suposición es válida en realidad (es decir, si el tipo del objeto de destino es la misma que la última vez), y después de control de transferencia directamente al método de destino - sin mesas virtuales que participan en absoluto. Si la afirmación falla, un intento puede ser hecho para convertir esto en un sitio llamado megamorphic (es decir, con múltiples tipos posibles); Si esto también falla (o si es la primera llamada), se realiza una búsqueda de largo aliento regular, usando vtables (por métodos virtuales) y itables (por interfaces).

Editar : El hotspot Wiki tiene más detalles sobre los talones y vtable ITable. En el caso polimórfica, todavía pone una versión caché en línea en el sitio de llamada. Sin embargo, el código es en realidad un talón que realiza una búsqueda en un vtable, o un ITable. Hay un talón de vtable para cada desplazamiento vtable (0, 1, 2, ...). Interfaz llama añadir una búsqueda lineal en una matriz de itables antes de mirar hacia el ITable (si se encuentra) en el offset dado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top