17
El código intermedio Como ya se ha explicado, los compiladores de los lenguajes .NET no generan código binario para su ejecución directa en los sistemas. En su lugar se genera un código intermedio (Microsoft Intermediate Language o MSIL). Éste lenguaje es el que comprende el entorno de ejecución CLR y el que se encarga de traducir, a código binario (compilar), para el sistema en el que se esté ejecutando. Para ello dispone de dos opciones diferenciadas: Compilación instantánea o Just-In-Time: es la que realiza de forma automática el CLR y lanza la ejecución. Compilación bajo demanda : es de tipo incremental, es decir, sólo compila aquello que se utiliza, en lugar del programa completo. Esto optimiza el rendimiento ya que la mayoría de los usuarios sólo utilizan una pequeña parte del código de los programas y no todas las funcionalidades disponibles.

Framework .NET 3.5 04 El common language runtime

Embed Size (px)

Citation preview

Page 1: Framework .NET 3.5 04 El common language runtime

El código intermedioComo ya se ha explicado, los compiladores de los lenguajes

.NET no generan código binario para su ejecución directa enlos sistemas.

En su lugar se genera un código intermedio (MicrosoftIntermediate Language o MSIL).

Éste lenguaje es el que comprende el entorno de ejecuciónCLR y el que se encarga de traducir, a código binario(compilar), para el sistema en el que se esté ejecutando.

Para ello dispone de dos opciones diferenciadas:Compilación instantánea o Just-In-Time: es la que realiza

de forma automática el CLR y lanza la ejecución.Compilación bajo demanda: es de tipo incremental, es decir,

sólo compila aquello que se utiliza, en lugar del programacompleto. Esto optimiza el rendimiento ya que la mayoría delos usuarios sólo utilizan una pequeña parte del código de losprogramas y no todas las funcionalidades disponibles.

Page 2: Framework .NET 3.5 04 El common language runtime

Evidentemente, esto se ha planteado de esta forma paraque exista un entorno de ejecución CLR específico para cadatipo de procesador, pero una única versión de código MSIL.

Con lo que los desarrollos son totalmente independientes dela plataforma sobre la que vaya a ejecutarse posteriormente elcódigo, contrastando con los desarrollos anteriores.

Junto con el código MSIL, los compiladores generan, enfunción de lo que el desarrollador indica, los metadatos, queson la información complementaria al programa que elentorno necesita para poder gestionar la ejecución.

Estos metadatos y el código intermedio, junto con losrecursos adicionales que pueda requerir el proceso seempaquetan en lo que se conoce como ensamblados oAssemblies, por su nombre en Inglés.

Page 3: Framework .NET 3.5 04 El common language runtime

Además de las funcionalidades ofrecidas al desarrollo, hayuna nueva serie de ventajas enfocadas al entorno dedesarrollo que pasamos a comentar.

Para un mejor control de seguridad y aislamiento de losprocesos en ejecución, dentro de la máquina, el Frameworkdispone de los Application Domain o dominios de aplicación.Estos permiten, al margen de los beneficios ya comentados deseguridad y aislamiento, la ejecución concurrente de variasaplicaciones en un mismo proceso.

Hasta ahora, para gestionar el aislamiento, se ejecutaba unaúnica aplicación en cada proceso, lo cual reportaba evidentesbeneficios a la hora de separar los recursos utilizados por cadauna de ellas y evitaba las colisiones entre ellas a la hora derecurrir a ellos. Pero tenía unos graves problemas derendimiento cuando una de las aplicaciones en ejecución teníaque hacer referencias o llamadas a recursos o módulos de otrade las aplicaciones en ejecución.

Page 4: Framework .NET 3.5 04 El common language runtime

Ahora, con las técnicas utilizadas por el .NET Framework, esmuy fácil incluir varias aplicaciones de forma que se ejecutenconjuntamente en un mismo proceso, con lo cual el consumode recursos en las llamadas entre ellas se ven enormementereducidos, facilitando la programación orientada acomponentes, que más adelante se comentará en mayordetalle.

