Domanda

Ho cercato di come i linguaggi di programmazione di lavoro, e alcuni di loro hanno un cosiddetto macchine virtuali. Capisco che questo è qualche forma di emulazione del linguaggio di programmazione all'interno di un altro linguaggio di programmazione, e che funziona come come sarebbe stato giustiziato un linguaggio compilato, con uno stack. Ho ottenuto questo diritto?

Con la condizione che ho fatto, quello che mi bamboozles è che molte lingue non compilato permettono variabili con sistemi di tipo "liberali". In Python, per esempio, 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 rappresentati in un ambiente di stack-based? Che cosa succede esattamente qui? È x indicò un nuovo posto sullo stack ed i vecchi dati di stringa lasciati senza riferimenti? Do queste lingue non utilizzano uno stack? Se no, come cosa rappresentano le variabili internamente?

È stato utile?

Soluzione

Probabilmente, la tua domanda dovrebbe essere intitolato come "Come fare linguaggi dinamici il lavoro ?."

E 'semplice, memorizzano le informazioni sul tipo variabile lungo con esso in memoria. E questo non è solo fatto in linguaggi interpretati o compilati JIT lingue, ma anche in modo nativo-compilati come Objective-C.

Altri suggerimenti

Nella maggior parte delle lingue VM, le variabili può essere concettualizzata come puntatori (o riferimenti) alla memoria nel mucchio, anche se la variabile stessa è in pila. Per le lingue che dispongono di tipi primitivi (int e bool in Java, per esempio) coloro che possono essere memorizzati sullo stack pure, ma non possono essere assegnati nuovi tipi in modo dinamico.

Ignorando tipi primitivi, tutte le variabili che esistono sulla pila hanno i loro valori effettivi memorizzati nel mucchio. Così, se si riassegna dinamicamente un valore per loro, il valore originale viene abbandonata (e la memoria ripulito tramite qualche algoritmo raccolta dei rifiuti), e il nuovo valore è allocato in una nuova po 'di memoria.

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

Una VM consente a un diverso tipo di "linguaggio assembly" per essere eseguito, uno che è più in forma per adattarsi a un compilatore. Tutto fatto in una macchina virtuale potrebbe essere fatto in una CPU, in modo da pensare al VM come una CPU. (Alcuni addirittura sono implementate in hardware).

E 'estremamente basso livello, e in molti casi fortemente pila base - al posto dei registri, a livello macchina matematica è tutto relativo a posizioni relative al puntatore stack corrente

.

Con normali linguaggi compilati, molte istruzioni sono necessari per un unico passaggio. un + potrebbe apparire come "afferrare l'oggetto da un punto relativo al puntatore dello stack in un reg, prendere un altro in reg b. aggiungere reg ae b. mettere REG A in un luogo relativamente al stack pointer.

Il VM fa tutto questo con un unico, breve istruzione, eventualmente uno o due byte invece di 4 o 8 byte per istruzione in linguaggio macchina (seconda 32 o 64 architetture bit) (indovinare) dovrebbe significare circa 16 o 32 byte di x86 per 1-2 byte di codice macchina. (Potrei sbagliarmi, il mio ultimo codice x86 era in 80286 dell'epoca.)

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

La procedura per creare il codice VM è la stessa come la creazione di linguaggio macchina, solo un diverso tipo di processore essenzialmente.

VM possono anche implementare i propri meccanismi di sicurezza, recupero di errore e di memoria che sono molto strettamente legati al linguaggio.

Alcuni dei miei descrizione qui è sommaria 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

La chiave per molte delle 'come fanno le macchine virtuali di gestire le variabili di questo tipo o che' veramente scende a metadati ... La meta-informazioni memorizzate e poi aggiornato dà la VM una migliore maniglia su come allocare e poi fare il cosa giusta con le variabili.

In molti casi questo è il tipo di spese generali che possono realmente ottenere in termini di prestazioni. Tuttavia, le moderne implementazioni giorno, ecc hanno percorso una lunga strada nel fare la cosa giusta.

Per quanto riguarda le vostre domande specifiche - trattare variabili come oggetti di vaniglia / etc ... si riduce a riassegnazione / rivalutare meta informazioni sui nuovi incarichi - è per questo che x può guardare in un modo e poi l'altra.

Per rispondere a una parte delle vostre domande, vi consiglio un Google Talk Tech su Python , dove alcune delle vostre domande riguardanti i linguaggi dinamici si risponde; per esempio quello che una variabile è (non è un puntatore, né un riferimento, ma in caso di pitone un'etichetta).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top