Descreverei a compilação do código IL em instruções nativas da CPU por meio do exemplo abaixo.
public class Example
{
static void Main()
{
Console.WriteLine("Hey IL!!!");
}
}
Principalmente o CLR conhece todos os detalhes sobre o tipo e qual método está sendo chamado desse tipo devido aos metadados.
Quando o CLR começa a executar IL na instrução nativa da CPU, esse tempo CLR aloca estruturas de dados internas para cada tipo referenciado pelo código de Main.
No nosso caso, temos apenas um tipo de Console, portanto, o CLR alocará uma estrutura de dados interna através dessa estrutura interna, gerenciaremos o acesso aos tipos referenciados
dentro dessa estrutura de dados, o CLR tem entradas sobre todos os métodos definidos por aquele tipo. Cada entrada contém o endereço onde a implementação do método pode ser encontrada.
Ao inicializar essa estrutura, o CLR define cada entrada em FUNCTION não documentada contida dentro do próprio CLR. E, como você pode imaginar, essa FUNCTION é o que chamamos de JIT Compiler.
No geral, você pode considerar o JIT Compiler como uma função CLR que compila IL em instruções nativas da CPU. Deixe-me mostrar em detalhes como será esse processo em nosso exemplo.
1.Quando Main faz sua primeira chamada para WriteLine, a função JITCompiler é chamada.
2. A função do compilador JIT sabe qual método está sendo chamado e que tipo define esse método.
3. Em seguida, o Jit Compiler procura o assembly onde definiu aquele tipo e obtém o código IL para o método definido por aquele tipo em nosso caso, código IL do método WriteLine.
4. O compilador JIT aloca o bloco de memória DINÂMICA , depois disso o JIT verifica e compila o código IL no código nativo da CPU e salva esse código da CPU naquele bloco de memória.
5. Então o compilador JIT volta para a entrada da estrutura de dados interna e substitui o endereço (que faz referência principalmente à implementação do código IL de WriteLine) pelo novo bloco de memória criado dinamicamente que contém instruções de CPU nativas de WriteLine.
6.Finalmente, a função JIT Compiler salta para o código no bloco de memória. Este código é a implementação do método WriteLine.
7.Após a implementação do WriteLine, o código retorna ao código Mains, que continua a execução normalmente.