Descriverò la compilazione del codice IL nelle istruzioni native della CPU tramite l'esempio di seguito.
public class Example
{
static void Main()
{
Console.WriteLine("Hey IL!!!");
}
}
Principalmente CLR conosce tutti i dettagli sul tipo e su quale metodo viene chiamato da quel tipo, ciò è dovuto ai metadati.
Quando CLR inizia a eseguire IL nell'istruzione CPU nativa, quella volta CLR alloca strutture di dati interne per ogni tipo a cui fa riferimento il codice di Main.
Nel nostro caso abbiamo solo un tipo Console, quindi CLR allocherà una struttura dati interna. Tramite quella struttura interna, gestiremo l'accesso alle tipologie referenziate.
All'interno di quella struttura dati, CLR ha voci su tutti i metodi definiti da quel tipo. Ogni voce contiene l'indirizzo in cui è possibile trovare l'implementazione del metodo.
Quando si inizializza questa struttura, CLR imposta ogni voce in FUNZIONE non documentata contenuta all'interno di CLR stesso. E come puoi immaginare, questa FUNZIONE è ciò che chiamiamo compilatore JIT.
Complessivamente potresti considerare JIT Compiler come una funzione CLR, che compila IL in istruzioni native della CPU. Lascia che ti mostri in dettaglio come sarà questo processo nel nostro esempio.
1.Quando Main effettua la sua prima chiamata a WriteLine, viene chiamata la funzione JITCompiler.
2. La funzione del compilatore JIT sa quale metodo viene chiamato e quale tipo definisce questo metodo.
3.Quindi Jit Compiler ricerca l'assembly in cui è stato definito quel tipo e ottiene il codice IL per il metodo definito da quel tipo nel nostro caso il codice IL del metodo WriteLine.
4. Il compilatore JIT alloca il blocco di memoria DYNAMIC , dopodiché JIT verifica e compila il codice IL nel codice CPU nativo e salva quel codice CPU in quel blocco di memoria.
5.Quindi il compilatore JIT torna alla voce della struttura dati interna e sostituisce l'indirizzo (che fa principalmente riferimento all'implementazione del codice IL di WriteLine) con l'indirizzo nuovo blocco di memoria creato dinamicamente, che contiene le istruzioni CPU native di WriteLine.
6.Infine, la funzione JIT Compiler salta al codice nel blocco di memoria ed esegue il codice nativo del metodo di scrittura.
7.Dopo l'esecuzione di WriteLine, il codice ritorna al Mains'code che continua l'esecuzione normalmente.