Che cosa significa "perché IL non offre istruzioni per manipolare i registri, è facile per le persone creare nuove lingue" significa?

6

Sto leggendo CLR tramite C # e ho trovato questa frase nel primo capitolo e non ho capito cosa significasse esattamente.

Linea completa qui:

because IL offers no instructions to manipulate registers, it is easy for people to create new languages and compilers that produce code targeting the CLR.

Che cosa significa?

Ho azzardato un'ipotesi che indichi che IL è un livello un po 'basso, ma non troppo basso, quindi è facile creare le lingue sopra di esso.

    
posta Animesh 05.10.2013 - 06:01
fonte

2 risposte

7

Dicono che consentire ad un linguaggio di usare i registri lo lega ad una particolare architettura della CPU. poiché CLR e IL hanno allontanato questa complicazione per te, è "più semplice" creare applicazioni più complete come i compilatori, più veloci e prive di errori. perché non sei mai preoccupato dei dettagli sul fatto che il tuo codice sarà portatile tra le CPU, permettendoti di concentrarti sull'aggiunta di funzionalità ai tuoi programmi.

    
risposta data 05.10.2013 - 06:37
fonte
8

Ho letto questo per fare riferimento alla scelta del modello di esecuzione, non all'esposizione di dettagli di livello inferiore dell'architettura hardware. Il CLR è principalmente una macchina stack, il che significa che gli opcode operano su una pila. L'altra opzione comune nello spazio di progettazione VM è la macchina di registro, dove invece viene manipolato un insieme (di solito illimitato) di registri virtuali. Questi registri sono un'astrazione fornita dalla VM (molto simile allo stack in alternativa), quindi è indipendente dall'hardware e deve essere mappato ai registri hardware per un'esecuzione più rapida. Esempi sono le VM Lua (sia l'implementazione di riferimento e LuaJIT), Dalvik e l'esperimento (per altri motivi) Python VM Falcon.

Se la mia lettura è corretta, le osservazioni si riferiscono semplicemente al fatto che è un po 'più facile generare opcode di stack da un AST piuttosto che generare opcode di registro. Su una VM stack, ciascuno (o almeno la maggior parte) dei nodi AST può generare opcode come questo:

child1.codegen()
...
childN.codegen()
emit(OPCODES_FOR_THIS_OPERATION)

ad esempio, per aggiunta:

lhs.codegen()
rhs.codegen()
emit(ADD)

Al contrario, una macchina virtuale basata sui registri ha bisogno di portare in giro almeno alcuni stati per gestire in quale registro sono inseriti tutti i valori temporanei. E se vuole evitare di usare troppi registri, alcune ottimizzazioni leggermente non banali sono necessario (per riutilizzare i registri o, più in generale, eseguire l'allocazione dei registri).

    
risposta data 05.10.2013 - 09:48
fonte

Leggi altre domande sui tag