De todas formas, antes de lanzar una ejecución en undominio de aplicación, el Framework efectúa variasvalidaciones del código en cuanto a temas de seguridad,acceso a áreas de memoria, ejecución de operaciones delsistema que puedan provocar fallos,..etc. Cuando estásvalidaciones han pasado, el código es marcado como Type-Safe, es decir seguro a nivel de tipos, ya se ha comentado eltema de los tipos comunes del .NET Framework.

Page 5: Framework .NET 3.5 04 El common language runtime

Este tipo de arquitectura de ejecuciones permite los que seconoce como side-by-side execution, es decir, la ejecuciónconcurrente de distintas versiones de la misma aplicación ocomponente.

La ejecución de los dominios de aplicación, dentro del CLR,la llevan a cabo los Runtime-Hosts, o servidores de entorno,que no es más que una nueva denominación para los típicossub-sistemas de ejecución, como puedan ser el WindowsShell, para las aplicaciones de escritorio, el ASP.NET, paralas aplicaciones basadas en la Web o Internet Explorer, parala navegación por la red, entre otros.

Para el control del acceso a los recursos del sistema, el .NETFramework utiliza lo que denomina Access Control List oACL, las cuales pueden ser creadas o modificadas desdecódigo, ampliando las facilidades en la entrada y salida,gestión de hilos y manipulación del registro, permitiendo odenegando el acceso a los recursos del sistema.

Microsoft SQL Server™ Microsoft BizTalk™ Server Microsoft Host Integration Server Microsoft Exchange Enterprise Server Microsoft Application Center Microsoft Internet Security and Acceleration Server Microsoft Commerce Server Microsoft SharePoint™ Portal Server Microsoft Mobile Information Server Microsoft Content Management Server

Page 6: Framework .NET 3.5 04 El common language runtime

Namespace o Espacios de nombresYa hemos comentado que toda la funcionalidad ofrecida por

el .NET Framework a los lenguajes, al tiempo que utilizado porél mismo para su funcionamiento está ubicada en la libreríabásica de clases (Base Class Library o BCL).

Como hay varios miles de clases en esta librería, el tenerlastodas en línea sería totalmente inabordable, al menos para elcomún de los mortales.

La forma de evitar este lío es la organización de las mismasen los que se denomina Namespace o espacios de nombres.

Sólo es una denominación específica para una estructura enárbol, en la que las clases se van situando, agrupadas portemas específicos, con las necesarias subdivisiones porespecialidades, hasta llegar al último nivel de detalle.

Page 7: Framework .NET 3.5 04 El common language runtime

Para poder utilizar las clases incluidas en un Namespace deforma sencilla, es necesario declarar su utilización al principiodel módulo de código en el que se vaya a hacer uso de algunade sus clases. En Visual Basic esta operación se realiza con lapalabra clave Imports, en C# con la instrucción Usingaunque cada lenguaje utiliza una sintaxis específica para estatarea.

Esta declaración permite que hagamos referencia directa alnombre de la clase que deseemos utilizar, sin tener quecalificarla con su nombre completo, que sería el caso si nohubiéramos realizado la “importación” inicial.

Como ejemplo puede valer el siguiente. Para manejar un botón enun formulario se ha de utilizar la clase Button. Sin el espacio denombres, su nombre calificado completo seríaSystem.Windows.Forms.Button.

El uso de los espacios de nombres es el que habilita lareferencia automática del IntelliSense.

Page 8: Framework .NET 3.5 04 El common language runtime

Una funcionalidad que hasta ahora no teníamos disponiblees la de poder heredar de una clase del sistema, cosa que yase puede efectuar, al estar todas las clases de la BCL anuestra disposición, para su modificación o ampliación defuncionalidades.

