You are on page 1of 50

Common Language Runtime

Dr. Diego Lz. de Ipia Gz. de Artaza

Common Language Runtime


EL Common Language Runtime es el ncleo de la plataforma .NET. Es el responsable de la gestin y ejecucin del cdigo compilado para la plataforma .NET (cdigo gestionado).

Common Language Runtime


Estos son algunos de los servicios y caractersticas que provee el CLR:
Integracin multilenguaje: El CLR permite integrar cdigo escrito en un lenguaje con cdigo escrito en otro (CLS) Depuracin y administracin de servicios: El CLR provee de los mecanismos necesarios para que los desarrolladores puedan depurar y administrar el cdigo gestionado.

Common Language Runtime


Gestin de memoria: El CLR, a travs de su servicio de recoleccin de basuras, es el responsable de recoger de memoria los objetos no referenciados (Garbage collector)

Common Language Runtime


Vamos a ver qu no es el CLR:
Las aplicaciones .NET no son interpretadas por una maquina virtual: El CLR compila el cdigo MSIL a cdigo mquina nativo. El CLR no est limitado a la plataforma Microsoft: Es tcnicamente posible portar el CLR a otras plataformas hardware, as como a otros SO.
Proyecto Mono: http://www.go-mono.com/

Anatoma de las aplicaciones .NET


Tenemos 3 entidades principales:
Ensamblado o Assembly que es la unidad principal de desarrollo de .NET. Mdulos o Modules que son los ficheros individuales que conforman un ensamblado. IL es el cdigo del programador que conforma el mdulo.

Anatoma de las aplicaciones .NET


Assembly o Ensamblado Manifest Module Metadata IL Tipos

Ensamblado o Assembly
Un ensamblado es una agrupacin lgica de uno o ms mdulos o ficheros de recursos (ficheros .GIF, .HTML, etc.) que se engloban bajo un nombre comn. Es la unidad de trabajo del CLR. Permiten abstraerse de la ubicacin fsica del cdigo o de los recursos.

Ensamblado o Assembly
Todo ensamblado contiene un manifiesto, que son metadatos con informacin sobre las caractersticas del ensamblado:
Identidad (nombre, versin...) Nombres de los ficheros del ensamblado Clave hash de todos los ficheros Detalles sobre los tipos definidos en el ensamblado (accesibilidad desde otros...) Nombres y hashes de otros ensamblados Permisos de seguridad Una lista de los tipos de datos exportados desde otros ficheros

Ensamblado o Assembly
Dos tipos de ensamblado:
Privados: Solo es usado por una aplicacin que se encuentra en la misma subcarpeta. Es el tipo que crea el compilador por defecto.
Tambin llamadas weakly named assemblies

Pblicos o compartidos: Son ensamblados creados para ser usados por cualquier aplicacin. Se almacenan en la cach global de ensamblado.
Deben ser strongly named (contiene la clave pblica y firma digital del que publica).

Ensamblado o Assembly
Ventajas de los ensamblados:
No hace falta instalacin.
Los ensamblados son auto-descriptivos (manifiesto).

Versionado.
Eliminan el infierno de las DLLs.

Ensamblados pblicos frente a registro a nivel de mquina.

Mdules o Modules
Los mdulos son ficheros que pueden ser de dos tipos:
ficheros o mdulos de recursos(ficheros.gif, .html, etc.). ficheros o mdulos de cdigo compilado(cdigo MSIL).

En la plataforma .NET se distinguen tres tipos de mdulos de cdigo compilado:


Ejecutables (ficheros.exe) . Libreras de enlace dinmico (ficheros.dll). Mdulos que conforman un ensamblado (ficheros.netmodule)

Mdules o Modules
Ambos ficheros contienen definiciones de tipos de datos y tan solo los primeros (ejecutables) tienen un punto de entrada a partir del que es posible ejecutar el cdigo. A ambos tipos de mdulos se les suele llamar ejecutables portables (PE), ya que su cdigo puede ser ejecutado por un CLR de cualquier plataforma siempre que se encuentren en un ensamblado (en estos momentos tan solo familia Windows).

