Nombres y Asociaciones Nombres vs. Objetos Lenguajes de Programación I Nombres y Asociación Ernesto Hernández-Novich <emhn@usb.ve> Copyright (c) 2007-2010 Nombres y Asociaciones Nombres vs. Objetos Definiciones Nombre Cadena alfanumérica mnemónica para denotar un elemento de interés. Indispensable para lograr la abstracción, objetivo de los lenguajes de programación. Asociación (Binding) Relación entre un nombre y el elemento que denota. Son creadas y destruidas según las decisiones tomadas por el diseñador. Nombres y Asociaciones Nombres vs. Objetos ¿Qué es el Momento de Asociación? Binding Time Momento de tiempo en el cual se establece la relación entre el nombre y el elemento denotado por este. Su duración depende de la decisión de diseño tomada. Asociación temprana, mejorará la eficiencia de ejecución. Asociación tardía, mejorará la flexibilidad de uso. Nombres y Asociaciones Nombres vs. Objetos Lo más temprano posible Al momento de Diseñar el Lenguaje (Language Design Time) Palabras reservadas. Tipos primitivos y sus constructores. Al momento de Implantar el Lenguaje (Language Implementation Time) Precisión para representar elementos. Disposición de elementos almacenados en memoria. Acoplamiento con el subsistema de I/O. Nombres y Asociaciones Nombres vs. Objetos Mientras se escribe el programa Al momento de Escribir el Programa (Program Writing Time) El Programador puede escoger los nombres de: Tipos y sus constructores. Variables. Funciones o Procedimientos. Módulos. Siempre y cuando no entren en conflicto con lo que decidieron Diseñador e Implantador. Nombres y Asociaciones Nombres vs. Objetos Mientras se produce el programa ejecutable Al momento de Compilar el Programa (Compile Time) Asociar construcciones de Alto Nivel con las equivalentes de Bajo Nivel – código ejecutable y datos. Generación de símbolos para asignar espacio de memoria. Al momento de Enlazar el Programa (Link Time) Resolver referencias entre módulos. Decidir la distribución final de memoria. Nombres y Asociaciones Nombres vs. Objetos Mientras se ejecuta el programa Al momento de Cargar el Programa (Load Time) Asignación de memoria física. Asignación de recursos adicionales. Al momento de Ejecutar el Programa (Run Time) Asociar valores a variables. Variables aparecen, reaparecen y desaparecen según el flujo de ejecución y anidamiento. Ejecutar funciones y procedimientos. Nombres y Asociaciones Nombres vs. Objetos Temprano vs. Tarde Asociación Temprana También llamada estática. Apunta hacia la eficiencia. Típica de los lenguajes compilados. Asociación Tardía También llamada dinámica. Apunta hacia la flexibilidad. Típica de los lenguajes interpretados. Nombres y Asociaciones Nombres vs. Objetos ¿Y el punto medio? Momentos de Asociación Temprana Diseño. Momentos de Asociación Tardía Ejecución. Implantación. Escritura. Compilación. Enlace. Carga. La frontera entre lo estático y dinámico es bastante difusa en algunos lenguajes. Nombres y Asociaciones Nombres vs. Objetos Diferentes tiempos, diferentes espacios Creación de Objetos. Creación de Asociaciones a Nombres. Uso de los objetos (variables, rutinas, tipos, etc.) a través de las Asociaciones a Nombres. Activación y reactivación de Asociaciones suspendidas temporalmente. Destrucción de Asociaciones a Nombres. Destrucción de Objetos. El período de tiempo entre la creación y la destrucción de una Asociación se denomina tiempo de vida (lifetime). Nombres y Asociaciones Nombres vs. Objetos Disposición de almacenamiento Memoria virtual asignada al proceso MAXADDR Espacio asignado al proceso por el sistema de operación. MAXMEM – dirección máxima posible según el CPU. 0 El programa sólo puede usar lo asociado. Nombres y Asociaciones Nombres vs. Objetos Mecanismos de Asignación de Almacenamiento El Tiempo de Vida define el Espacio Los Objetos Estáticos tienen una ubicación fija, absoluta, determinada a tiempo de compilación (o carga) y mantenida durante la ejecución del programa. Los Objetos en Pila son almacenados y removidos en la pila de ejecución en conexión con la invocación de subrutinas o bloques anidados. Los Objetos en Heap son almacenados y removidos arbitrariamente de forma implícita o explícita en conexión con la creación de variables dinámicas. Nombres y Asociaciones Nombres vs. Objetos Almacenamiento Estático ¿Cuáles son los objetos estáticos? Código ejecutable – en general, no puede modificarse. Variables globales. Constantes – explícitas e implícitas. Variables locales a subrutinas que deben preservar su valor entre invocaciones. Tablas de Símbolos para debugging y profiling. En lenguajes sin recursión, el espacio para subrutinas. Nombres y Asociaciones Nombres vs. Objetos Disposición de almacenamiento Espacio estático MAXADDR Tamaño fijo – calculado al compilar. TEXT sólo puede ejecutarse. DATA/BSS TEXT 0 DATA/BSS puede tener datos sin inicializar. Nombres y Asociaciones Nombres vs. Objetos Almacenamiento en Pila ¿Cuáles objetos aparecen y desaparecen según el flujo? En lenguajes con recursión, el espacio de trabajo para las subrutinas, denominado registro de activación Argumentos. Variables locales. Direcciones y valores de retorno. El programa ejecutable debe mantener la pila: El llamador debe respetar una secuencia de invocación antes de llamar a la subrutina. El llamado debe comenzar ejecutando el prólogo y finalizar con el epílogo. Los detalles (¡muchos!) los estudiaremos más adelante, ahora solamente interesa la idea general. Nombres y Asociaciones Nombres vs. Objetos Disposición de almacenamiento Pila de ejecución MAXADDR STACK Crece hacia las direcciones bajas. Tamaño limitado (sistema de operación). DATA/BSS TEXT 0 Instrucciones especiales (PUSH, POP,. . . ). Nombres y Asociaciones Nombres vs. Objetos Registro de Activación – Stack Frame A tiempo de compilación... Establece un apuntador base (frame o base pointer). Calcular desplazamientos relativos (offset) de cada objeto en relación al frame pointer. Generar código para acceder a los objetos utilizando el frame pointer como referencia. A tiempo de ejecución... Secuencia de llamada empila parámetros y salta a rutina. Prólogo establece valor concreto para frame pointer y mueve tope de la pila para reservar espacio local. Epílogo regresa tope de pila a la base y retorna. Nombres y Asociaciones Nombres vs. Objetos Registro de activación . . . el rastro de la ejecución ← SP locales ← BP Sub C MAXADDR BP (Base Pointer) – base de stack frame. Sub D argumentos SP (Stack Pointer) – tope de la pila. Locales – tienen offset negativo. Sub B Argumentos – tienen offset positivo. Sub A Cadena dinámica – ¿quién llamó a quién? Nombres y Asociaciones Nombres vs. Objetos Almacenamiento en Heap ¿Cuáles objetos aparecen y desaparecen arbitrariamente? Heap Región de almacenamiento en la cual pueden reservarse y liberarse bloques arbitrariamente. Requiere que el programa ejecutable cuente con una estrategia de manejo de memoria: Lista de Bloques Libres (Free List). Política para reservar bloques: First Fit. Best Fit. El programa emplea primitivas o funciones del lenguaje para reservar y liberar los bloques. Nombres y Asociaciones Nombres vs. Objetos Disposición de almacenamiento Completa MAXADDR STACK Crece hacia las direcciones altas. HEAP Crece en bloques grandes – sbrk en Unix. DATA/BSS Nunca se reduce – reutilización. TEXT 0 Nombres y Asociaciones Nombres vs. Objetos Fragmentación del Heap Memoria libre que no puedes usar Fragmentación Interna El objeto contenido no ocupa todo el bloque asignado. El espacio sobrante no puede utilizarse. Aparece cuando el tamaño de los bloques es fijo o no hay disponible uno que ajuste mejor. Fragmentación Externa No hay un bloque disponible que tenga el tamaño necesario para el objeto a almacenar. Hay muchos bloques pequeños que no son continuos. Nombres y Asociaciones Nombres vs. Objetos ¿Cuánto cuesta almacenar en el Heap? Eficiencia en espacio y tiempo Recorrer la Lista Libre es proporcional a su longitud. Pueden usarse varias Listas Libres cada una con bloques de tamaño diferente. Sistema de “panitas” (Buddy System). Sistema Fibonacci. Combinación de contigüos en ambos casos. Para reducir la fragmentación externa es necesario compactar el heap a intervalos regulares. Nombres y Asociaciones Nombres vs. Objetos Liberación de Espacio en el Heap Explícita. Simple de implantar con alguna instrucción primitiva en el lenguaje. Es el método más eficiente. Requiere que el programador identifique correctamente el momento en que el objeto debe destruirse... ...pero suelen equivocarse y ocurren errores por referencias colgantes o pérdida de memoria. Implícita. Conocida como recolección de basura (garbage collection). Complejo de implantar para minimizar el impacto sobre el tiempo de ejecución. El programador no necesita hacer nada. Prácticamente obligatorio en lenguajes interpretados y muy frecuente en lenguajes con Máquina Virtual. Nombres y Asociaciones Nombres vs. Objetos Disposición de almacenamiento Fallas accediendo a memoria MAXADDR STACK Your fault! HEAP DATA/BSS TEXT 0 Segmentation fault El programa accede a una dirección dentro de su espacio, pero sin asociación.