Una de las ventajas de la organización de las clases delentorno en la BCL es que estas son externas a cualquierlenguaje y están, en cambio, disponibles para todos lossoportados, lo cual redunda en beneficio de losdesarrolladores y de la independencia del lenguaje, ya queesta característica, la “heredan” también nuestras propiasclases y cualquier clase que desarrollemos, sea con el lenguajeque sea, estará disponible para su consumo o utilización desdeuna función desarrollada con cualquier otro lenguaje de losincluidos en el entorno.

Algunas de los principales, o más usados, espacios denombres son los que a continuación se muestran.

Descripción servicio Espacio de nombres

Servicios básicos System.CollectionSystem.IOSystem.Threading

Interfaz de usuario System.Windows.FormsSystem.DrawingSystem.Web

Componentes disponibles System.ComponentModel

Acceso a datos System.DataSystem.XML

Manejo de ensamblados System.Reflection

Depuración System.Diagnostics

Configuración y metadatos System.ConfigurationSystem.Resources

Configuración regional e idiomas System.Globalization

Generación de código System.CodeDom

Lenguaje Microsoft.VisualBasic

Acceso al registro Microsoft.Win32

Microsoft.Aspnet.SnapinMicrosoft.Build.BuildEngineMicrosoft.Build.FrameworkMicrosoft.Build.TasksMicrosoft.Build.Tasks.Deployment.BootstrapperMicrosoft.Build.Tasks.Deployment.ManifestUtilitiesMicrosoft.Build.UtilitiesMicrosoft.CSharpMicrosoft.JScriptMicrosoft.SqlServer.ServerMicrosoft.VisualBasicMicrosoft.VisualBasic.ApplicationServicesMicrosoft.VisualBasic.CompilerServicesMicrosoft.VisualBasic.DevicesMicrosoft.VisualBasic.FileIOMicrosoft.VisualBasic.LoggingMicrosoft.VisualBasic.MyServicesMicrosoft.VisualBasic.MyServices.InternalMicrosoft.VisualBasic.VsaMicrosoft.VisualCMicrosoft.VsaMicrosoft.Vsa.Vb.CodeDOMMicrosoft.Win32Microsoft.Win32.SafeHandlesMicrosoft.WindowsCE.FormsMicrosoft.WindowsMobile.DirectXMicrosoft.WindowsMobile.DirectX.Direct3DMicrosoft_VsaVbSystemSystem.CodeDomSystem.CodeDom.CompilerSystem.CollectionsSystem.Collections.GenericSystem.Collections.ObjectModel

System.Collections.SpecializedSystem.ComponentModelSystem.ComponentModel.DesignSystem.ComponentModel.Design.DataSystem.ComponentModel.Design.SerializationSystem.ConfigurationSystem.Configuration.AssembliesSystem.Configuration.InstallSystem.Configuration.ProviderSystem.DataSystem.Data.CommonSystem.Data.DesignSystem.Data.LinqSystem.Data.Linq.MappingSystem.Data.OdbcSystem.Data.OleDbSystem.Data.OracleClientSystem.Data.SqlSystem.Data.SqlClientSystem.Data.SqlServerCESystem.Data.SqlTypesSystem.DiagnosticsSystem.Diagnostics.CodeAnalysisSystem.Diagnostics.DesignSystem.Diagnostics.SymbolStoreSystem.DirectoryServicesSystem.DirectoryServices.ActiveDirectorySystem.DirectoryServices.ProtocolsSystem.DrawingSystem.Drawing.DesignSystem.Drawing.Drawing2DSystem.Drawing.ImagingSystem.Drawing.PrintingSystem.Drawing.Text

