Come escogitare il set di istruzioni di una macchina basata sullo stack?

3

Le macchine virtuali basate su stack come CLR e JVM hanno un set di istruzioni diverso. C'è qualche teoria dietro la creazione del set di istruzioni durante la creazione di una macchina virtuale? per esempio. ci sono set di istruzioni JVM per caricare le costanti da 0-5 nello stack

iconst_0
iconst_1
iconst_2
iconst_3
iconst_4
iconst_5

mentre in CLR ci sono istruzioni impostate per caricare il numero da 0 a 8 nello stack come segue

ldc.i4.0
ldc.i4.1
ldc.i4.2
ldc.i4.3
ldc.i4.4
ldc.i4.5
ldc.i4.6
ldc.i4.7
ldc.i4.8

perché non c'è ldc.i4.9 e se ldc.i4 è lì perché abbiamo bisogno degli opcode precedenti? E ce ne sono altri come questi.

Sono ansioso di sapere qual è la ragione alla base di questa differenza tra gli opcode di diverse VM? C'è qualche teoria specifica per escogitare questi opcode o è totalmente guidata dalle caratteristiche della VM stessa o dipende dai costrutti del linguaggio di alto livello?

    
posta Anindya Chatterjee 29.06.2012 - 13:06
fonte

2 risposte

4

Spesso i set di istruzioni sono concepiti esaminando il codice generato per macchine simili per vedere quali istruzioni si verificano più spesso. I progettisti scriveranno anche compilatori (o almeno un back-end per GCC) usando le loro istruzioni proposte per vedere quanto sia efficiente (sia in termini di densità del codice che di velocità di esecuzione) il codice risultante. Sono sicuro che i progettisti del CLR hanno esaminato con attenzione la JVM per vedere come potrebbe essere migliorata, proprio come i progettisti della JVM hanno ottenuto informazioni dalle precedenti macchine virtuali (p-system, Forth, Smalltalk).

La teoria generale della progettazione ISA afferma che gli opcode più comunemente usati dovrebbero essere i più corti, poiché ciò porterà alla migliore densità del codice (e anche alle migliori prestazioni, dal momento che le istruzioni più brevi tendono ad essere più semplici da decodificare). L'ideazione dello schema di codifica reale (opcode + operando / i + tipo / i di dati + modalità / i di indirizzamento) è interamente affidata all'architetto ISA ed è una di quelle abilità "black art" che richiede molta esperienza.

    
risposta data 29.06.2012 - 15:15
fonte
3

L'unico libro che conosco che consideri i problemi nel design del set di istruzioni (ISA) è Gerry Blaauw e Fred Brooks , la maggior parte degli altri libri su CA forniscono solo una classificazione e non vanno molto lontano.

Per il tuo problema, devi bilanciare la densità del codice. Un ldc.i4 è sufficiente per fornire la funzionalità, ma ogni caso è usato, ci vorrebbero 1 byte di istruzione e 4 byte di costante. Fornire un po 'di scopo speciale ldc.i4.xx usando solo 1 byte di istruzione aiuta ad aumentare la densità del codice. Ma ovviamente puoi avere solo 256 istruzioni a un byte, quindi devi usarle con saggezza.

E il fattore aggiuntivo per VM (questo fattore è meno vero per l'implementazione hardware) è che tali istruzioni speciali non solo occuperanno meno spazio nel flusso di istruzioni (con beneficio sulla pressione della cache e quindi sulla velocità), queste istruzioni essere eseguiti più rapidamente del loro equivalente.

    
risposta data 29.06.2012 - 13:33
fonte

Leggi altre domande sui tag