SlideShare uma empresa Scribd logo
1 de 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

Mais conteúdo relacionado

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

Semelhante a 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
 

Mais de 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
 

Mais de 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
 

Último

innovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 bloginnovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 blogManuel Diaz
 
Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxcj12paz
 
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
 
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiCVelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC6dwwcgtpfx
 
editorial de informática de los sueños.docx
editorial de informática de los sueños.docxeditorial de informática de los sueños.docx
editorial de informática de los sueños.docxssusere34b451
 
BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).jcaballerosamayoa
 
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónNavegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónAntonia Yamilet Perez Palomares
 
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
 
Desarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaDesarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaRicardoEstrada90
 
avancestecnologicossigloveintiunoprofetengohambreayuda
avancestecnologicossigloveintiunoprofetengohambreayudaavancestecnologicossigloveintiunoprofetengohambreayuda
avancestecnologicossigloveintiunoprofetengohambreayudadocente
 
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxTipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxJOELGARCIA849853
 
Tipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosTipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosYOMIRAVILLARREAL1
 
Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.241534381
 
herramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaherramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaJadeVilcscordova
 
Uso de las TIC en la vida cotidiana .
Uso de las TIC en la vida cotidiana       .Uso de las TIC en la vida cotidiana       .
Uso de las TIC en la vida cotidiana .itzyrivera61103
 
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
 
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
 
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUALJORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUALGuadalinfoHuscarGuad
 
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...dramosbrise1403
 
De Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptxDe Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptxdoloresolmosantiago
 

Último (20)

innovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 bloginnovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 blog
 
Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.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
 
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiCVelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
 
editorial de informática de los sueños.docx
editorial de informática de los sueños.docxeditorial de informática de los sueños.docx
editorial de informática de los sueños.docx
 
BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).
 
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónNavegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
 
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
 
Desarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaDesarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - Estrada
 
avancestecnologicossigloveintiunoprofetengohambreayuda
avancestecnologicossigloveintiunoprofetengohambreayudaavancestecnologicossigloveintiunoprofetengohambreayuda
avancestecnologicossigloveintiunoprofetengohambreayuda
 
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxTipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
 
Tipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosTipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de Datos
 
Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.
 
herramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaherramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el tema
 
Uso de las TIC en la vida cotidiana .
Uso de las TIC en la vida cotidiana       .Uso de las TIC en la vida cotidiana       .
Uso de las TIC en la vida cotidiana .
 
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
 
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
 
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUALJORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
 
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
 
De Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptxDe Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptx
 

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; }

Notas do Editor

  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).