System.EnterpriseServicesSystem.EnterpriseServices.CompensatingResourceManagerSystem.EnterpriseServices.InternalSystem.GlobalizationSystem.IOSystem.IO.CompressionSystem.IO.IsolatedStorageSystem.IO.PortsSystem.LinqSystem.Linq.ExpressionsSystem.ManagementSystem.Management.InstrumentationSystem.MessagingSystem.Messaging.DesignSystem.NetSystem.Net.CacheSystem.Net.ConfigurationSystem.Net.MailSystem.Net.MimeSystem.Net.NetworkInformationSystem.Net.SocketsSystem.ReflectionSystem.Reflection.EmitSystem.ResourcesSystem.Resources.ToolsSystem.RuntimeSystem.Runtime.ConstrainedExecutionSystem.Runtime.HostingSystem.Runtime.CompilerServicesSystem.Runtime.InteropServicesSystem.Runtime.InteropServices.ComTypesSystem.Runtime.InteropServices.CustomMarshalersSystem.Runtime.InteropServices.ExpandoSystem.Runtime.Remoting

System.Runtime.Remoting.ActivationSystem.Runtime.Remoting.ChannelsSystem.Runtime.Remoting.Channels.HttpSystem.Runtime.Remoting.Channels.IpcSystem.Runtime.Remoting.Channels.TcpSystem.Runtime.Remoting.ContextsSystem.Runtime.Remoting.LifetimeSystem.Runtime.Remoting.MessagingSystem.Runtime.Remoting.MetadataSystem.Runtime.Remoting.Metadata.W3cXsd2001System.Runtime.Remoting.MetadataServicesSystem.Runtime.Remoting.ProxiesSystem.Runtime.Remoting.ServicesSystem.Runtime.SerializationSystem.Runtime.Serialization.FormattersSystem.Runtime.Serialization.Formatters.BinarySystem.Runtime.Serialization.Formatters.SoapSystem.SecuritySystem.Security.AccessControlSystem.Security.CryptographySystem.Security.Cryptography.PkcsSystem.Security.Cryptography.X509CertificatesSystem.Security.Cryptography.XmlSystem.Security.PermissionsSystem.Security.PolicySystem.Security.PrincipalSystem.ServiceProcessSystem.TextSystem.Text.RegularExpressionsSystem.ThreadingSystem.TimersSystem.TransactionsSystem.Transactions.ConfigurationSystem.Web

System.Web.CachingSystem.Web.CompilationSystem.Web.ConfigurationSystem.Web.HandlersSystem.Web.HostingSystem.Web.MailSystem.Web.ManagementSystem.Web.MobileSystem.Web.ProfileSystem.Web.RegularExpressionsSystem.Web.SecuritySystem.Web.ServicesSystem.Web.Services.ConfigurationSystem.Web.Services.DescriptionSystem.Web.Services.DiscoverySystem.Web.Services.ProtocolsSystem.Web.SessionStateSystem.Web.UISystem.Web.UI.AdaptersSystem.Web.UI.DesignSystem.Web.UI.Design.MobileControlsSystem.Web.UI.Design.MobileControls.ConvertersSystem.Web.UI.Design.WebControlsSystem.Web.UI.Design.WebControls.WebPartsSystem.Web.UI.HtmlControlsSystem.Web.UI.MobileControlsSystem.Web.UI.MobileControls.AdaptersSystem.Web.UI.MobileControls.Adapters.XhtmlAdaptersSystem.Web.UI.WebControlsSystem.Web.UI.WebControls.AdaptersSystem.Web.UI.WebControls.WebPartsSystem.Web.UtilSystem.Windows.FormsSystem.Windows.Forms.ComponentModel.Com2Interop

System.Windows.Forms.DesignSystem.Windows.Forms.Design.BehaviorSystem.Windows.Forms.LayoutSystem.Windows.Forms.PropertyGridInternalSystem.XmlSystem.Xml.SchemaSystem.Xml.SerializationSystem.Xml.XPathSystem.Xml.XslSystem.Xml.Xsl.RuntimeSystem.Xml.Xsl

Page 9: Framework .NET 3.5 04 El common language runtime

