In generale, la distinzione tra just-in-time e ahead-of-time non è rilevante per la sicurezza. Si possono vedere le cose come compromessi per le prestazioni. Per un'applicazione, che consiste in una sequenza di piccole istruzioni destinate alla macchina virtuale astratta di ordinamento Java:
-
Nella pura interpretazione, le singole istruzioni vengono analizzate quando devono essere eseguite e l'analisi di ogni istruzione viene eseguita ogni volta che viene eseguita l'istruzione.
-
Nella compilazione AOT, durante una fase preparatoria (ad es. quando l'applicazione è installata nel telefono), le istruzioni vengono tradotte negli opcode che l'effettiva CPU dell'hardware comprende. Pertanto, l '"analisi" viene eseguita una volta. Le prestazioni sono molto migliori, a scapito di una traduzione una tantum fatta durante l'installazione.
-
Nella compilazione JIT, ottieni qualcosa tra questi due modelli. La traduzione non viene eseguita in anticipo, ma viene comunque eseguita da interi blocchi (una funzione completa in una volta sola) anziché da istruzioni per istruzione. Rispetto ad AOT, si verifica più compilazione, praticamente ogni volta che l'applicazione viene avviata, invece di una volta. Su base piuttosto teorica, la compilazione JIT può ottimizzare le cose in base al modello di esecuzione effettivo e potrebbe produrre una migliore (più veloce) sequenza di codici operativi nativi rispetto a AOT; in pratica, questo effetto tende ad essere annullato dai vincoli sotto i quali deve operare la compilazione JIT (in particolare, poiché JIT si verifica quando l'applicazione è in uso e l'utente è in attesa, la compilazione JIT deve essere veloce).
In tutto quanto sopra, le proprietà di sicurezza della VM Java vengono mantenute: tutti gli accessi agli array sono ancora controllati, tutte le chiamate ai metodi vengono verificate solo sugli oggetti che offrono effettivamente i suddetti metodi.
Se vogliamo fare il nitpick, potremmo obiettare che ART riduce in qualche modo la sicurezza, non perché usi la compilazione AOT, ma perché è nuova , e il nuovo software tende ad avere più bug del vecchio software (una vasta base di utenti rappresenta un sacco di test, quindi il vecchio software è stato testato a fondo). Viceversa, potremmo fingere che la compilazione AOT sia più semplice da implementare rispetto alla compilazione JIT (perché AOT non deve occuparsi della traduzione di un'applicazione live e degli oggetti già assegnati) e quindi un'implementazione JVM basata su AOT avrebbe meno probabilità di avere bug di una JVM basata su JIT. Ma queste considerazioni sono solo speculazioni oziose sotto la consueta ipotesi che "tutte le altre cose siano uguali", ed è noto che tutte le altre cose sono mai uguali.