La mia 'area di memorizzazione delle variabili' è fondamentalmente un 'heap'?

0

Sto pensando di implementare un semplice tipo di macchina virtuale / interprete per un linguaggio semplice che sto facendo. Il compilatore del linguaggio emette principalmente istruzioni orientate allo stack che devono essere eseguite dalla VM.

La struttura del programma sarà simile a questa:

  • La parte dell'esecuzione (per mancanza di un termine migliore): interpreta il opcodes e li esegue.
  • Lo stack di chiamate: per tenere traccia delle chiamate alle funzioni e per i parametri valori di passaggio e restituzione.
  • Lo stack di dati: per nessuna computazione correlata alla funzione, come ad esempio aritmetica.
  • L'area di memorizzazione delle variabili, dove i nomi delle variabili sono abbinati ai valori.

L'area di "memorizzazione delle variabili" sarà implementata fondamentalmente con una cosa HashTable / dizionario. Quando il programmatore crea una variabile (assumendo per ora solo variabili numeriche), una nuova voce viene aggiunta alla tabella. Quando assegna un valore a una variabile, alla voce con il nome corrispondente nella tabella viene assegnato questo valore. Quando il programmatore accede a una variabile, di nuovo recuperiamo il valore dalla tabella.

Sono abbastanza sicuro che sia l'unica parte di archiviazione dei dati di cui ho bisogno nell'applicazione, a parte lo stack di dati e lo stack di chiamate. Non vedo perché mi servirebbe qualcos'altro.

Ora, ho visto cosa è un "mucchio" su Wikipedia e altre fonti online. Ho trovato per lo più termini tecnici che ho difficoltà a capire.

Ma in termini più semplici non tecnici, se ho capito bene, l'heap è dove vengono salvati i dati 'costanti', cose che non sono il calcolo locale come l'aritmetica.

Quindi, se la mia comprensione è corretta, la mia 'area di memorizzazione delle variabili' è fondamentalmente un 'ammasso'? Perché o perché no? Se la mia comprensione di cos'è un heap è errata, spiegacelo.

    
posta Aviv Cohn 02.08.2014 - 17:10
fonte

1 risposta

2

Il termine heap è legato all'assegnazione dinamica della memoria. Se i tuoi programmi dinamicamente creano "variabili", la tua "area di memorizzazione delle variabili" potrebbe essere considerata un heap. Ma ciò che solitamente si chiama variabili è tutt'altro che dinamico:

for (int i = 0; i < N; ++i) {
  int var = i * i;
}

Qui esistono al massimo tre variabili in qualsiasi momento. Dovresti scrivere un codice aggiuntivo per creare più variabili. La durata di tutte le variabili è determinata in modo statico. E così via.

L'heap è non "tutti i dati, eccetto le costanti". Un modello comune (semplificato, ovviamente) di computer reali è: hai registri e lo stack (che contiene non solo valori temporanei ma anche variabili), memoria che è allocata staticamente (cioè esattamente una volta per tutto il tempo in cui il programma è in esecuzione) e l'heap per tutto ciò che non rientra in quelle categorie. Solitamente le variabili e i loro valori non sono affatto parte dell'heap, al massimo i valori delle variabili sono riferimenti / puntatori ai dati memorizzati nell'heap.

In questo contesto, lo stack è chiamato stack perché allocazioni sono FIFO: quando le variabili a , b , c sono state create in tale ordine, c deve essere rimosso prima prima che b e poi a possano essere distrutti. Ma è ancora la memoria ad accesso casuale, quindi l'accesso a una variabile appare come questo in pseudo-C: stackpointer[-10] per il decimo valore dalla cima dello stack.

Un'istruzione bytecode dec a non significa la creazione dinamica di variabili nel senso usato sopra. Ovviamente la gestione della memoria che fa spazio alla variabile deve avvenire in fase di esecuzione, questo è vero anche in C. Ma un programma può eseguire un ciclo che crea un numero variabile di "variabili"? Altrimenti, l'insieme di variabili è impostato su pietra al momento della scrittura del programma e non c'è nulla di dinamico al suo interno.

    
risposta data 02.08.2014 - 17:29
fonte

Leggi altre domande sui tag