El código administrado por el CLR obtiene lasfuncionalidades aportadas por el mismo, como pueden ser:

Integración de lenguajes.Pase de excepciones entre módulos, incluso de diferentes lenguajes.El control de seguridad ya mencionado, de tipos y acceso a recursos.

Pero para ello, los programas deben tener generados loscorrespondientes metadatos para que el CLR disponga de lasdescripciones de los tipos, las referencias y los miembroscomponentes de dicho código, los cuales han de seralmacenados junto con el propio código. En estos metadatosfigura la relación de todos los recursos utilizados por elmódulo, así como, en los casos pertinentes, las versionesespecíficas de los mismos necesarias para la correctaejecución del módulo. Lo cual permite que el CLR puedaefectuar el control necesario, antes de lanzar la ejecución delmódulo, de que todos los recursos necesarios están presentesy en la versión adecuada, evitando las interrupciones deproceso debidas a estos problemas.

Page 10: Framework .NET 3.5 04 El common language runtime

El colocar en los metadatos está información permite evitarel tener que situarla en el registro del sistema, facilitando laexistencia de varias versiones de las aplicaciones y la gestiónde las mismas.

EL CLR se encarga, dentro de la parte de administración dememoria, de gestionar la liberación de la memoria no utilizaday de los recursos que ya no se vayan a referenciar, despuésde haberlos colocados en ella al hacerse referencia a losmismos desde el código, dándosele el nombre de datosadministrados a todos los que entran en esta gestión.

Una de las ventajas adicionales del sistema del .NETFramework es que la instalación de las aplicaciones se ha vistograndemente facilitada, reduciéndose, en muchas ocasiones, auna simple copia de archivos, al estar toda la configuraciónnecesaria incluida en el propio paquete.

Page 11: Framework .NET 3.5 04 El common language runtime

El sistema de tipos comunes (CTS)

Los tipos son la forma de definir la representación de undato, sus métodos y propiedades.

El CTS define cómo definir, utilizar y administrar los tipos enel CLR.

Es uno de los fundamentos de la integración entrelenguajes, junto con la BCL.

Algunas de sus funcionalidades son:Establece las reglas a seguir por los lenguajes para poderintegrarse en tiempo de ejecución.Define el modelo de orientación a objetos utilizado portodos los lenguajes del FrameworkSienta las bases para que el CLR pueda ejecutar susfunciones de control de la seguridad de tipos.

Es decir, el CTS es quien establece cómo el CLR ha deadministrar el código en ejecución.

Page 12: Framework .NET 3.5 04 El common language runtime

Los ensamblados o Assemblies son el resultado denuestros esfuerzos en desarrollo, lo que producimos, desdeVisual Studio, para que se ejecute en los sistemas.

Contienen, evidentemente, el código compilado a lenguajeMSIL, los Metadatos y el manifiesto del ensamblado, quese comentará más adelante.

Con esta información, el CLR, en tiempo de ejecución,podrá efectuar sus validaciones de seguridad de tipos y accesoa recursos, sabrá que recursos debe preparar para laejecución y que versión de cada uno de ellos debe ubicar,sabrá que autorizaciones de acceso debe otorgar.

Los ensamblados pueden ser estáticos y dinámicos, siendolos dinámicos aquellos cuya ejecución se lanza directamente,sin haber sido guardados previamente, pudiendo guardarsetras la ejecución, pasando a ser estáticos a partir de esemomento. Es decir los ensamblados estáticos son aquellos quehan sido guardados en disco o directamente creados entiempo de desarrollo.

Page 13: Framework .NET 3.5 04 El common language runtime

Los ensamblados se pueden crear con diferentesherramientas, desde Visual Studio, con las herramientasespecíficas del SDK y desde el CLR con Reflection.Emit,entre otras. Aunque, como ya se ha comentado, al generar unnuevo proyecto desde Visual Studio ya es, automáticamente,un nuevo ensamblado.