Mdules o Modules
Un mdulo de cdigo compilado se compone de:
Cabecera de CLR que le informa de si es un mdulo gestionado, la versin del CLR que necesita, su firma digital... Los metadatos que son informacin sobre los tipos definidos en su cdigo. Cdigo MSIL.

Microsoft Intermediate Language (MSIL)


Todos los compiladores que generan cdigo para la plataforma .NET generan cdigo escrito en un lenguaje intermedio conocido como MSIL. De esta forma, MSIL es el nico cdigo que el CLR comprende.

Herramientas de la plataforma Csc.exe Vbc.exe

MSIL
MSIL facilita la ejecucin multiplataforma y la integracin entre lenguajes al ser independiente de la CPU. La CPU solo ejecuta cdigo nativo luego alguien tiene que encargarse de transformar este cdigo MSIL en cdigo nativo para la CPU.

MSIL
De esto se encarga un componente del CLR conocido como compilador JIT (Just-In-Time) o jitter que va convirtiendo dinmicamente el cdigo MSIL a ejecutar en cdigo nativo segn sea necesario. Este jitter se distribuye en tres versiones:
Normal Econmico Prejitter

Jitter Normal
Es el que se suele usar por defecto, y slo compila el cdigo MSIL a cdigo nativo a medida que va siendo necesario. As se ahorra tiempo y memoria al evitarse tener que compilar innecesariamente cdigo que nunca se ejecute.

Jitter Normal
El cargador de clases del CLR sustituye inicialmente las llamadas a mtodos de las nuevas clases que vaya cargando por llamadas a funciones auxiliares (stubs) que se encarguen de compilar el verdadero cdigo del mtodo. Una vez compilado, la llamada al stub es sustituida por una llamada directa al cdigo ya compilado, con lo que posteriores llamadas al mismo no necesitarn compilacin.

Jitter Econmico
Funciona de forma similar al jitter normal solo que no realiza ninguna optimizacin de cdigo al compilar sino que traduce cada instruccin MSIL por su equivalente en el cdigo mquina sobre la que se ejecute. Se utiliza en dispositivos empotrados con poca memoria y potencia de CPU. Aunque genere cdigo ms ineficiente es menor el tiempo y memoria que necesita para compilar.

Jitter Econmico
Para ahorrar memoria este jitter puede descargar cdigo ya compilado que lleve cierto tiempo sin ejecutarse y sustituirlo de nuevo por el stub apropiado. Por estas razones, este es el jitter usado por defecto en Windows CE, sistema operativo que se suele incluir en los dispositivos empotrados antes mencionados.

Prejitter
Permite compilar completamente cualquier ejecutable o librera (cualquier ensamblado en general) que contenga cdigo gestionado y convertirlo a cdigo nativo. De este modo posteriores ejecuciones del mismo se harn usando esta versin ya compilada y no se perder tiempo en hacer la compilacin dinmica.

Herramientas de la plataforma

Ngen.exe

Compilacin dinmica
La compilacin dinmica supone que la aplicacin se ejecute ms lentamente. Es una solucin ms eficiente que la utilizada en Java donde se interpreta cada cdigo. Permite que el jitter tenga ms informacin sobre la mquina que un compilador tradicional pudiendo optimizar el cdigo generado para ella (usando instrucciones para PentiumIV, registros extra...)

Metadatos del Mdulo


Los metadatos son un conjunto de datos organizados en forma de tablas que pueden almacenan informacin sobre:
Tipos definidos en el mdulo. Los miembros de estos tipos. Tipos externos a los que se hace referencia.

El compilador los genera automticamente al crear el mdulo.

Metadatos del Mdulo


Los metadatos de un mdulo pueden ser consultados a travs del espacio de nombres System.Reflection de la FCL. Tambin podemos aadir informacin adicional en los metadatos a travs de los atributos.

Integracin Multilenguaje
Una de las caractersticas avanzadas de la plataforma .NET es la integracin multilenguaje. Podemos integrar aplicaciones escritas en un lenguaje de la plataforma con cdigo escrito en otro lenguaje. Para ello vamos a ver dos conceptos fundamentales: CTS y CLS.

