2010-02-16 15 views

risposta

18

Prima di tutto, Beam è una macchina di registro, non una macchina stack. Come il WAM per Prolog, usa "X-registers" che sono normali registri (implementati come una matrice in C), e "Y-registers" che sono nomi per slot nel record di attivazione della funzione locale (il "call frame") in pila. Non ci sono istruzioni di manipolazione dello stack.

In secondo luogo, vi sono istruzioni per allocare rapidamente alcune più parole di memoria heap, per inizializzare tuple e altre strutture dati nell'heap, per selezionare elementi di tuple, ecc. JVM è focalizzata sugli oggetti e ha un 'nuovo 'operazione che nasconde i dettagli dell'allocazione della memoria e dell'inizializzazione di base.

Il BEAM ha un'istruzione per decrementare il "contagiri" per il processo e decidere se è il momento di arrendersi per consentire l'esecuzione di un altro processo. D'altra parte, JVM ha istruzioni di sincronizzazione per i thread.

Una differenza importante è che BEAM ha istruzioni di chiamata di coda, che JVM manca.

Infine, sia per BEAM che per JVM, il set di istruzioni utilizzato nei file oggetto è in realtà solo un formato di trasporto. L'emulatore BEAM riscrive le istruzioni dal file in una versione interna con molte istruzioni per casi speciali ottimizzate (che possono cambiare da una versione all'altra). In alternativa, puoi compilare il codice nativo. La maggior parte delle JVM fa la stessa cosa.