SlideShare ist ein Scribd-Unternehmen logo
1 von 51
> _
console.WriteLine(variable);
console.WriteLine(variable);
SyntaxTree tree =
CSharpSyntaxTree.ParseText(
@"using System;
class Foo{
static void Bar(int x){
Console.WriteLine(x);
}
}"
)
var msLib = new MetadataFileReference(
typeof(object).Assembly.Location) ;
SyntaxTree tree = CSharpSyntaxTree.ParseText(code);
var comp = CSharpSyntaxTree.Create("DotNetConf")
.AddReferences(msLib)
.AddSyntaxTrees(tree);
var result = comp.Emit("DotNetConf.exe");
int Calculate(int x)
{
var result = x;
do
{
result += 5;
} while (result < 15);
return result;
}
int Calculate(int n)
{
if (n <= 1)
return 1;
return n * Calculate(n - 1);
}
int Calculate(int n)
{
if (n <= 1)
return 1;
return n * Calculate(n - 1);
}
double Divider(int a, int b)
{
return a / b;
}
var myMethod = new DynamicMethod("DivideMethod",
typeof(double), new[] { typeof(int), typeof(int) },
typeof(Program).Module);
var il = myMethod.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Div);
il.Emit(OpCodes.Ret);
var result = myMethod.Invoke(null, new object[] { 10, 2 });
var method =
(Func<int,int,int>)myMethod.CreateDelegate(typeof(DivideDelegate));
var result2 = method(6, 2);
double Divider(int a, int b)
{
return a / b;
}
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NET

Weitere ähnliche Inhalte

Ähnlich wie De Código a Ejecución: El Papel Fundamental del MSIL en .NET

Ähnlich wie De Código a Ejecución: El Papel Fundamental del MSIL en .NET (20)

Resolución de problemas con java
Resolución de problemas con javaResolución de problemas con java
Resolución de problemas con java
 
PROBLEMAS DE POGRAMACION 1
PROBLEMAS DE POGRAMACION 1PROBLEMAS DE POGRAMACION 1
PROBLEMAS DE POGRAMACION 1
 
Simulación - Algoritmo de productos medios
Simulación - Algoritmo de productos mediosSimulación - Algoritmo de productos medios
Simulación - Algoritmo de productos medios
 
1... conversor de bases
1... conversor de bases1... conversor de bases
1... conversor de bases
 
Trabajando con Procedimientos Almacenados y VB.Net
Trabajando con Procedimientos Almacenados y VB.NetTrabajando con Procedimientos Almacenados y VB.Net
Trabajando con Procedimientos Almacenados y VB.Net
 
Metodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosMetodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a Objetos
 
Newton And Neville Interpolation
Newton And Neville InterpolationNewton And Neville Interpolation
Newton And Neville Interpolation
 
Interpolación método de Lagrange
Interpolación método de LagrangeInterpolación método de Lagrange
Interpolación método de Lagrange
 
Interpolaion c++
Interpolaion c++Interpolaion c++
Interpolaion c++
 
Arreglos, Procedimientos y Funciones
Arreglos, Procedimientos y FuncionesArreglos, Procedimientos y Funciones
Arreglos, Procedimientos y Funciones
 
Asp vNext Is Comming
Asp vNext Is CommingAsp vNext Is Comming
Asp vNext Is Comming
 
Vector
Vector Vector
Vector
 
Programación de código
Programación de códigoProgramación de código
Programación de código
 
Pf con scala
Pf con scalaPf con scala
Pf con scala
 
Swrewer nuevo hoy
Swrewer nuevo hoySwrewer nuevo hoy
Swrewer nuevo hoy
 
IF-ELSE EN Csharp C#
IF-ELSE EN Csharp C#IF-ELSE EN Csharp C#
IF-ELSE EN Csharp C#
 
Conceptosfundamentales
ConceptosfundamentalesConceptosfundamentales
Conceptosfundamentales
 
Presentacion
PresentacionPresentacion
Presentacion
 
Red neuronal recurrente
Red neuronal recurrenteRed neuronal recurrente
Red neuronal recurrente
 
Unidad 2 informe tecnico
Unidad 2 informe tecnicoUnidad 2 informe tecnico
Unidad 2 informe tecnico
 

Mehr von Germán Küber

Explorando el Diseño de la Memoria en Rust
Explorando el Diseño de la Memoria en RustExplorando el Diseño de la Memoria en Rust
Explorando el Diseño de la Memoria en RustGermán Küber
 