Common Type System (CTS)


El Common Type System (CTS) o Sistema de Tipo Comn es el conjunto de reglas que han de seguir las definiciones de tipos de datos para que el CLR las acepte. Aunque cada lenguaje gestionado disponga de sus propia sintaxis para definir tipos de datos, en el MSIL resultante de la compilacin de sus cdigos fuente se ha de cumplir las reglas del CTS.

Common Type System (CTS)


Algunos ejemplos de estas reglas son:
Cada tipo de dato puede constar de cero o ms miembros. Cada uno de estos miembros puede ser un campo, un mtodo una propiedad o un evento. No puede haber herencia mltiple, y todo tipo de dato ha de heredar directa o indirectamente de System.Object.

Clasificacin de tipos del CTS


Tipos
Valor Referencia

Predefinidos
De usuario

Punteros

Autodescriptivos

Interfaces

Clases De usuario Boxed

Arrays Delegados

Enumera ciones

Tipos del CTS


El CTS clasifica los tipos en dos bloques:
Por valor: Se almacenan en la pila. Todos los datos de tipo por valor descienden de System.ValueTypes el cul desciende de System.Object. Por referencia: Se almacenan en el Heap (montn de datos). Todos los datos de los tipos por referencia descienden directamente de System.Object.

Tipos por valor


Montn gestionado Montn gestionado Montn gestionado

Instancia

Pila

Pila

Pila

El CLR necesita crear una instancia de un tipo por valor

Se reserva memoria en la pila

Cuando se sale del mbito de la variable, su espacio de memoria se libera

Tipos por referencia


Montn gestionado Montn gestionado Montn gestionado

Instancia

Heap

Heap

Heap

El CLR necesita crear una instancia de un tipo por valor

Se reserva memoria en la pila

Cuando se sale del mbito de la variable, su espacio de memoria se libera

Valor vs. Referencia


Diferencias:
Liberacin de memoria:
Los tipos por referencia hay que eliminarlos explcitamente del montn (GC).

Asignacin:
La asignacin de tipos por referencia copia direcciones de memoria.

Comparacin de igualdad:
La comparacin de tipos por referencia compara direcciones de memoria.

.NET built-in types I


NET C# VB.NET IL Valor o Referen.

System.Boolean
System.Byte

bool
byte

Boolean
Byte

bool
unsigned int8

Valor
Valor

System.Char
System.DateTime System.Decimal System.Double System.Int16 System.Int32

char
decimal double short int

Char
Date Decimal Double Short Integer

char
float64 int16 int32

Valor
Valor Valor Valor Valor Valor

.NET built-in types II


NET C# VB.NET IL Valor o Referen.

System.Int64
System.Object

long
object

Long
Object

int64
Object

Valor
Reference

System.SByte
System.Single System.String System.UInt16 System.UInt32 System.UInt64

sbyte
float string ushort uint ulong

Single String -

int8
float32 string unsigned int16 Unsigned int32 Unsigned int64

Valor
Valor Reference Valor Valor Valor

.NET built-in types III


Como vemos CTS es un sistema de tipos independiente del lenguaje de programacin No todos los tipos son soportados en cada lenguaje, por ejemplo Date:
En esos casos se puede usar el tipo .NET directamente: System.DateTime d = System.DateTime.Now;

CLS define un subconjunto de tipos de CTS que pueden ser usadas cuando se definen libreras multi-lenguaje
Tipos no compatibles con CLS no son soportados por algunos lenguajes Importante aadir atributo CLSCompliant a cdigo para que el compilador verifique los tipos usados

Tipos personalizados
EL Common Type System no sera muy flexible si no permitiese al programador crear sus propios tipos de datos. Podremos definir tipos de datos personalizados tanto por valor como por referencia.

