Describiré la compilación del código IL en instrucciones nativas de CPU a través del ejemplo siguiente.
public class Example
{
static void Main()
{
Console.WriteLine("Hey IL!!!");
}
}
Principalmente CLR conoce todos los detalles sobre el tipo y qué método se llama desde ese tipo, esto se debe a los metadatos.
Cuando CLR comienza a ejecutar IL en una instrucción de CPU nativa, ese tiempo CLR asigna estructuras de datos internas para cada tipo al que hace referencia el código de Main.
En nuestro caso, solo tenemos un tipo de consola, por lo que CLR asignará una estructura de datos interna a través de esa estructura interna, administraremos el acceso a los tipos referenciados.
dentro de esa estructura de datos, CLR tiene entradas sobre todos los métodos definidos por ese tipo. Cada entrada contiene la dirección donde se puede encontrar la implementación del método.
Al inicializar esta conjuntos estructura CLR cada entrada de indocumentado FUNCIÓN contenido dentro de CLR itself.And como se puede adivinar esta FUNCIÓN es lo que llamamos JIT Compiler.
En general, podría considerar el compilador JIT como una función CLR que compila IL en instrucciones nativas de la CPU. Permítanme mostrarles en detalle cómo será este proceso en nuestro ejemplo.
1.Cuando Main hace su primera llamada a WriteLine, se llama a la función JITCompiler.
2. La función del compilador JIT sabe qué método se está llamando y qué tipo define este método.
Luego, Jit Compiler busca el ensamblado donde se definió ese tipo y obtiene el código IL para el método definido por ese tipo en nuestro caso, el código IL del método WriteLine.
El compilador JIT asigna el bloque de memoria DYNAMIC , después de que JIT verifique y compile el código IL en el código de la CPU nativo y guarde ese código de la CPU en ese bloque de memoria.
Luego, el compilador JIT vuelve a la entrada de la estructura de datos interna y reemplaza la dirección (que principalmente hace referencia a la implementación del código IL de WriteLine) con la dirección del nuevo bloque de memoria creado dinámicamente que contiene instrucciones nativas de CPU de WriteLine.
6. Finalmente, la función del compilador JIT salta al código en el bloque de memoria. Este código es la implementación del método WriteLine.
7.Después de la implementación de WriteLine, el código regresa al código de la red principal, que continúa la ejecución con normalidad.