Que son los smart contracts.pptx
Que son los smart contracts.pptxQue son los smart contracts.pptx
Que son los smart contracts.pptxGermán Küber
 
De 0 a blockchain developer en 3 meses
De 0 a blockchain developer en 3 mesesDe 0 a blockchain developer en 3 meses
De 0 a blockchain developer en 3 mesesGermán Küber
 
Patrones de diseño en solidity
Patrones de diseño en solidityPatrones de diseño en solidity
Patrones de diseño en solidityGermán Küber
 
Vertical slice architecture
Vertical slice architectureVertical slice architecture
Vertical slice architectureGermán Küber
 
De 0 a blockchain developer en 3 meses
De 0 a blockchain developer en 3 mesesDe 0 a blockchain developer en 3 meses
De 0 a blockchain developer en 3 mesesGermán Küber
 
Diamon pattern presentation
Diamon pattern presentationDiamon pattern presentation
Diamon pattern presentationGermán Küber
 
Programación Funcional C#
Programación Funcional C#Programación Funcional C#
Programación Funcional C#Germán Küber
 
Arquitectura en aplicaciones Angular y buenas practicas.
Arquitectura en aplicaciones Angular y buenas practicas.Arquitectura en aplicaciones Angular y buenas practicas.
Arquitectura en aplicaciones Angular y buenas practicas.Germán Küber
 
Un mundo sin if. generics al rescate
Un mundo sin if. generics al rescateUn mundo sin if. generics al rescate
Un mundo sin if. generics al rescateGermán Küber
 
Azure 360º para Desarrolaldores
Azure 360º para DesarrolaldoresAzure 360º para Desarrolaldores
Azure 360º para DesarrolaldoresGermán Küber
 
Vertical slice architecture
Vertical slice architectureVertical slice architecture
Vertical slice architectureGermán Küber
 

Mehr von Germán Küber (20)

Explorando el Diseño de la Memoria en Rust
Explorando el Diseño de la Memoria en RustExplorando el Diseño de la Memoria en Rust
Explorando el Diseño de la Memoria en Rust
 
Mev Rapido.pptx
Mev Rapido.pptxMev Rapido.pptx
Mev Rapido.pptx
 
Que son los smart contracts.pptx
Que son los smart contracts.pptxQue son los smart contracts.pptx
Que son los smart contracts.pptx
 
De 0 a blockchain developer en 3 meses
De 0 a blockchain developer en 3 mesesDe 0 a blockchain developer en 3 meses
De 0 a blockchain developer en 3 meses
 
Patrones funcionales
Patrones funcionalesPatrones funcionales
Patrones funcionales
 
Patrones de diseño en solidity
Patrones de diseño en solidityPatrones de diseño en solidity
Patrones de diseño en solidity
 
Vertical slice architecture
Vertical slice architectureVertical slice architecture
Vertical slice architecture
 
De 0 a blockchain developer en 3 meses
De 0 a blockchain developer en 3 mesesDe 0 a blockchain developer en 3 meses
De 0 a blockchain developer en 3 meses
 
Diamon pattern presentation
Diamon pattern presentationDiamon pattern presentation
Diamon pattern presentation
 
Patrones funcionales
Patrones funcionalesPatrones funcionales
Patrones funcionales
 
Defensive code
Defensive codeDefensive code
Defensive code
 
Programación Funcional C#
Programación Funcional C#Programación Funcional C#
Programación Funcional C#
 
Unit testing consejos
Unit testing   consejosUnit testing   consejos
Unit testing consejos
 
Defensive code C#
Defensive code C#Defensive code C#
Defensive code C#
 
Event sourcing
Event sourcingEvent sourcing
Event sourcing
 
C sharp 8
C sharp 8C sharp 8
C sharp 8
 
Arquitectura en aplicaciones Angular y buenas practicas.
Arquitectura en aplicaciones Angular y buenas practicas.Arquitectura en aplicaciones Angular y buenas practicas.
Arquitectura en aplicaciones Angular y buenas practicas.
 
Un mundo sin if. generics al rescate
Un mundo sin if. generics al rescateUn mundo sin if. generics al rescate
Un mundo sin if. generics al rescate
 
Azure 360º para Desarrolaldores
Azure 360º para DesarrolaldoresAzure 360º para Desarrolaldores
Azure 360º para Desarrolaldores
 
Vertical slice architecture
Vertical slice architectureVertical slice architecture
Vertical slice architecture
 

Kürzlich hochgeladen

