|
Tutorial C#
Common Language Runtime (CLR)
El Common Language Runtime (CLR)
es el núcleo de la plataforma .NET. Es el motor encargado de gestionar la
ejecución de las aplicaciones para ella desarrolladas y a las
que ofrece numerosos servicios que simplifican su desarrollo y favorecen
su fiabilidad y seguridad. Las principales características y servicios que
ofrece el CLR son:
- Modelo de
programación consistente: A todos los servicios y facilidades
ofrecidos por el CLR se accede de la misma forma: a través de un modelo de
programación orientado a objetos. Esto es una diferencia importante
respecto al modo de acceso a los servicios ofrecidos por los algunos
sistemas operativos actuales (por ejemplo, los de la familia Windows), en
los que a algunos servicios se les accede a través de llamadas a funciones
globales definidas en DLLs y a otros a través de objetos (objetos COM en
el caso de la familia Windows)
- Modelo de
programación sencillo: Con el CLR desaparecen muchos elementos
complejos incluidos en los sistemas operativos actuales (registro de
Windows, GUIDs, HRESULTS, IUnknown, etc.) El CLR no es que abstraiga al
programador de estos conceptos, sino que son conceptos que no existen en
la plataforma .NET
- Eliminación
del “infierno de las DLLs”: En la plataforma .NET desaparece el
problema conocido como “infierno de las DLLs” que se da en los sistemas
operativos actuales de la familia Windows, problema que consiste en que al
sustituirse versiones viejas de DLLs compartidas por versiones nuevas
puede que aplicaciones que fueron diseñadas para ser ejecutadas usando las
viejas dejen de funcionar si las nuevas no son 100% compatibles con las
anteriores. En la plataforma .NET las versiones nuevas de las DLLs pueden
coexistir con las viejas, de modo que las aplicaciones diseñadas para
ejecutarse usando las viejas podrán seguir usándolas tras instalación de
las nuevas. Esto, obviamente, simplifica mucho la instalación y
desinstalación de software.
- Ejecución
multiplataforma: El CLR actúa como una máquina virtual, encargándose
de ejecutar las aplicaciones diseñadas para la plataforma .NET. Es decir,
cualquier plataforma para la que exista una versión del CLR podrá ejecutar
cualquier aplicación .NET. Microsoft ha desarrollado versiones del CLR
para la mayoría de las versiones de Windows: Windows 95, Windows 98,
Windows ME, Windows NT 4.0, Windows 2000, Windows XP y Windows CE (que
puede ser usado en CPUs que no sean de la familia x86) Por otro lado
Microsoft ha firmado un acuerdo con Corel para portar el CLR a Linux y
también hay terceros que están desarrollando de manera independiente
versiones de libre distribución del CLR para Linux. Asímismo, dado que la
arquitectura del CLR está totalmente abierta, es posible que en el futuro
se diseñen versiones del mismo para otros sistemas operativos.
- Integración
de lenguajes: Desde cualquier lenguaje para el que exista un
compilador que genere código para la plataforma .NET es posible utilizar
código generado para la misma usando cualquier otro lenguaje tal y como si
de código escrito usando el primero se tratase. Microsoft ha desarrollado
un compilador de C# que genera código de este tipo, así como versiones de
sus compiladores de Visual Basic (Visual Basic.NET) y C++ (C++ con
extensiones gestionadas) que también lo generan y una versión del
intérprete de JScript (JScript.NET) que puede interpretarlo. La
integración de lenguajes esta que es posible escribir una clase en C# que
herede de otra escrita en Visual Basic.NET que, a su vez, herede de otra
escrita en C++ con extensiones gestionadas.
- Gestión de
memoria: El CLR incluye un recolector
de basura que evita que el programador tenga que tener en cuenta
cuándo ha de destruir los objetos que dejen de serle útiles. Este
recolector es una aplicación que se activa cuando se quiere crear algún
objeto nuevo y se detecta que no queda memoria libre para hacerlo, caso en
que el recolector recorre la memoria dinámica asociada a la aplicación,
detecta qué objetos hay en ella que no puedan ser accedidos por el código
de la aplicación, y los elimina para limpiar la memoria de “objetos
basura” y permitir la creación de otros nuevos. Gracias a este recolector
se evitan errores de programación muy comunes como intentos de borrado de
objetos ya borrados, agotamiento de memoria por olvido de eliminación de
objetos inútiles o solicitud de acceso a miembros de objetos ya
destruidos.
- Seguridad de
tipos: El CLR facilita la detección de errores de programación
difíciles de localizar comprobando que toda conversión de tipos que se
realice durante la ejecución de una aplicación .NET se haga de modo que
los tipos origen y destino sean compatibles.
- Aislamiento
de procesos: El CLR asegura que desde código perteneciente a un
determinado proceso no se pueda
acceder a código o datos pertenecientes a otro, lo que evita
errores de programación muy frecuentes e impide que unos procesos puedan
atacar a otros. Esto se consigue gracias al sistema de seguridad de tipos
antes comentado, pues evita que se
pueda convertir un objeto a un tipo de mayor tamaño que el suyo
propio, ya que al tratarlo como un objeto de mayor tamaño podría accederse
a espacios en memoria ajenos a él que podrían pertenecer a otro proceso.
También se consigue gracias a que no se permite acceder a posiciones
arbitrarias de memoria.
- Tratamiento
de excepciones: En el CLR todo los errores que se puedan producir
durante la ejecución de una aplicación se propagan de igual manera:
mediante excepciones. Esto es muy diferente a como se venía haciendo en
los sistemas Windows hasta la aparición de la plataforma .NET, donde
ciertos errores se transmitían mediante códigos de error en formato Win32,
otros mediante HRESULTs y otros mediante excepciones.
El CLR permite que excepciones
lanzadas desde código para .NET escrito en un cierto lenguaje se puedan
capturar en código escrito usando otro lenguaje, e incluye mecanismos de
depuración que pueden saltar desde código escrito para .NET en un determinado
lenguaje a código escrito en cualquier otro. Por ejemplo, se puede recorrer la
pila de llamadas de una excepción aunque ésta incluya métodos definidos en
otros módulos usando otros lenguajes.
·
Soporte
multihilo: El CLR es capaz de trabajar con aplicaciones divididas en
múltiples hilos de ejecución que pueden ir evolucionando por separado en
paralelo o intercalándose, según el número de procesadores de la máquina sobre
la que se ejecuten. Las aplicaciones pueden lanzar nuevos hilos, destruirlos,
suspenderlos por un tiempo o hasta que les llegue una notificación, enviarles
notificaciones, sincronizarlos, etc.
·
Distribución
transparente: El CLR ofrece la infraestructura necesaria para crear objetos
remotos y acceder a ellos de manera completamente transparente a su
localización real, tal y como si se encontrasen en la máquina que los utiliza.
- Seguridad
avanzada: El CLR proporciona mecanismos para restringir la ejecución
de ciertos códigos o los permisos asignados a los mismos según su
procedendecia o el usuario que los ejecute. Es decir, puede no darse el
mismo nivel de confianza a código procedente de Internet que a código
instalado localmente o procedente de una red local; puede no darse los
mismos permisos a código procedente de un determinado fabricante que a
código de otro; y puede no darse los mismos permisos a un mismo códigos
según el usuario que lo esté
ejecutando o según el rol que éste desempeñe. Esto permite asegurar
al administrador de un sistema que el código que se esté ejecutando no
pueda poner en peligro la integridad de sus archivos, la del registro de
Windows, etc.
- Interoperabilidad
con código antiguo: El CLR incorpora los mecanismos necesarios para
poder acceder desde código escrito para la plataforma .NET a código
escrito previamente a la aparición de la misma y, por tanto, no preparado
para ser ejecutando dentro de ella. Estos mecanismos permiten tanto el
acceso a objetos COM como el acceso a funciones sueltas de DLLs
preexistentes (como la API Win32)
Como se puede deducir de las
características comentadas, el CLR lo que hace es gestionar la ejecución de las
aplicaciones diseñadas para la plataforma .NET. Por esta razón, al código de
estas aplicaciones se le suele llamar código
gestionado, y al código no escrito
para ser ejecutado directamente en la plataforma .NET se le suele llamar código no gestionado.
Principal
|
|