C# class y struct I
Generalmente creamos un tipo personalizado a travs de una clase:
public class Persona { public Persona(string nombre, string apellido1, int edad) { Nombre = nombre; Apellido1 = apellido1; Edad = edad; } public readonly string Nombre; public readonly string Apellido1; public readonly int Edad; public bool Equals(Persona temp) { if (temp.Nombre == this.Nombre && temp.Apellido1 == this.Apellido1 && temp.Edad == this.Edad) { return true; } else { return false; } } } ... Persona p = new Persona(Diego, Ipia, 29); Persona p1 = p; // p == p1 Persona p2 = new Persona(Diego, Ipia, 29); // p != p2

C# class y struct II
Podemos crear nuevos tipos por valor a travs de struct:
public struct Point { public Point(int x, int y) { this.x = x; this.y = y; } private int x; private int y; } ... Point p = new Point(10,20);

Concepto boxing/unboxing
Para asegurar que todo sea un objeto, .NET ofrece un tipo por referencia por cada tipo por valor
A esto se le denomina boxed type del tipo por valor int i = 123; object o = i; CLR crear un nuevo objeto conteniendo una copia de i en el heap, una referencia al objeto se guardar en o. int i = (int)o; Se generar InvalidCastException si se trata de hacer un unbox de un tipo incompatible v.Add(3); // se permite gracias al concepto de boxing v.Add(new Int32(3));

Para hacer un unbox de un tipo por referencia se usa casting:

System.Object
Es la clase base de la cual todos los tipos por referencia de .NET derivan Provee los siguientes mtodos:
Equals: verifica si dos instancias son iguales (implementacin por defecto evala igualdad por referencia) Finalize: ejecutado automticamente cuando un objeto es destruido. En c# este mtodo no aparece y se usa ~NombreObjeto como en C++ GetHashCode: produce un cdigo hash del objeto, usado para guardar un objeto en una HashTable GetType: devuelve el tipo de un objeto, posible a travs de capacidades de Metadata en .NET ReferenceEquals: verifica si dos instancias son idnticas ToString: devuelve una representacin en forma de string del objeto

Ejemplo System.Object
public class Pixel { public Pixel(byte x, byte y) { this.x = x; this.y = y; } private byte x; private byte y; public override string ToString() { // return (x,y) return ( + x + , + y + ); } public override bool Equals(object o) { try { Pixel p = (Pixel)o; return p.x == x && p.y == y; } catch (Exception) { return false; } } public override int GetHashCode() { return (x<<8) + y; } } ... Pixel p = new Pixel(200, 150); Console.WriteLine(p);

Common Language Specification (CLS)


Es un conjunto de reglas que han de seguir las definiciones de tipos que se hagan usando un determinado lenguaje gestionado si se desea que sean accesibles desde cualquier otro lenguaje gestionado. Forman un subconjunto del CTS.

Common Language Specification (CLS)


Slo es necesario seguir estas reglas en las definiciones de tipos y miembros que sean accesibles externamente, y no la en las de los privados. Si no importa la interoperabilidad entre lenguajes tampoco es necesario seguirlas.

Cdigo accesible
Para crear cdigo accesible a travs de otros lenguajes debemos hacer dos cosas:
Seguir las reglas definidas en la especificacin del CLS. Marcar el cdigo a compartir como compartible a travs del atributo CLSCompliantAttribute.

Ejemplos
Variable por valor y por defecto
Directorio: 2-ejemplovalorref

Interoperatibilidad
Directorio: 3-interoperabilidad

Creando un multi-file assembly

Multi-file Assembly
Vamos a crear un assembly que consiste de dos clases:
SimpleMath en VB.NET con mtodos Add y Substract ComplexMath en C# con mtodo Square

Fsicamente la assembly consistir de:


Simple.netmodule con SimpleMath Complex.netmodule con ComplexMath Math.dll que contiene el manifiesto

Multi-file Assembly
Pasos para crear la assembly:
1. 2. 3. 4. Crear Complex.cs (4-multifileassembly\Weak) Compilarlo: csc /target:module complex.cs Crear Simple.vb con: vbc /target:module simple.vb Crear una assembly con AL (Assembly Linker) como: al /target:library /out:Math.dll simple.netmodule complex.netmodule Crear MathDemo.cs Compilar MathDemo con: csc /target:exe /reference:math.dll mathdemo.cs Ejecutar mathdemo.exe

5. 6. 7.

You might also like