que programa lenguaje funciona compilar compilador compilacion como capas java compiler-construction jvm jit vm-implementation

java - programa - Diferencias entre la compilación Just in Time y el reemplazo en la pila



lenguaje compilador (3)

Ambos prácticamente hacen lo mismo. Identifica que el método está activo y compílalo en lugar de interpretarlo. Con OSR, simplemente pasa a la versión compilada justo después de que se compila, a diferencia de JIT, donde se llama al código compilado cuando se llama al método por segunda vez.

Aparte de esto, ¿hay otras diferencias?


En general, la compilación Just-in-time se refiere a compilar código nativo en tiempo de ejecución y ejecutarlo en lugar de (o además de) interpretar. Algunas máquinas virtuales, como Google V8, ni siquiera tienen un intérprete; JIT compila cada función que se ejecuta (con diferentes grados de optimización).

El reemplazo de pila (OSR) es una técnica para cambiar entre diferentes implementaciones de la misma función. Por ejemplo, podría usar OSR para pasar del código interpretado o no optimizado al código JITed tan pronto como termine la compilación.

OSR es útil en situaciones donde se identifica una función como "caliente" mientras se está ejecutando. Esto podría no ser necesariamente porque la función se llama con frecuencia; podría llamarse solo una vez, pero pasa mucho tiempo en un gran bucle que podría beneficiarse de la optimización. Cuando se produce OSR, la VM se detiene y el marco de pila para la función de destino se reemplaza por un marco equivalente que puede tener variables en diferentes ubicaciones.

OSR también puede ocurrir en la otra dirección: de código optimizado a código no optimizado o código interpretado. El código optimizado puede hacer algunas suposiciones sobre el comportamiento en tiempo de ejecución del programa basado en el comportamiento pasado. Por ejemplo, puede convertir una llamada de método dinámico o virtual en una llamada estática si solo ha visto un tipo de objeto receptor. Si resulta más tarde que estas suposiciones eran erróneas, OSR puede utilizarse para recurrir a una implementación más conservadora: el marco de pila optimizado se convierte en un marco de pila no optimizado. Si la máquina virtual admite el ingreso en línea, incluso podría terminar convirtiendo un marco de pila optimizado en varios marcos de pila no optimizados.


La gente ya mencionó lo que es JIT.

reemplazo en la pila (OSR)

Cuando la JVM ejecuta un método Java, verifica la suma del número de veces que se ha llamado al método, y el número de veces que cualquier bucle en el método se ha ramificado y decide si el método es elegible para la compilación o no. Si es así, el método se pone en cola para la compilación. Este tipo de compilación no tiene un nombre oficial, pero a menudo se denomina compilación estándar .

Pero, ¿qué sucede si el método tiene un bucle realmente largo, o uno que nunca sale y proporciona toda la lógica del programa? En ese caso, la JVM necesita compilar el bucle sin esperar la invocación de un método. Así que cada vez que el bucle completa una ejecución, el contador de ramificación se incrementa y se inspecciona. Si el contador de bifurcación ha excedido su umbral individual, entonces el bucle (y no todo el método) es elegible para la compilación. Este tipo de compilación se denomina reemplazo en la pila (OSR) , porque incluso si se compila el bucle, eso no es suficiente: la JVM debe tener la capacidad de comenzar a ejecutar la versión compilada del bucle mientras el bucle aún se está ejecutando . Cuando el código para el bucle ha terminado de compilarse, la JVM reemplaza el código (en la pila), y la siguiente iteración del bucle ejecutará la versión mucho más rápida del código.


Sí, eso es todo. La compilación Just-in-time puede mejorar el rendimiento al compilar "puntos calientes" (puntos de bytecode que se sabe / se supone que se ejecutan muy a menudo) de bytecode a instrucciones nativas. El reemplazo en la pila complementa las capacidades JIT al reemplazar el bytecode "hot" interpretado de larga ejecución por su versión compilada cuando esté disponible. El mencionado artículo Reemplazo en la pila muestra un buen ejemplo donde la compilación JIT no sería muy útil sin OSR.