Los ensamblados son la solución al problema habitual de lasnuevas versiones y de las DLLs compartidas. Ya no nosocurrirá que una nueva versión de una DLL machaque laversión anterior, con lo que dejaban de funcionar otrosprogramas. Ahora, al no estar registradas en el registro deWindows, no existe este problema. Cada versión de cada DLLestá listada dentro del manifiesto del o de los ensamblados alos que pertenece y estos son los que se encargarán deubicarla y recuperar la versión correcta para el ensamblado enejecución, ya que ahora se guardarán, normalmente, en elmismo directorio que el ejecutable y el resto de recursosnecesarios para su ejecución.

Page 14: Framework .NET 3.5 04 El common language runtime

Además de la ventaja anterior, que ya es enorme de por sí,los ensamblados son los que facilitan muchísimo la instalaciónde las aplicaciones, al ser auto-descriptivos, y tambiénpermiten facilitar la desinstalación de las aplicaciones, por losmismos motivos.

Los ensamblados están compuestos por varios elementos:

Manifiesto: contiene los metadatos del ensamblado, únicoelemento obligatorio.

Metadatos sobre los tipos contenidos en el ensamblado.

El código MSIL del módulo.

Recursos adicionales.Los ensamblados pueden ser de archivo único, cuando lo

colocamos todo en un único archivo por ser de pequeñotamaño, o de múltiples archivos, cuando vamos colocando losdistintos componentes del módulo en varios archivos.

Page 15: Framework .NET 3.5 04 El common language runtime

Esta última opción es la que se suele utilizar cuando estamosante aplicaciones bastante grandes o con muchasfuncionalidades diversas que los usuarios no utilizaránnecesariamente todas. Al estar en archivos separados, sefacilita su descarga, caso en acceso por la red, al nodescargarse un archivo hasta no ser referenciado desde elcódigo en ejecución.

Lo que está claro es que aunque el ensamblado sea demúltiples archivos, el manifiesto del mismo será único y seráel encargado de ir indicando en que archivo se encuentra cadamódulo requerido, debiendo ir en un archivo independientecuando se trate de un ensamblado de archivos múltiples.

Al ser los manifiestos relaciones de los recursos delensamblado, los módulos que lo componen no estáncompilados, por lo que pueden fácilmente ser reutilizadosdesde otros manifiestos en diferentes ensamblados,reafirmando la orientación a objetos y componentes delentorno.

Page 16: Framework .NET 3.5 04 El common language runtime

El manifiesto del ensamblado está compuesto por:Nombre del ensamblado, una cadena de caracteres con elnombre del ensamblado.Número de versión, principal y secundaria, revisión ycompilación, las que condicionan las compatibilidades controladasposteriormente por el CLR.Referencia a la cultura, información sobre idioma y otroselementos culturales que soporta el ensamblado.Información de nombre seguro, clave pública, si el ensambladotiene nombre seguro.Lista de ficheros, nombre y resumen de cada fichero de los queforman el ensamblado, siempre ubicados en el mismo directorio.Referencia de tipos, información usada por el entorno paralocalizar el código IL de cada uno de los tipos que contiene elensamblado.Ensamblados referenciados, lista de los ensamblados con losque el actual mantiene dependencias, plenamente identificados.

Los cuatro primeros elementos forman la identidad delensamblado.

Page 17: Framework .NET 3.5 04 El common language runtime

Recolección de basura (Garbage Collection):

El CLR utiliza el Garbage Collector para gestionar lamemoria que utilizan los tipos por referencia.

El Garbage Collector garantiza que un objeto se destruyeuna y sólo una vez y sólo cuando ya no sea utilizado.

El Garbage Collector ejecutará el contenido del métododestructor o Finalize que hayamos codificado para liberarrecursos utilizados por nuestro objeto.

El orden de ejecución de los destructores no puede sergarantizado.

No deben incluir código dependiente de tiempos ointervenciones de usuario.