Redes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdfRedes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdfJosAndrRosarioVzquez
 
Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxcj12paz
 
Desarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaDesarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaRicardoEstrada90
 
Editorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfEditorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfYanitza28
 
Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024NicolleAndrade7
 
QUINTA SEXTA GENERACION de COMPUTADORAS
QUINTA  SEXTA GENERACION de COMPUTADORASQUINTA  SEXTA GENERACION de COMPUTADORAS
QUINTA SEXTA GENERACION de COMPUTADORASMarc Liust
 
Función del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacionFunción del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacionEmanuelMuoz11
 
Chat GPT para la educación Latinoamerica
Chat GPT para la educación LatinoamericaChat GPT para la educación Latinoamerica
Chat GPT para la educación LatinoamericaEdwinGarca59
 
infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptx
infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptxinfor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptx
infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptxgustavovasquezv56
 
microsoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamtemicrosoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamte2024020140
 
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptxAVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptxdulcemonterroza
 
el uso de las TIC en la vida cotidiana.pptx
el uso de las TIC en la vida cotidiana.pptxel uso de las TIC en la vida cotidiana.pptx
el uso de las TIC en la vida cotidiana.pptx221112876
 
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdfjuan23xpx
 
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdfpresentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdfaxelv9257
 
EL ESPIRITU SANTO en pentecostes2022.pptx
EL ESPIRITU SANTO en pentecostes2022.pptxEL ESPIRITU SANTO en pentecostes2022.pptx
EL ESPIRITU SANTO en pentecostes2022.pptxLuisJavierMoralesMen1
 
Imágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la informaciónImágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la informaciónUniversidad de Sonora
 
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptx
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptxNIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptx
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptxDaniloDaz4
 
10°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-810°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-8antoniopalmieriluna
 
2023 07 Casos prácticos para Realidad aumentada, metaverso y realidad extendida
2023 07 Casos prácticos para Realidad aumentada, metaverso y realidad extendida2023 07 Casos prácticos para Realidad aumentada, metaverso y realidad extendida
2023 07 Casos prácticos para Realidad aumentada, metaverso y realidad extendidaLuis Francisco Reyes Aceves
 
presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...axelv9257
 

Kürzlich hochgeladen (20)

Redes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdfRedes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdf
 
Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptx
 
Desarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaDesarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - Estrada
 
Editorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfEditorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdf
 
Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024
 
QUINTA SEXTA GENERACION de COMPUTADORAS
QUINTA  SEXTA GENERACION de COMPUTADORASQUINTA  SEXTA GENERACION de COMPUTADORAS
QUINTA SEXTA GENERACION de COMPUTADORAS
 
Función del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacionFunción del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacion
 
Chat GPT para la educación Latinoamerica
Chat GPT para la educación LatinoamericaChat GPT para la educación Latinoamerica
Chat GPT para la educación Latinoamerica
 
infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptx
infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptxinfor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptx
infor expo AVANCES TECNOLOGICOS DEL SIGLO 21.pptx
 
microsoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamtemicrosoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamte
 
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptxAVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptx
 
el uso de las TIC en la vida cotidiana.pptx
el uso de las TIC en la vida cotidiana.pptxel uso de las TIC en la vida cotidiana.pptx
el uso de las TIC en la vida cotidiana.pptx
 
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
 
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdfpresentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
 
EL ESPIRITU SANTO en pentecostes2022.pptx
EL ESPIRITU SANTO en pentecostes2022.pptxEL ESPIRITU SANTO en pentecostes2022.pptx
EL ESPIRITU SANTO en pentecostes2022.pptx
 
Imágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la informaciónImágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la información
 
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptx
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptxNIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptx
NIA_300_PLANEACION_DE_UNA_AUDITORIA_DE_E.pptx
 
10°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-810°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-8
 
2023 07 Casos prácticos para Realidad aumentada, metaverso y realidad extendida
2023 07 Casos prácticos para Realidad aumentada, metaverso y realidad extendida2023 07 Casos prácticos para Realidad aumentada, metaverso y realidad extendida
2023 07 Casos prácticos para Realidad aumentada, metaverso y realidad extendida
 
presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...
 

