Nuovo tipo di VM Type

0

Ho progettato il mio tipo di vm, una sorta di registro dello stack. Funziona con uno stack ma invece di premere e scoppiare i valori, è sufficiente memorizzare i valori nello stack e aggiungere diversi indirizzi.

Ad esempio, add sarebbe #add addressTo, address1, address2. Potrebbe sembrare una macchina di registro, ma tutto viene archiviato nello stack anziché il registro e le variabili locali nello stack.

La ragione per cui ritengo che questa sia una buona idea è che non è necessario caricare la memoria da e verso i registri, ma i vantaggi di una macchina di registro. C'è un difetto nel mio design o perché non è già usato o è completamente nuovo che dubito?

    
posta Coder3000 06.12.2015 - 21:50
fonte

1 risposta

8

Alcuni primi computer hanno funzionato nel modo in cui hai descritto, indirizzando la memoria direttamente senza alcun registro. Il problema con questo approccio era che molto presto l'accesso allo storage era molto più lento del processore. Pertanto, le moderne architetture di computer utilizzano molti livelli di memorizzazione nella cache, dai dischi rigidi lenti, alla RAM, alle varie cache L3-L1, ai registri veloci. Diverse architetture portano questo a diversi estremi. Per esempio. in MIPS, tutte le istruzioni funzionano solo sui registri e ci sono istruzioni di carico e di memorizzazione dedicate. Al contrario, l'istruzione x86 mov è completata da Turing.

Nella progettazione VM, abbiamo più libertà durante la progettazione di un'architettura.

Ci sono VM di basso livello come il LLVM che sono preoccupati di essere facilmente compilabili sul codice macchina attuale. LLVM utilizza un tipo di architettura di registro in cui ogni registro può essere assegnato solo una volta, ma non si hanno restrizioni sul numero di registri. Ciò semplifica la produzione di allocazioni di registro efficienti per le CPU effettive. Questa rappresentazione LLVM semplifica anche l'implementazione di ottimizzazioni come l'eliminazione comune della sottoespressione. Il grosso svantaggio è che non avere uno stack integrato ci impone di gestire manualmente la memoria quando lo stato locale non si adatta ai registri disponibili. Una volta che il tuo codice scrive effettivamente in memoria, diventa molto più difficile da ottimizzare.

Esistono VM di registro di alto livello (Parrot ...), ma sono molto rari.

Esistono anche macchine virtuali di alto livello come l'implementazione Perl. Qui, le istruzioni sono di livello estremamente alto come "applica un'espressione regolare" o "invia un metodo". La VM Perl utilizza un'architettura stack che semplifica molto - confronta "aggiungi i primi due valori nello stack" con "aggiungi registri A e B e archivia in C". Il codice per una macchina stack può essere generato direttamente da un albero di sintassi astratto, ma le allocazioni di registro sono più complicate (se si dispone di un numero limitato di registri). Ancora più importante, i registri non ci darebbero alcun vantaggio considerando il modello di memoria Perl - ogni valore è rappresentato come un puntatore a una struttura.

Esistono anche altri linguaggi basati su stack di basso livello, ad es. la classe dei linguaggi concatenativi (Forth, PostScript). Dal momento che le operazioni funzionano sempre con i migliori valori dello stack, possono essere composte in modo abbastanza flessibile. Tuttavia, lo stack è usato qui come modello semantico, non necessariamente come strategia di implementazione. Per una VM di basso livello, le macchine stack sono interessanti perché hanno un codice oggetto molto compatto (anche perché la JVM è basata sullo stack), dal momento che le istruzioni non hanno bisogno di memorizzare le loro posizioni degli argomenti. Sfortunatamente, rendono difficile eseguire alcune ottimizzazioni e potenzialmente possono richiedere molte letture / scritture di memoria.

La tua architettura "ibrida" (in realtà, più simile a una macchina ad accesso casuale senza registri, che sembra avere uno stack) funzionerebbe sicuramente, ma non ha nessuno dei vantaggi di una macchina di registro, essendo la velocità e l'ottimizzazione relativa. Non ha nemmeno le qualità desiderabili di una macchina stack, dal momento che le macchine stack sono più comuni nelle macchine virtuali di alto livello in cui l'accesso diretto alla memoria non è una cosa, o in scenari di basso livello in cui abbiamo bisogno del codice compatto.

    
risposta data 06.12.2015 - 22:45
fonte

Leggi altre domande sui tag