Perché i linguaggi VM non vengono compilati solo una volta?

8

(Prima di tutto, dovrei chiarire che compilatori e macchine virtuali ( alias ) sono un campo completamente sconosciuto per me)

A quanto ho capito, ogni volta che viene eseguita un'applicazione Java / C # / ..., viene richiamata una VM e viene convertito il codice intermedio (bytecode, CIL, ecc.) in istruzioni macchina.

Ma perché questa operazione non può essere eseguita una volta sola - al momento dell'installazione?

    
posta vemv 30.10.2011 - 14:23
fonte

4 risposte

8

Nel caso di Java, la JVM può fare ottimizzazioni che superano i confini delle biblioteche. Ad esempio, è possibile integrare un metodo da una libreria nel proprio codice cliente. Questo tipo di ottimizzazione non può essere fatto in fase di compilazione, perché la libreria può cambiare prima dell'esecuzione. È del tutto possibile che il tuo libfoo-1.0 sia sostituito da libfoo-1.1 senza ricompilare. In tal caso, le inline delle librerie incrociate fatte in fase di compilazione diventerebbero completamente non valide.

Effettuando l'ottimizzazione esclusivamente in fase di runtime, non vi è alcun dubbio che la modifica della libreria sotto di voi annullerà le ottimizzazioni.

    
risposta data 31.10.2011 - 01:44
fonte
6

Perché ciò impedisce loro di utilizzare molte funzionalità. Ad esempio, come può il JIT generare nuove istanze generiche dalle DLL caricate in fase di esecuzione? Queste DLL non esistono al momento dell'installazione.

    
risposta data 30.10.2011 - 14:33
fonte
5

Può e spesso è, almeno con le applicazioni .NET. Vedi Generatore di immagini nativo

a tool that improves the performance of managed applications. Ngen.exe creates native images, which are files containing compiled processor-specific machine code, and installs them into the native image cache on the local computer. The runtime can use native images from the cache instead of using the just-in-time (JIT) compiler to compile the original assembly...

    
risposta data 30.10.2011 - 14:28
fonte
3

Per riformulare la domanda in base al chiarimento:

Why can't the bytecode be compiled down to native code the first time the program is run?

Vedo i seguenti problemi:

  • Dove verranno archiviati i risultati? Non si può presumere che il file che contiene il bytecode sia scrivibile; non si vuole gonfiare la macchina di uno sviluppatore scaricando un nuovo .exe nella memoria permanente ogni volta che esegue un test; e se memorizzi il file nella memoria temporanea, verrà perso al prossimo riavvio, quindi non hai guadagnato molto.

  • Stai facendo trading a un avvio leggermente lento ogni volta per un avvio molto lento la prima volta. Non lascerò una buona impressione con il cliente.

  • Avrai gravi problemi con il caricamento dinamico delle classi.

risposta data 31.10.2011 - 13:12
fonte

Leggi altre domande sui tag