De Código a Ejecución: El Papel Fundamental del MSIL en .NET

  • 1.
  • 2. > _
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16. SyntaxTree tree = CSharpSyntaxTree.ParseText( @"using System; class Foo{ static void Bar(int x){ Console.WriteLine(x); } }" )
  • 17.
  • 18. var msLib = new MetadataFileReference( typeof(object).Assembly.Location) ; SyntaxTree tree = CSharpSyntaxTree.ParseText(code); var comp = CSharpSyntaxTree.Create("DotNetConf") .AddReferences(msLib) .AddSyntaxTrees(tree); var result = comp.Emit("DotNetConf.exe");
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40. int Calculate(int x) { var result = x; do { result += 5; } while (result < 15); return result; }
  • 41.
  • 42. int Calculate(int n) { if (n <= 1) return 1; return n * Calculate(n - 1); }
  • 43. int Calculate(int n) { if (n <= 1) return 1; return n * Calculate(n - 1); }
  • 44.
  • 45. double Divider(int a, int b) { return a / b; }
  • 46. var myMethod = new DynamicMethod("DivideMethod", typeof(double), new[] { typeof(int), typeof(int) }, typeof(Program).Module); var il = myMethod.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Div); il.Emit(OpCodes.Ret); var result = myMethod.Invoke(null, new object[] { 10, 2 }); var method = (Func<int,int,int>)myMethod.CreateDelegate(typeof(DivideDelegate)); var result2 = method(6, 2);
  • 47. double Divider(int a, int b) { return a / b; }

