Le macchine virtuali (per l'esecuzione di PL) operano su un array contiguo per il loro bytecode?

4

Ho letto ogni tanto sulle macchine virtuali di linguaggi di programmazione come Java, Python e Lua. Hanno tutti una nozione di bytecode, in cui il codice sorgente è tradotto e che è excutable su una macchina virtuale (basato su registro o stack).

Ora su un'architettura x86, tutto il codice risiede nella RAM che è indirizzabile usando lo spazio degli indirizzi della CPU. Un registro puntatore di istruzioni punta alla posizione nella memoria attualmente eseguita. I salti modificano questo registro dei puntatori delle istruzioni, ma fondamentalmente il software in memoria è linearizzato in un unico pezzo di RAM.

Con le macchine virtuali, non ne sono così sicuro. Prima di eseguire la macchina virtuale, tutto il bytecode viene copiato / collegato insieme in un array contiguo con tutte le istruzioni? Oppure la VM conserva vari moduli in diverse pagine bytecode che vengono scambiate / scambiate, se necessario?

    
posta wirrbel 04.01.2016 - 13:27
fonte

1 risposta

4

La maggior parte delle VM non inserisce tutte le istruzioni in un singolo array, per vari motivi:

  • Le istruzioni potrebbero non avere dimensioni costanti, quindi un pezzo di memoria potrebbe non essere interpretato come una matrice di istruzioni tipo C. OK, è un po 'pedante. Tuttavia, ci sono interpreti che non usano una sequenza di codici operativi, ma un grafico che viene attraversato durante la valutazione.

  • È più sensato avere una struttura bytecode per funzione o metodo. Ciò semplifica l'associazione dei metadati a una funzione, il che semplifica notevolmente il debug. Ho visto vari approcci a questo: potrebbe esserci un'istruzione di metadati che altrimenti sarebbe un no-op, o una funzione potrebbe essere rappresentata come un oggetto che contiene una struttura di bytecode tra altri campi.

  • L'utilizzo di strutture bytecode separate ci consente una maggiore sicurezza. Se la mia VM contiene un bug e non si ferma alla fine dell'unità di codice, potrei avere una vulnerabilità di esecuzione arbitraria del codice. Ma se ho dei limiti chiari per la mia struttura bytecode, è più facile rilevare quando qualcosa è spento. Questo è particolarmente importante se la VM consente salti / goto ma vuole limitarli all'interno della funzione corrente.

  • La maggior parte delle macchine virtuali supporta il caricamento in fase di esecuzione di più codice. Questo codice deve essere posizionato da qualche parte e deve essere reso accessibile al resto del codice. Ancora più divertente, alcune lingue consentono la generazione di codice runtime. Ciò diventa difficile se devo inserirmi in un unico array non coltivabile.

risposta data 04.01.2016 - 14:43
fonte

Leggi altre domande sui tag