2009-05-29 22 views
18

Ho cercato di capire come funzionano i linguaggi di programmazione e alcuni di essi hanno le cosiddette macchine virtuali. Capisco che questa è una forma di emulazione del linguaggio di programmazione all'interno di un altro linguaggio di programmazione, e che funziona come un linguaggio compilato, con una pila. Ho capito bene?Come funziona una macchina virtuale?

Con la condizione che ho fatto, ciò che mi dà fastidio è che molti linguaggi non compilati consentono variabili con sistemi di tipo "liberale". In Python, per esempio, io posso scrivere questo:

x = "Hello world!" 
x = 2**1000 

stringhe e grandi numeri interi sono completamente indipendenti e occupano diverse quantità di spazio in memoria, così come può questo codice anche essere rappresentato in un ambiente stack-based? Cosa succede esattamente qui? X ha indicato un nuovo posto sullo stack e i dati della stringa precedente non sono stati rimandati? Queste lingue non usano uno stack? Altrimenti, come rappresentano le variabili internamente?

+4

Grande prima domanda! – samoz

+0

Domanda correlata: http://stackoverflow.com/questions/688803/how-does-a-register-based-virtual-machine-work – lothar

risposta

7

Probabilmente, la tua domanda dovrebbe essere intitolata "Come funzionano le lingue dinamiche ?".

È semplice, memorizzano le informazioni sul tipo di variabile insieme alla memoria. E questo non è fatto solo in linguaggi compilati o interpretati dal JIT, ma anche in linguaggi compilati in modo nativo come Objective-C.

+0

Aha, capisco. Ma cosa succede durante la riassegnazione? Se i nuovi dati sono più grandi di quelli vecchi, dove sono posizionati e cosa diventa dei vecchi dati? – Martin

+2

I contenuti effettivi dell'oggetto potrebbero essere memorizzati altrove e solo un riferimento sarebbe memorizzato in posizione. Esistono molte tecniche per implementare un linguaggio dinamico. Ciò che accade in realtà dipende dalla particolare implementazione della tua lingua. –

+0

http://en.wikipedia.org/wiki/Dynamic_typing#Dynamic_typing –

2

Nella maggior parte dei linguaggi VM, le variabili possono essere concettualizzate come puntatori (o riferimenti) alla memoria nell'heap, anche se la variabile stessa è nello stack. Per le lingue che hanno tipi primitivi (int e bool in Java, ad esempio), questi possono essere memorizzati nello stack, ma non possono essere assegnati dinamicamente ai nuovi tipi.

Ignorando i tipi primitivi, tutte le variabili presenti nello stack hanno i loro valori effettivi memorizzati nell'heap. Pertanto, se si riassegna dinamicamente un valore a questi, il valore originale viene abbandonato (e la memoria viene ripulita tramite un algoritmo di garbage collection) e il nuovo valore viene allocato in un nuovo bit di memoria.

+0

Perché lo stack viene utilizzato se contiene solo puntatori all'heap? Non sarebbe più intelligente archiviare i puntatori internamente e saltare l'intero approccio allo stack? – Martin

+0

Lo stack è necessario per le chiamate ricorsive. Quando una funzione chiama se stessa, ha bisogno di un nuovo set di variabili, altrimenti si sovrascriveranno le variabili della chiamata esterna alla stessa funzione. Hai bisogno di un qualche tipo di stack in modo da sapere che le ultime variabili su di esso sono quelle dell'operazione corrente. È anche utile come "spazio zero" per mantenere i risultati temporanei dalle espressioni. – uliwitness

1

La chiave di molti "come le VM gestiscono variabili come questa o quella" dipende in realtà dai metadati ... Le meta informazioni memorizzate e quindi aggiornate offrono alla VM una gestione molto migliore su come allocare e quindi fare la cosa giusta con le variabili.

In molti casi questo è il tipo di sovraccarico che può davvero interferire con le prestazioni. Tuttavia, le implementazioni dei giorni moderni, ecc. Hanno fatto molta strada nel fare la cosa giusta.

Come per le vostre domande specifiche - il trattamento di variabili come oggetti vaniglia/etc ... si riduce alla riassegnazione/rivalutazione delle informazioni sulla meta di nuovi compiti - ecco perché x può guardare in un modo e poi nel successivo.

1

Per rispondere a una parte delle vostre domande, suggerirei un google tech talk about python, in cui vengono fornite risposte ad alcune delle vostre domande relative alle lingue dinamiche; per esempio che cos'è una variabile (non è un puntatore, né un riferimento, ma nel caso di Python un'etichetta).

2

La VM non ha nulla a che fare con la lingua. Qualsiasi linguaggio può essere eseguito su una VM (la VM Java ha già centinaia di lingue).

Una VM consente di eseguire un diverso tipo di "linguaggio assembly", uno più adatto all'adattamento di un compilatore. Tutto quello che viene fatto in una VM può essere fatto in una CPU, quindi pensa alla VM come una CPU. (Alcuni in realtà sono implementati nell'hardware).

È un livello estremamente basso e in molti casi molto basato su stack, anziché i registri, la matematica a livello di computer è relativa a posizioni relative al puntatore dello stack corrente.

Con i normali linguaggi compilati, sono necessarie molte istruzioni per un singolo passaggio. a + potrebbe apparire come "Prendi l'oggetto da un punto relativo al puntatore dello stack in reg a, prendine un altro in reg b. aggiungi reg a e b. reg regalo in un posto relativo al puntatore dello stack.

VM fa tutto questo con una singola, breve istruzione, possibilmente uno o due byte invece di 4 o 8 byte PER ISTRUZIONE in linguaggio macchina (a seconda dell'architettura a 32 o 64 bit) che (ipotesi) dovrebbe significare circa 16 o 32 byte di x86 per 1-2 byte di codice macchina. (potrei sbagliarmi, il mio ultimo x86 codifica era in 80286 dell'epoca.)

Microsoft ha utilizzato (probabilmente utilizza ancora) VM nei loro prodotti per ufficio per ridurre la quantità di codice.

La procedura per cr mangiare il codice della macchina virtuale equivale a creare un linguaggio macchina, essenzialmente un tipo di processore diverso.

Le macchine virtuali possono anche implementare meccanismi di sicurezza, recupero degli errori e memoria strettamente correlati alla lingua.

Parte della mia descrizione qui è sommario e dalla memoria. Se si desidera esplorare la definizione bytecode da soli, è un pò divertente:

http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc.html

Problemi correlati