Hinweis der Redaktion

  1. Parser (Análisis Sintáctico): En esta fase, el compilador lee el código fuente y lo descompone en tokens que siguen la gramática del lenguaje. Se construye un árbol sintáctico que representa la estructura lógica del código. Esta fase se ocupa de la estructura sintáctica del código, asegurándose de que esté bien formado según las reglas del lenguaje de programación. Symbol/Metadata (Símbolos y Metadatos): Durante esta etapa, el compilador analiza los símbolos definidos en el código, como variables, tipos y métodos, y los organiza en una tabla de símbolos. Esta fase también implica cargar y analizar los metadatos de las bibliotecas y ensamblados referenciados por el código fuente, formando una representación de todos los nombres y tipos utilizados. Binder (Vinculación): En la fase de vinculación, el compilador asocia cada identificador en el código con su declaración correspondiente en la tabla de símbolos, resolviendo las referencias y comprobando la semántica del código, como el alcance de las variables, la corrección de los tipos y la resolución de sobrecargas de métodos. IL Emitter (Emisión de IL): Esta es la fase final del proceso de compilación, donde el compilador convierte el código fuente analizado y procesado en MSIL (Microsoft Intermediate Language), el conjunto de instrucciones de bajo nivel que el CLR (Common Language Runtime) puede ejecutar. La salida de esta fase es un ensamblado que contiene el código MSIL junto con los metadatos necesarios para su ejecución.
  2. Parser (Análisis Sintáctico): En esta fase, el compilador lee el código fuente y lo descompone en tokens que siguen la gramática del lenguaje. Se construye un árbol sintáctico que representa la estructura lógica del código. Esta fase se ocupa de la estructura sintáctica del código, asegurándose de que esté bien formado según las reglas del lenguaje de programación. Symbol/Metadata (Símbolos y Metadatos): Durante esta etapa, el compilador analiza los símbolos definidos en el código, como variables, tipos y métodos, y los organiza en una tabla de símbolos. Esta fase también implica cargar y analizar los metadatos de las bibliotecas y ensamblados referenciados por el código fuente, formando una representación de todos los nombres y tipos utilizados. Binder (Vinculación): En la fase de vinculación, el compilador asocia cada identificador en el código con su declaración correspondiente en la tabla de símbolos, resolviendo las referencias y comprobando la semántica del código, como el alcance de las variables, la corrección de los tipos y la resolución de sobrecargas de métodos. IL Emitter (Emisión de IL): Esta es la fase final del proceso de compilación, donde el compilador convierte el código fuente analizado y procesado en MSIL (Microsoft Intermediate Language), el conjunto de instrucciones de bajo nivel que el CLR (Common Language Runtime) puede ejecutar. La salida de esta fase es un ensamblado que contiene el código MSIL junto con los metadatos necesarios para su ejecución.
  3. IL_0000: nop - No operation (no hace nada, a menudo se incluye por motivos de depuración). IL_0001: ldarg.0 - Carga el argumento en el índice 0 (el parámetro n) en el stack. IL_0002: ldc.i4.1 - Carga la constante entera 1 en el stack. IL_0003: cgt - Compara si el valor que está en el tope del stack es mayor que el siguiente valor debajo de él (en este caso, si n > 1). El resultado (true/false) se coloca en el stack. IL_0005: ldc.i4.0 - Carga la constante entera 0 en el stack. IL_0006: ceq - Compara si los dos valores en el tope del stack son iguales (si n > 1 es igual a 0, o si n <= 1). El resultado (true/false) se coloca en el stack. IL_0008: stloc.0 - Almacena el resultado de la comparación en la variable local en el índice 0. IL_0009: ldloc.0 - Carga el valor de la variable local en el índice 0 en el stack (el resultado de n <= 1). IL_000a: brfalse.s IL_0010 - Si el valor es false (es decir, si n > 1), salta a la instrucción en IL_0010. IL_000c: ldc.i4.1 - Si el valor fue true (es decir, si n <= 1), carga la constante 1 en el stack (caso base del factorial). IL_000d: stloc.1 - Almacena el valor 1 en la variable local en el índice 1. IL_000e: br.s IL_001d - Salta incondicionalmente a la instrucción en IL_001d. IL_0010: ldarg.0 - Carga el argumento n en el stack. IL_0011: ldarg.0 - Carga el argumento n en el stack nuevamente. IL_0012: ldc.i4.1 - Carga la constante entera 1 en el stack. IL_0013: sub - Resta 1 de n (lo que resulta en n - 1) y pone el resultado en el stack. IL_0014: call int32 Program::'<<Main>$>g__Calculate|0_0'(int32) - Llama a la función Calculate recursivamente con el argumento n - 1. IL_0019: mul - Multiplica n por el resultado de la llamada recursiva y coloca el resultado en el stack. IL_001a: stloc.1 - Almacena el resultado de la multiplicación en la variable local en el índice 1. IL_001b: br.s IL_001d - Salta incondicionalmente a la instrucción en IL_001d (esto se hace para unificar el flujo del programa después del if-else). IL_001d: ldloc.1 - Carga el valor de la variable local en el índice 1 en el stack (el resultado final del factorial). IL_001e: ret - Retorna el valor en el tope del stack (el resultado de la función).
  4. IL_0000: nop - No operation (no hace nada, a menudo se incluye por motivos de depuración). IL_0001: ldarg.0 - Carga el argumento en el índice 0 (el parámetro n) en el stack. IL_0002: ldc.i4.1 - Carga la constante entera 1 en el stack. IL_0003: cgt - Compara si el valor que está en el tope del stack es mayor que el siguiente valor debajo de él (en este caso, si n > 1). El resultado (true/false) se coloca en el stack. IL_0005: ldc.i4.0 - Carga la constante entera 0 en el stack. IL_0006: ceq - Compara si los dos valores en el tope del stack son iguales (si n > 1 es igual a 0, o si n <= 1). El resultado (true/false) se coloca en el stack. IL_0008: stloc.0 - Almacena el resultado de la comparación en la variable local en el índice 0. IL_0009: ldloc.0 - Carga el valor de la variable local en el índice 0 en el stack (el resultado de n <= 1). IL_000a: brfalse.s IL_0010 - Si el valor es false (es decir, si n > 1), salta a la instrucción en IL_0010. IL_000c: ldc.i4.1 - Si el valor fue true (es decir, si n <= 1), carga la constante 1 en el stack (caso base del factorial). IL_000d: stloc.1 - Almacena el valor 1 en la variable local en el índice 1. IL_000e: br.s IL_001d - Salta incondicionalmente a la instrucción en IL_001d. IL_0010: ldarg.0 - Carga el argumento n en el stack. IL_0011: ldarg.0 - Carga el argumento n en el stack nuevamente. IL_0012: ldc.i4.1 - Carga la constante entera 1 en el stack. IL_0013: sub - Resta 1 de n (lo que resulta en n - 1) y pone el resultado en el stack. IL_0014: call int32 Program::'<<Main>$>g__Calculate|0_0'(int32) - Llama a la función Calculate recursivamente con el argumento n - 1. IL_0019: mul - Multiplica n por el resultado de la llamada recursiva y coloca el resultado en el stack. IL_001a: stloc.1 - Almacena el resultado de la multiplicación en la variable local en el índice 1. IL_001b: br.s IL_001d - Salta incondicionalmente a la instrucción en IL_001d (esto se hace para unificar el flujo del programa después del if-else). IL_001d: ldloc.1 - Carga el valor de la variable local en el índice 1 en el stack (el resultado final del factorial). IL_001e: ret - Retorna el valor en el tope del stack (el resultado de la función).