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
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
console.WriteLine(variable);
console.WriteLine(variable);
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
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
SyntaxTree tree =
CSharpSyntaxTree.ParseText(
@"using System;
class Foo{
static void Bar(int x){
Console.WriteLine(x);
}
}"
)
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
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");
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
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
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
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
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
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
int Calculate(int x)
{
var result = x;
do
{
result += 5;
} while (result < 15);
return result;
}
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
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);
}
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
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

Más contenido relacionado

PPTX
Explorando el Diseño de la Memoria en Rust
PPTX
Mev Rapido.pptx
PPTX
Que son los smart contracts.pptx
PPTX
De 0 a blockchain developer en 3 meses
PPTX
Patrones funcionales
PPTX
Patrones de diseño en solidity
PPTX
Vertical slice architecture
PPTX
De 0 a blockchain developer en 3 meses
Explorando el Diseño de la Memoria en Rust
Mev Rapido.pptx
Que son los smart contracts.pptx
De 0 a blockchain developer en 3 meses
Patrones funcionales
Patrones de diseño en solidity
Vertical slice architecture
De 0 a blockchain developer en 3 meses

Más de Germán Küber (20)

PPTX
Diamon pattern presentation
PPTX
Patrones funcionales
PPTX
Defensive code
PPTX
Programación Funcional C#
PPTX
Unit testing consejos
PPTX
Defensive code C#
PPTX
Event sourcing
PPTX
C sharp 8
PPTX
Arquitectura en aplicaciones Angular y buenas practicas.
PPTX
Un mundo sin if. generics al rescate
PPTX
Azure 360º para Desarrolaldores
PPTX
Vertical slice architecture
PPTX
Microservicios net arquitectura para aplicaciones net contenerizadas - net ...
PPTX
CQRS .NET Conf Chile 2018
PPTX
Docker para aplicaciones angular
PPTX
Microservicios net arquitectura para aplicaciones net contenerizadas - net ...
PPTX
Specification
PPTX
Programación en N Capas .Net
PPTX
Xamarin 360
PPTX
Linq - Introducción
Diamon pattern presentation
Patrones funcionales
Defensive code
Programación Funcional C#
Unit testing consejos
Defensive code C#
Event sourcing
C sharp 8
Arquitectura en aplicaciones Angular y buenas practicas.
Un mundo sin if. generics al rescate
Azure 360º para Desarrolaldores
Vertical slice architecture
Microservicios net arquitectura para aplicaciones net contenerizadas - net ...
CQRS .NET Conf Chile 2018
Docker para aplicaciones angular
Microservicios net arquitectura para aplicaciones net contenerizadas - net ...
Specification
Programación en N Capas .Net
Xamarin 360
Linq - Introducción
Publicidad

Último (20)

PDF
conceptosbsicosdeprogramacinpseintlaura.pdf
PDF
¿Qué hace un Data Warehouse Engineer blog.victorsantiz.com.pdf
PDF
sol tecnología 2025.pdf........pdf10-7grado
PPTX
Simulación de corriente paralela en LEDS PowerPoint
PPT
CONFIGURACIÓN DE PANTALLA DE UNA COMPUTADORA
PDF
Virus y otras amenazas _ Ciudadanía _ INCIBE.pdf
PDF
PLAN DE ASEGURAMIENTO CURSOS CORTOS 2024.pdf
PPTX
en este libro encontrarás la lectura inicial para tus niños
PDF
EL RESPETO mejororado para aprender .pdf
PDF
004-CC2014-Irrigacion Mbb equinos del mundo
PPTX
Redes neuronales artificiales y como entrenarlas
PPTX
TICs_en_la_vida_Cotidiana_tecnologiayMas
PDF
Estrategia de Apoyo Juan José Narvaéz 9-4
PDF
Sesión 6 - Seguridad de almacenamiento.pdf
PDF
Introducción a REALITY (agosto de 2024).pdf
DOCX
Simulación de corriente paralela en LEDS word
PDF
Conceptos básicos de programación PseInt laura.pdf
PDF
Estrategia de apoyo de tecnología 9-5 Daylin Castaño
DOCX
Conceptos básicos de programación PseInt laura.docx
PPTX
VariablesExpresiones.pptx conceptos que puedes usar en c++
conceptosbsicosdeprogramacinpseintlaura.pdf
¿Qué hace un Data Warehouse Engineer blog.victorsantiz.com.pdf
sol tecnología 2025.pdf........pdf10-7grado
Simulación de corriente paralela en LEDS PowerPoint
CONFIGURACIÓN DE PANTALLA DE UNA COMPUTADORA
Virus y otras amenazas _ Ciudadanía _ INCIBE.pdf
PLAN DE ASEGURAMIENTO CURSOS CORTOS 2024.pdf
en este libro encontrarás la lectura inicial para tus niños
EL RESPETO mejororado para aprender .pdf
004-CC2014-Irrigacion Mbb equinos del mundo
Redes neuronales artificiales y como entrenarlas
TICs_en_la_vida_Cotidiana_tecnologiayMas
Estrategia de Apoyo Juan José Narvaéz 9-4
Sesión 6 - Seguridad de almacenamiento.pdf
Introducción a REALITY (agosto de 2024).pdf
Simulación de corriente paralela en LEDS word
Conceptos básicos de programación PseInt laura.pdf
Estrategia de apoyo de tecnología 9-5 Daylin Castaño
Conceptos básicos de programación PseInt laura.docx
VariablesExpresiones.pptx conceptos que puedes usar en c++
Publicidad

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

Notas del editor

  • #6: 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.
  • #7: 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.
  • #53: 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).
  • #57: 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).