Simplificando mucho las cosas para poder dar una definición corta y comprensible, podríamos decir que la plataforma .NET es un amplio conjunto de bibliotecas de desarrollo que pueden ser utilizadas con el objetivo principal de acelerar el desarrollo de software y obtener de manera automática características avanzadas de seguridad, rendimiento, etc...
En realidad, .NET es mucho más que eso, ya que ofrece un entorno gestionado de ejecución de aplicaciones, lenguajes de programación y compiladores, y permite el desarrollo de todo tipo de funcionalidades: desde programas de consola o servicios Windows, hasta aplicaciones para dispositivos móviles pasando por desarrollos de escritorio o para Internet.
El diagrama siguiente muestra los bloques conceptuales en los que se divide la plataforma .NET:
Aunque se trata de un esquema muy simplificado, ya que hay muchos otros componentes que se construyen por encima de esta base y forman también parte de la plataforma, es un esquema igualmente útil para entender qué es la plataforma y en qué "piezas" se basa.
CLR - Common Language Runtime
El CLR o Common Language Runtime es la parte de .NET encargada de ejecutar las aplicaciones desarrolladas para la plataforma:
El funcionamiento del CLR no es trivial, trabaja encima del sistema operativo para aislar a la plataforma de éste. Su funcionamiento es muy parecido, para entendernos, al hipervisor de una máquina virtual. Esto le permite ejecutar aplicaciones .NET multiplataforma. Hoy en día es posible desarrollar aplicaciones .NET para diversas plataformas, como por ejemplo Windows, iOS, Android o Linux.
El CLR nos garantiza también la seguridad de los tipos de datos, avalando que no se producen errores en la conversión de tipos en la ejecución de una aplicación .NET. Este aspecto y algunos otros vienen regulados por lo que se conoce el Common Type System (CTS) o Sistema Común de Tipos de datos.
El CTS define los tipos de datos de .NET y las construcciones de programación de los lenguajes que el CLR puede utilizar de forma adecuada y correcta. En otras palabras, el CTS es lo más parecido a las reglas de juego que permiten el correcto entendimiento entre diferentes lenguajes de programación y el propio entorno de ejecución de .NET.
Otra característica del CLR es la posibilidad de reutilizar porciones de código escritos en diferentes lenguajes. Esto es posible gracias a que todo el código, esté escrito en el lenguaje que esté escrito, debe utilizar las mismas "reglas de juego" de las que hablábamos antes, marcadas por el CLR.
Adicionalmente, el CLR se encarga también de gestionar la vida de los objetos, declaraciones y recursos a lo largo de la ejecución de una aplicación .NET. Esto se lleva a cabo a través de lo que se conoce como recolector de basura o garbage collector. Por lo tanto, a la hora de programar no debemos preocuparnos de reservar espacio de memoria para ejecutar nuestra aplicación .NET. Ni tampoco de liberar los recursos del sistema una vez finaliza la ejecución de la aplicación. El CLR se encarga de ello y nos exime de esta responsabilidad, facilitando el desarrollo enormemente frente a otros lenguajes "tradicionales" como C/C++.
Hoy día es indispensable hablar de ejecución de aplicaciones multi-hilo y multi-subproceso. La posibilidad de ejecutar varios procesos simultáneos dentro de una aplicación .NET es una tarea de la que se encarga también el CLR.
Por último, comentar que el CLR es también el responsable de garantizar la seguridad de ejecución de nuestras aplicaciones .NET.
En definitiva, el CLR es el encargado de gestionar la ejecución de una aplicación .NET. Debido a esta responsabilidad, a las aplicaciones de .NET se las conoce como aplicaciones "manejadas" o aplicaciones de código gestionado.
CLS - Common Language Specification
Al contrario que otros entornos, la plataforma .NET no está atada a un determinado lenguaje de programación. Ni tampoco favorece a uno determinado frente a otros. En la actualidad existen implementaciones para gran cantidad de lenguajes de programación que permiten escribir aplicaciones para esta plataforma.
Entre estos lenguajes de programación destacan Visual Basic ó C#, pero existen implementaciones muy variadas, como por ejemplo Cobol (¡Guau!).
Lo mejor de todo es que, como decíamos en el apartado anterior, cualquier componente creado con uno de estos lenguajes puede ser utilizado de forma transparente desde cualquier otro lenguaje .NET. Además, como ya se ha comentado también, es posible ejecutar el código .NET en diferentes plataformas y sistemas operativos.
La especificación del lenguaje común o CLS está formada por un conjunto de reglas que deben ser seguidas por las definiciones de tipos de datos. Así, dichos datos pueden interactuar desde una aplicación escrita en un lenguaje determinado con otra aplicación escrita en otro lenguaje diferente.
Entre estas reglas se encuentran: la definición de nomenclatura, la forma de definir los miembros de los objetos, los metadatos de las aplicaciones, etc... Una de las partes más importantes del CLS es la que se refiere a los tipos de datos.
Si alguna vez has programado la API de Windows o has tratado de llamar a una DLL escrita en C++ desde Visual Basic 6 por ejemplo, habrás comprobado lo diferentes que son los tipos de datos de VB6 y de C++.
Para evitar este tipo de problemas y poder gestionar de forma eficiente y segura el acceso a la memoria, el CLS define un conjunto de tipos de datos comunes (Common Type System o CTS) que indica qué tipos de datos se pueden manejar, cómo se declaran y se utilizan éstos y de qué forma se deben gestionar durante la ejecución.
BCL - Base Class Library
La BCL está formada por bibliotecas o APIs especializadas que pueden ser utilizadas por todos los lenguajes de programación de la plataforma .NET.
Cada una de estas bibliotecas puede contener a su vez numerosas clases que aglutinan varios métodos y funciones con características concretas.
De esta manera, podemos encontrar bibliotecas con funcionalidades para casi cualquier cosa que necesitemos: enviar correos electrónicos, escribir archivos de texto, acceder a fuentes de datos, manejar información, criptografía, etc...
De hecho, lo más complicado al empezar con la plataforma .NET es navegar entre el mar de funcionalidad escondido en la BCL y aprender dónde se encuentran las principales utilidades.
En el esquema simplificado de la plataforma que hemos utilizado hasta ahora, estaría situado en la zona marcada en rojo a continuación:
En este diagrama tan simple solo vemos una parte mínima de la BCL. En un esquema un poco más amplio, podemos ver cómo, sobre la BCL, se han ido añadiendo nuevos grupos de funcionalidades en las diferentes versiones de .NET:
Dentro de la BCL, como se desprende de las imágenes anteriores, es posible encontrar numerosas clases diferentes, agrupadas organizativamente en lo que se denomina espacios de nombres o namespaces.
Un espacio de nombres no es más que un identificador que permite organizar, de modo estanco, las clases que estén contenidas en él, así como a su vez otros espacios de nombres.
Una (muy) pequeña muestra de éstos sería la siguiente:
Toda la funcionalidad que ofrece la plataforma .NET de serie, sin necesidad de instalar nada de terceras partes, es lo que se conoce como BCL. La BCL es el corazón funcional de .NET. Es lo que nos facilita enormemente el desarrollo puesto que ofrece miles de funcionalidades listas para ser utilizadas: ¿Quieres escribir un archivo a disco? Hecho. ¿Enviar un correo electrónico? Deseo concedido. ¿Acceder a una base de datos remota o a un servicio web? También puedes hacerlo sin dejar la base de la plataforma. Hay literalmente miles de funcionalidades disponibles.
En resumen
La plataforma .NET está formada por una serie de componentes que, en conjunto, permiten la creación de todo tipo de aplicaciones en todo tipo de sistemas operativos y utilizando todo tipo de lenguajes de programación.
Una de las principales dificultades a la hora de aprender .NET es saber por dónde empezar: ofrece tantas cosas que es complicado discernir qué es importante y qué no lo es tanto. Es muy tentador arrancar con unas cuantas "recetas" que te enseñan a hacer cuatro cosas. Pero eso es una receta para el desastre pues no se comprenderá bien qué se está haciendo ni qué hay por debajo.
Aprender .NET bien supone conocer primero una serie de fundamentos, comunes a toda la plataforma, y que te servirán para cualquier lenguaje que uses en el futuro. La curva de aprendizaje se parece a algo así:
Es decir, al principio se va lento, pero luego, de repente, se avanza muy rápido. El motivo es que son muchos conceptos y técnicas de base que es necesario dominar, pero una vez lo consigas, especializarse y aprender cualquiera de las múltiples bibliotecas especializadas (desarrollo web, para móviles, etc...) es mucho más fácil. Es tentador empezar la casa por el tejado y aprender antes alguna de éstas, pero a medio plazo es un error. Sin comprender bien antes los fundamentos, construiremos una casa sin cimientos, y ante la primera dificultad se puede caer.
¿Quieres empezar una casa bien cimentada? Y ¿qué tal ir un paso más allá?