En general, la distinción entre just-in-time y ahead-of-time no es relevante para la seguridad. Uno puede ver las cosas como compensaciones de rendimiento. Para una aplicación, que consiste en una secuencia de pequeñas instrucciones destinadas a la máquina virtual abstracta de Java:
-
En interpretación pura, las instrucciones individuales se analizan cuando deben ejecutarse, y el análisis de cualquier instrucción se realiza cada vez que se ejecuta esa instrucción.
-
En la compilación AOT, durante una fase preparatoria (por ejemplo, cuando la aplicación está instalada en el teléfono), las instrucciones se traducen a los códigos de operación que la CPU del hardware real entiende. Por lo tanto, el "análisis" se realiza una vez. El rendimiento es mucho mejor, a expensas de una traducción única realizada durante la instalación.
-
En la compilación JIT, obtienes algo entre estos dos modelos. La traducción no se realiza de antemano, pero aún así se realiza mediante fragmentos completos (una función completa de una sola vez) en lugar de instrucciones por instrucción. En comparación con AOT, se produce más compilación, básicamente cada vez que se lanza la aplicación, en lugar de una sola vez. Sobre una base más bien teórica, la compilación JIT puede optimizar las cosas según el patrón de ejecución real y podría producir una secuencia mejor (más rápida) de códigos de operación nativos que AOT; en la práctica, este efecto tiende a ser anulado por las restricciones bajo las cuales debe operar la compilación JIT (en particular, dado que JIT ocurre cuando la aplicación se está utilizando y el usuario está esperando, la compilación JIT debe ser rápida).
En todo lo anterior, las propiedades de seguridad de la VM de Java se mantienen: todos los accesos a los arreglos aún están verificados, se verifica que todas las llamadas a métodos ocurren solo en objetos que efectivamente ofrecen dichos métodos.
Si queremos realizar un primer paso, entonces podríamos argumentar que ART reduce algo la seguridad, no porque use la compilación AOT, sino porque es nuevo , y el nuevo software tiende a tener más errores que el software antiguo (Una gran base de usuarios representa una gran cantidad de pruebas, por lo que el software antiguo se ha probado exhaustivamente de forma natural). A la inversa, podríamos fingir que la compilación AOT es más sencilla de implementar que la compilación JIT (porque AOT no tiene que lidiar con la traducción de una aplicación en vivo y objetos ya asignados) y, por lo tanto, una implementación JVM basada en AOT tendría menos probabilidades de tener errores que una JVM basado en JIT. Pero estas consideraciones son solo una especulación ociosa bajo el supuesto habitual de que "todas las demás cosas son iguales", y se sabe que todas las demás cosas son nunca iguales.