SlideShare a Scribd company logo
1 of 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

More Related Content

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

Resolución de problemas con java
Resolución de problemas con javaResolución de problemas con java
Resolución de problemas con java
diegocastro1234
 
Interpolación método de Lagrange
Interpolación método de LagrangeInterpolación método de Lagrange
Interpolación método de Lagrange
Kike Prieto
 

Similar to 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
 

More from Germán Küber

More from 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
 

Recently uploaded

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 

Recently uploaded (11)

Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 

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

Editor's Notes

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