Perché le VM non eseguono direttamente l'assemblaggio?

3

Molte macchine virtuali eseguono un linguaggio di forma binaria, noto come 'bytecode', che viene assemblato da un linguaggio 'assembly' leggibile dall'uomo.

Ad esempio le istruzioni di assemblaggio push 1 push 2 add sono tradotte (credo) in una serie di uni e zeri, che viene poi eseguita dalla VM.

Perché? Perché le macchine virtuali e la JVM come esempio non eseguono direttamente le istruzioni di assemblaggio?

Non hanno la limitazione dei computer fisici che possono gestire solo uno e zero. La JVM può benissimo prendere istruzioni testuali come push 1 push 2 ed eseguirle così come sono. Perché il passaggio aggiuntivo della compilazione?

    
posta Aviv Cohn 04.08.2014 - 01:53
fonte

4 risposte

7

Ecco un paio di motivi per cui riflettere:

Usare un linguaggio di assemblaggio leggibile dall'uomo sprecherebbe spazio sul disco e nella memoria. Ciò ha un impatto sulla memorizzazione nella cache e quindi sulle prestazioni. Nel tuo esempio l'istruzione 'push' occupa quattro byte. Perché non comprimere il programma utilizzando token di un byte per tutte le istruzioni invece delle stringhe leggibili dall'uomo?

Spreca cicli sul processore. Probabilmente la tua VM ha almeno due codici mnemonici di istruzioni che iniziano con 'p'. Affinché la tua macchina virtuale possa capire se un'istruzione è "push" o "pop", deve confrontare almeno due byte. È molto più efficiente se ogni istruzione può essere identificata in modo univoco guardando un singolo byte. L'argomento delle tue istruzioni è una stringa che rappresenta un numero. La stringa deve essere convertita in un formato binario appropriato per la CPU sottostante prima che possa essere utilizzata in aritmetica. Quella conversione richiederà dozzine di istruzioni da sola. Perché farlo ogni volta che si esegue il programma? È molto più efficiente farlo in una passata una tantum quando viene creato il codice byte.

    
risposta data 04.08.2014 - 02:43
fonte
8

L'assembly non è un codice binario. Assembly è una rappresentazione testuale del codice binario. Per eseguirlo, devi prima eseguirlo attraverso un assemblatore che genera codice byte o codice macchina, e questo richiede tempo.

Sebbene sia possibile assemblare un programma di codice byte da un assemblatore di codice byte, la maggior parte dei programmatori non lo fa. Invece, usano un linguaggio di alto livello che compila direttamente in byte-code.

Di conseguenza, la fase di assemblaggio non è necessaria.

Il codice byte non è lo stesso delle istruzioni del processore che eseguono effettivamente il tuo programma. La VM deve prima tradurre il codice byte in istruzioni del processore, quindi vengono eseguite le istruzioni del processore. È fatto in questo modo perché il codice byte è indipendente dalla macchina; puoi usare lo stesso codice byte sui processori che hanno un set di istruzioni completamente diverso, purché tu abbia una VM per quel processore.

    
risposta data 04.08.2014 - 02:13
fonte
2

Il bytecode è più efficiente da memorizzare e più semplice (quindi più veloce) da analizzare per la VM.

La rappresentazione testuale del bytecode (il linguaggio "assembly") viene utilizzata principalmente per comprendere gli interni del compilatore bytecode e / o per analizzare i passaggi di ottimizzazione. Come ha detto Robert Harvey, la maggior parte dei programmatori non ha mai a che fare direttamente con il bytecode, quindi c'è poco motivo per farlo.

    
risposta data 04.08.2014 - 02:34
fonte
0

A causa delle diverse architetture e di un formato comune che può essere adattato alla piattaforma in uso.

E probabilmente a causa del fatto che il codice VM è inferiore al codice della piattaforma della piattaforma paragonabile se sono inclusi anche codici motore di scripting per la garbage collection, inclusi hash e stack a cui si fa riferimento.

Oh e come detto: bytecode a byte singolo anziché codici byte o word più complessi, più facili da progettare.

    
risposta data 04.08.2014 - 14:45
fonte

Leggi altre domande sui tag