Domanda

Da http://code.google.com/p/unladen-swallow / wiki / ProjectPlan Cito:

" L'uso di un JIT ci permetterà anche di spostare Python da una macchina basata su stack a una macchina di registro, che ha dimostrato di migliorare le prestazioni in altri linguaggi simili (Ierusalimschy et al, 2005; Shi et al, 2005) . "

Al college ho creato un semplice compilatore per un linguaggio con procedure ricorsive - che ha mantenuto gli stack frame per ogni procedura chiamata - in modo che possano essere chiamati ricorsivamente e in modo che parametri e valori di ritorno funzionino ....

2 cose:

1) Ho ragione nel pensare che ciò che ho implementato sarebbe considerato una "macchina basata su stack" data la terminologia usata nella citazione sopra?

2) Se la mia ipotesi al punto (1) era corretta, come fa un "registratore macchina"? lavoro? vale a dire in cosa differisce da una macchina basata su stack?

Grazie!

È stato utile?

Soluzione

Una macchina di registro è un'unità hardware o software che quando lavora con i dati li prende dalla memoria, li mette in una posizione in cui può lavorare rapidamente con esso e quindi restituisce il risultato.

Ad esempio una normale CPU è una macchina di registro. Poiché l'ALU (l'unità che funziona con i numeri in una CPU) può funzionare solo con i numeri in un registro.

Una macchina basata su stack aggiunge i dati su uno stack e quindi fa scoppiare o spinge roba su di esso.

Ad esempio, aggiungere due numeri sarebbe

Push 2 // Push 2 onto the stack
Push 3 // Push 3 onto the stack
Add // Add the top two things on the stack.

Quando in una macchina del registro sarebbe qualcosa di simile.

Load x, r0 // Load x onto register 0
Load y, r1 // Load y onto register 1
Add r0, r1, r2 // Add 1 and 2 and store the result in register 2

Altri suggerimenti

Anche una macchina di registro ha quasi sempre uno stack.

Ma una macchina stack raramente ha registri architettonicamente visibili, oppure può avere solo uno o due.

Un registratore potrebbe avere alcune operazioni di stack e potrebbe anche avere una modalità di indirizzamento di stack.

La differenza è di orientamento. La macchina di registro avrà principalmente istruzioni che operano sui registri e avrà una manciata di operazioni per il caricamento e la memorizzazione tra i registri e lo stack o la memoria.

Una macchina stack ... e questi sono molto rari come dispositivi hardware reali .. funzioneranno direttamente sullo stack con le sue istruzioni e avranno una manciata di operazioni per il caricamento e l'archiviazione tra lo stack e la memoria.

Ora, i motivi per cui le macchine per la registrazione dell'hardware sono più veloci delle macchine per lo stack dell'hardware sono probabilmente indipendenti dalle ragioni per cui il software "registra". Le macchine virtuali sono più veloci, secondo la carta citata, rispetto al software "stack" macchine.

Per le VM del software, a quanto pare è necessario eseguire meno istruzioni. Questo è stato determinato empiricamente secondo le affermazioni nel documento citato, ma immagino che sia perché molte meno istruzioni generali come push, pop e exchange devono essere eseguite nella macchina del registro e perché la macchina del registro può riutilizzare facilmente gli operandi se sono ancora in giro nel file di registro, senza bisogno di operazioni di caricamento o push. Certo, è davvero solo un ricordo; sono registri virtuali.

Una macchina di registro utilizza un numero fisso di registri o bucket per memorizzare valori intermedi per il calcolo. Ad esempio, " aggiungi " l'istruzione potrebbe aggiungere i valori in due registri specifici e memorizzare il risultato in un altro registro.

Una macchina basata su stack utilizza una pila per memorizzare valori intermedi durante il calcolo. Ad esempio, per aggiungere due numeri, " aggiungi " le istruzioni estraggono due valori dallo stack, li aggiungono e rimandano il risultato nello stack.

  

1) Ho ragione nel pensare che cosa io   implementato sarebbe considerato a   "macchina basata su stack" dato che   terminologia utilizzata nella citazione   sopra?

Non proprio. Uno stack di qualche tipo è praticamente l'unico modo per implementare chiamate di funzione ricorsive. Ma una "macchina basata su stack" va molto oltre nel fare tutto tramite lo stack. Non solo chiamate di funzione, ma anche operazioni aritmetiche. In un certo senso, si comportano come se ogni istruzione della macchina fosse una chiamata di funzione gestita tramite lo stack. Rende il design di una macchina molto semplice, ma un codice assemblatore / macchina piuttosto difficile da scrivere.

  

2) Se la mia ipotesi al punto (1) fosse   giusto, come fa un "registratore macchina"   lavoro? cioè come è diverso da a   macchina basata su stack?

Una macchina di registro ha una memoria interna (registri) veloce ed esegue la maggior parte delle sue operazioni sui dati in questi registri. Sono disponibili ulteriori istruzioni per la copia dei dati tra i registri e la memoria principale.

IIRC ci sono due tipi di stack machine:

  • Le macchine ad accumulatore hanno un "accumulatore", che è fondamentalmente un unico registro che contiene il risultato dei calcoli (e può anche fornire un operando), con la maggior parte delle istruzioni della macchina che operano sull'accumulatore.
  • " Pure " le macchine stack mettono il risultato dei calcoli in cima alla pila dopo aver consumato gli operandi.

Una macchina di registro è una macchina astratta i cui codici operativi sono definiti facendo riferimento al loro funzionamento su un set di registri denominati, piuttosto che dal loro funzionamento sulla parte superiore di uno stack.

In una macchina del registro: add potrebbe essere definito per prendere tre nomi di registro come operandi, aggiungere il contenuto dei primi due e posizionare il risultato nel terzo. (Più comune è il design in cui solo uno o due sono nominati e il risultato va sempre in un registro dell'accumulatore speciale, ma non è questo il punto.)

In uno stack machine: add potrebbe essere definito per far apparire due operandi dallo stack, aggiungerli e inserire il risultato nello stack.

Il tuo compilatore ha generato il codice macchina? In tal caso, il suo obiettivo era una macchina di registro (quasi tutti i progetti di CPU sono macchine di registro).

Le macchine stack memorizzano tutti i valori su una pila, mentre le macchine registri hanno un numero fisso di slot di memoria i cui "indirizzi" non cambiano (diversamente dalle macchine stack).

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