Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Diapositiva 1 _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 2 Front-end: del lenguaje de alto nivel al lenguaje intermedio Back-end: del lenguaje intermedio al código binario Arquitecturas de traducción Código intermedio (ensamblador, p-code, byte-code, etc.) _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 3 Proceso de traducción Análisis lexicográfico Análisis sintáctico Análisis semántico Generador de código Código fuente Código “tokenizado” Árboles sintácticos Árboles decorados Código de máquina G3. AEF. Tokenización G2. AP. Árboles Formales e informales. Comportamientos. Estáticas y dinámicas. Optimización z := (2*a*y+b)*(2*a*y+c) t := 2*a*y; z := (t+b)*(t+c); for (k = 1; k < a + b; k++) x = k * b t = a + b; for (k = 1; k < t; k++) ¿Compilado? ¿Interpretado? ¿Pseudo-compilado? ¿Errores semánticos? _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 4 Compilador nativo Análisis lexicográfico Análisis sintáctico Análisis semántico Optimización Enlace (linker) tokens árboles intermedio objeto programa Generación de código máquina Código objeto (bibliotecas estáticas) Código objeto (bibliotecas dinámicas) ejecutable Tabla de símbolos Nombre Token asociado Información de tipo Alcance Dirección Inicialización … _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 5 Traductor de un paso Análisis lexicográfico Análisis semántico Análisis sintáctico Tabla de símbolos Generador caracteres código objeto ejecutable errores Facilidad de uso Aplicaciones sencillas Poca optimización Traducción rápida Etapas de análisis y generación unificadas Código objeto ineficiente Gestión de errores U1 _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 6 Intérprete puro Tabla de símbolos Evaluador instrucciones número siguiente instrucción caracteres etiqueta resultado de la ejecuciónerrores Número de instrucción Facilidad de uso Permiten interactuar con el estado del programa Sin optimización Analizan y ejecutan un enunciado por vez Las instrucciones se Numeran o etiquetan Requieren de un entorno para ejecutar datos Traductor a representación interna … instrucción … Gestión de errores _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 7 Pseudocompilador o intérprete parcial Traductor caracteres resultado de la ejecución Código intermedio datos errores Lenguajes modernos Traducen a un pseudo- código de máquina (por ej. P-code, byte- code, …) Multiplataforma Intérprete por software o hardware Requieren intérprete para la ejecución (VM), pero es muy pequeño Código de máquina Just-in-time compiler Intérprete _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 8 Compiladores e Intérpretes Pre-procesador Analizador (léxico y sintáctico) Compilador Código de máquina Programa fuente Árbol de análisis Código ensamblador Enlazador Traductor Intérprete Intérprete parcial Programa Byte code Compiladores e intérpretes tienen similares front-end pero diferentes back-end Entorno de ejecución _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 9 Semántica de enunciados • Características – Enunciado vs. Operador – Múltiple – Inputs. Pasaje de argumentos. Retorno de valores – inicialización vs. Asignación <bloque> ::= <delimitador> { <enunciado> <separador> }* <delimitador> | <enunciado> <asignación> ::= <variable> <asignador> <expresión> <enunciado> ::= <declarativo> | <asignación> | <control> | <I/O> bifurcación, repetición, llamada a subrutina, salto _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 10 Semántica de enunciados • Características – Doble – Múltiple – Selector de casos – Opción de descarte – Esquemas de anidamiento – Transferencia incondicional – Rótulos <bifurcación> ::= si <expr_lógica> entonces <bloque> <bifurcación> ::= si <expr_lógica> entonces <bloque> sino <bloque> _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 11 Semántica de enunciados • Características – Esquemas de anidamiento – Ciclos finitos e infinitos – Modificación interna de parámetros – Evaluación inicial y final <iteración> ::= mientras <expr_lógica> hacer <bloque> <iteración> ::= repetir <bloque> hasta <expr_lógica> <iteración> ::= para <inicial> hasta <final> [<incremento>] hacer <bloque> _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 12 Implementación Direcciones de memoria Abstracción mediante variables Descriptores (conjunto de atributos) Estáticos -nombre -tipo -dirección -valor -tiempo de vida -alcance Dinámicos … -tipo -dirección -valor -tiempo de vida -alcance Almacenamiento binario Formatos Semántica de datos Dato Descriptor y Dato DatoDescriptor _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 13 Declaración de variables • Modelo imperativo: genera tres objetos • Modelo declarativo: genera dos objetos nombre ubicación valor nombre valor Vinculados al ingresar al ámbito de existencia Vinculados mediante la asignación A FFA0 9B76 21 A 21 Vinculados en el momento de la invocación Sea: int A; A = 21; _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 14 Implementación de datos Los objetos de datos siempre son de algún tipo, lo que implica que tienen asociados • Valores • Operaciones (f: tipo x tipo � tipo) • Representación de su almacenamiento Equivalencia de tipo • Estructural • Por nombre (alias) Verificación • Calcular o inferir tipos y validar expresiones • Estática o dinámica Variables vs. Constantes • Segmento de datos vs. segmento de código Primitivos • Atómicos sin estructura interna compleja • Operaciones implementadas por hardware _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 15 Tipo Escalar Ordinal Estándar Entero Carácter Lógico Definido x usuario Enumerado Sub-rango No-ordinal Real Punto fijo Punto flotante Puntero Estructurado Arreglo Cadena Registro Archivo Sistema general de tipos _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 16 El tipo entero • Formato de representación – Tipo entero (máximo 2n-1 - 1 y mínimo -2n-1) – Negativos por complemento 2 – Tamaños habituales con/sin signo 1, 2, 4, 8 bytes – Operaciones más simples que los flotantes • Rango con signo: -2147483648 a +2147483647 -2147483648 10000000 00000000 00000000 00000000 2147483648 10000000 00000000 00000000 00000000 • Rango sin signo: 0 a 4294967295 2147483648 10000000 00000000 00000000 00000000 -1 11111111 11111111 11111111 11111111 4294967296 00000000 00000000 00000000 00000000 4294967295 11111111 11111111 11111111 11111111 _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 17 El tipo real • Características – Flotante estándar representado con 32 bits – Punto flotante (IEEE 754) – No exactos (simple y doble precisión) – Tamaños habituales 4, 8 bytes – Operaciones más lentas que los enteros • Formato de representación (-1)S * 2 (E – B) * (1 + (M/2N)) donde 0 <= M < 1 N cantidad de bits para M (23 or 52) B es 127 (32-bits) o 1023 (64-bits) _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 18 Implementación de la semántica del tipo real • Valores particulares E=255, M <> 0 � inválido E=255, M = 0 � infinito 0<E<255 � 2{E-127}*(1+(M/ 223)) E=0, M <> 0 � 2 -126 *(M / 223) E=0, M=0 � 0 Ejemplos de flotantes de 32 bits 0.3333333333333333 0 01111101 01010101010101010101011 0.3; 0 01111101 00110011001100110011010 Reconstruido: 0.3000000119209289600 Ejemplo 1.0 0 01111111 00000000000000000000000 • Comparaciones erróneas: == o != Solución: establecer un e = 0.001 (x - 3.0) < e || (3.0 - x) < e _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 19 Implementación de otros tipos • Sólo positivosEnteros sin signo • Precisión exacta • Almacenamiento poco eficiente Ej. 1234.567 => 1234567 con S=3 • Cantidad de decimales fija Decimal o punto fijo • 1 bit o 1 byteLógico • ASCII (1 byte) • UNICODE (2 bytes) Carácter En C/C++ los operadores &&, ||, ! están asociados a los tipos numéricos En C/C++ se trata como un tipo numérico _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 20 Tipo de datos puntero Características 1. Tamaño puntero vs. objeto apuntado 2. Información de tipo asociada 3. Restricciones de dónde apuntar 4. No son un enteros • dirección de memoria Puntero • valor Objeto de dato Operaciones 1. Asignar una dirección de memoria 2. Obtener una dirección de memoria 3. Referenciar una dirección de memoria 4. Comparar direcciones de memoria 5. Aritmética de punteros 6. Uso de cast _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 21 A y B variables puntero: A B A: A: B: B: A una variable puntero a puntero y B puntero: A B A: B: Asignación de punteros 7.2 0.4 0.4 7.2 _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 22 Uso de punteros en C/C++ 30 x (250) 12 250 x = 12; y = &x; z = *y + 5; 17 *y = 30; *y (254) z (258) int x, *y, z; Nombres Direcciones Valores * Indica que la variable es un puntero que guardará un valor de dirección de memoria & obtener el valor de la dirección de memoria de la variable * a la derecha de la asignación Recuperar el valor apuntado por la variable puntero * a la izquierda de la asignación Guardar valor en el lugar indicado por el puntero Operadores * y & siempre se colocan a la izquierda de una variable _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 23 Conceptos sobre tipos de datos • Sistema de tipos – Mecanismo para definir tipos – Conjunto de reglas para determinar • Equivalencia • Compatibilidad • Inferencia • Verificación de tipos (type checking) – Violación de la reglas (type clash) – Lenguajes fuertemente tipeados • Tipos estáticos – Lenguajes débilmente tipeados • Tipos dinámicos + - JS Ada Java / C# C/C++ ASM Fortran _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 24 Conceptos sobre tipos de datos • Conversión de tipos – Implícita = Coerción – Explícita = cast (molde) – Pérdida de datos (desbordamiento de la máscara de bits) – Pérdida de precisión (truncamiento y redondeo) • Polimorfismo – Un mismo operador aplicado a diferentes tipos • Subtipos – A es subtipo de B � A ⊂ B – Mismo conjunto de operaciones y formato de representación – Dominio de valores diferente _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 25 Operadores y Expresiones • Operadores – Precedencia – Asociatividad – Sobrecarga • Caracter – tratamiento como enteros • Cadena – tipo predefinido – arreglos • Relacionales y lógicas – evaluación x cortocicuito • Aritméticas – errores de redondeo vs. truncamiento (desbordamiento) – bit de signo Tabla de jerarquía/asociatividad en C I-D () [] -> . D-I ++ -- + - ! ~ (tipo) * & sizeof I-D * / % I-D + - I-D << >> I-D < <= > >= I-D == != I-D & I-D ^ I-D | I-D && I-D || D-I ?: D-I = += -= *= /= %= &= ^= |= <<= >>= I-D , Sean int a, *b, Z = 1, X = 4, Y = 2; a = 4; b = &a; Árbol de expresión ++*b vs. *++b ++Z * Z++ Z + (Y == 0 ? X : X / Y) _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 26 Tipos estructurados Grupo de datos del mismo o diferentes tipos Homogéneos Arreglos U n id im en si o n al es M u lt id im en si o n al es En u m er ad o s Heterogéneos Registros C am p o s d e b it s U n io n es A rc h iv o s Listas Li n ea le s A n ill o s Á rb o le s G ra fo s _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 27 Implementación del tipo cadena Estático Longitud fija Longitud variable c/ límite Longitud variable s/ límite Longitud fija c/ delimitador _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 28 Arreglos unidimensionales • Características Dimensión: Entero > 0 Sub => L1 ≤ Sub < L1 + Dim • Cálculo de direcciones int x[8]; L-value: x[5] = 15; L-value y R-value: x[2] = x[5]; L-value(x[k]) => DB + k * tTipo • Subíndices con rango Sea x[L1..U1] : TIPO donde L1 = 2 y U1 = 9 Espacio = (U1 - L1 + 1) * tTipo L-value(x[k]) => DB + (k – L1) * tTipo = (DB – L1 * tTipo) + k * tTipo L-value(x[k]) => OV + k * tTipo Conjunto homogéneo de datos gestionado como un bloque Suponemos enteros de 2 bytes _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 29 Arreglos bidimensionales Características Dimensiones: Entero > 0 Subíndices => L1 ≤ Sub1 < L1 + Dim1, L2 ≤ Sub2 < L2 + Dim2 Tamaño: Dim1 * Dim2 * tTipo Cálculo de direcciones int x[4][3]; x[2][1] = 7; L-value(x[i][j]) => DB + i * D + j * tTipo D = dimensión_columna * tTipo 0 1 2 0 1 2 7 3 … … _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 30 Arreglos bidimensionales Subíndices con rango A[L1:U1, L2:U2] : TIPO Espacio = (U2 - L2 + 1) * (U1 - L1 + 1) * tTipo D = (U2 - L2 + 1) * tTipo D = cte L-value(A[i, j]) = DB + D * (i - L1) + tTipo * (j - L2) DB + D * i – L1 * D + tTipo * j – L2 * tTipo OV = DB - L1 * D - L2 * tTipo L-value(A[i, j]) = OV + D * i + tTipo * j 2 3 4 -1 0 1 2 X : array [-1..2, 2..4] of byte Tamaño: (4 – 2 + 1) * (2 - (-1) + 1) * 1 � 3 * 4 * 1 � 12 bytes D: (4 – 2 + 1) * 1 � 3 OV: 100 - (-1) * D – 2 * 1 � 100 + 1 * 3 – 2 * 1 � 100 + 3 – 2 � 101 X[1,4]: 101 + 1 * 3 + 4*1 � 108 … … [-1,2] [1,4][-1,4] [0,2] _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 31 Implementación general Almacenamiento a) Estático (datos conocidos en la compilación: D, Tt y VO) int N = 5; float v[N]; for (int i = 0; i < N; i++) v[i] = i + 1; b) Dinámico var v = [0]; for (i = 0; i < 5; i++) v[i] = i + 1; _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 32 Arreglos tridimensionales Subíndices con rango A[L1:U1, L2:U2, L3:U3] : TIPO D1 = (U2 – L2 + 1) * (U3 – L3 + 1) * tTipo D2 = (U3 –L3 + 1) * tTipo D3 = tTipo Espacio = (U3 – L3 + 1) * (U2 - L2 + 1) * (U1 - L1 + 1) * tTipo L-value(A[i, j, k]) = DB + D1 * (i - L1) + D2 * (j - L2) + k * D3 L-value(A[i, j, k]) = DB + D1 * i – D1 * L1 + D2 * j – D2 * L2 + k * D3 OV = DB – L1 * D1 – L2 * D2 – L3 * D3 L-value(A[i, j, k]) = OV + i * D1 + j * D2 + k * D3 i j k _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 33 Arreglos n-dimensionales Arreglo n-dimensional con rangos A[L1:U1, ..., Ln:Un] Tamaño de cada dimensión Di Dn = tTipo Para i = n – 1 hasta 1 hacer Di = (Ui+1 – Li+1 + 1) * Di+1 OV = DB - Σni=1 (Li * Di) Acceso a un elemento A[s1, ..., sn] = OV + Σ n i=1 (si * Di) Hipercubo Ejemplo para 3 dimensiones: D3 = tTipo D2 = (U3 – L3 + 1) * tTipo D1 = (U2 – L2 + 1) * (U3 – L3 + 1) * tTipo _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 34 Gestión de arreglos • Slices – Se agregan descriptores Ejemplo Fortran 90: A(3, :) = B(7:15) • Asociativos – Acceso a datos sin un orden fijo – Nombres como subíndices – Implementación con descriptor Ejemplo JS var items = {"tucuman": 12, "cordoba": 19, "salta": 21, "jujuy": 31, "merlo": 47, "catamarca": 51, "mendoza": 61, "rosario": 73, "corrientes": 88}; listString = ""; for (var word in items) listString += items[word] + ", "; alert(listString); _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 35 #include <iostream> using namespace std; int ctos; int totalizar(int *v){ int i, s = 0; for (i = 0; i < ctos; i++) s += v[i]; return s; } int main(){ int *nros, total, k; cin >> ctos; nros = new int [ctos]; for (k = 0; k < ctos; k++) cin >> nros[k]; total = totalizar(nros); cout << total; delete nros; } global 400 ctos 400 heap 300 300 304 308 stack 100 v i s 210 214 218 nros total k 100 104 108 Mapa de memoria de datos 3 300 46 0 300 0 0 21 9 16 123 211 302 463 _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 36 Stack vs. Heap • Almacenamiento dinámico • Ámbito de referencia • Tiempo de vida del objeto de dato void main() { char *s, *q, t[5]; s = (char *)malloc(9); strcpy(t, "dos"); strcpy(s, "uno"); strcat(s, t); q = s; free(s); ... puts(q); } *s *q t heap stack � � � � � � d o s \0 u n o \0u n o d o s \0 � int pop(int stac[], int *t) { int poped; if ((*t) == -1) { return(0); } else { poped = stac[*t--]; return poped; } } stack o heap _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 37 Gestión del Heap Estados posibles de celdas Libre: sin referencias y marcada libre Ocupada: con referencias y marcada ocupada Basura: sin referencias y marcada ocupada Colgada: con referencias y marcada libre Asignación bloques Tamaño único Tamaño variable Métodos de reclamo de “basura” Contador de referencias Recolección de basura _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva38 Llaves y cerraduras Debe usar contador de referencias para garantizar el no dejar referencias colgadas Deben coincidir los valores de lock y key Al desalojar objeto, coloca un nulo en lock Complejidad en tiempo: - comparación de cerraduras y llaves en cada acceso Uso de espacio: - espacio extra para las cerraduras en cada apuntador y objeto del heap Lápidas y tumbas Debe usar contador de referencias para garantizar el no dejar referencias colgadas El apuntador contiene la dirección de la lápida y esta la del objeto Al liberar objeto, se asigna en la lápida un nulo Complejidad en tiempo: - creación de lápidas cuando se alojan objetos - chequear validación en cada acceso - doble indirección para acceso Uso de espacio: - espacio extra para las lápidas - nunca desalojar lápidas o poner contador de referencia a cada lápida Técnicas para evitar “dangling” _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 39 Enumeraciones enum Color {Rojo, Verde, Azul}; enum OtroColor {otroRojo = 3, otroVerde = 2, otroAzul = 2}; enum Color x = Verde, z = Azul; enum OtroColor y; x = x + 1; x = z - x; y = otroAzul - otroVerde; Se define un nombre para cada valor Símbolos asociados a números enteros No son cadenas Valores de la enumeración inicializados No soportan I/O _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 40 Registros struct AUTO { char marca[10]; float precio; unsigned modelo; char t; } miAuto; struct PERSONA { unsigned int DNI; char nombre[20]; struct FECHA { unsigned int d; unsigned int m; unsigned int a; } nacido; }; struct PERSONA el, ella; � Estructura y alineación � Tamaño � Referencia a miembros � Direcciones de memoria � Asignaciones � Punteros a miembros miAuto marca precio modelo t 10 4 4 1 19 bytes _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 41 Implementación de registros struct Alumno { unsigned int legajo; char nombre[20]; unsigned long dni; }; struct Alumno x, *p; x.legajo = 24567; strcpy(x.nombre, “Juan”); x.dni = 30768435; p = &x; Alumno 3 legajo unsigned int dirección nombre char[20] dirección dni unsigned long dirección 24569 “Juan” 32456987 Conjunto heterogéneo de datos gestionados como un bloque struct { char *s; int n; float m[10]; } v[12]; array (v) 12 struct pointer (s) char int (n) array (m) 10 float _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 42 Uniones �Espacio de almacenamiento compartido por diferentes campos de datos �Espacio asignado según el campo de mayor tamaño �Peligro: almacenar por uno de los campos y luego recuperar por otro �Normalmente vinculados a un valor ‘discriminante’ … operacion[17] … … venta tipo … a cuotas valor b monto chq |----------------------- 6 -----------------------|---1---| struct LEASING { unsigned short int cuotas; float valor; }; struct CONTADO { float monto; char chq; }; union MODO { struct LEASING a; struct CONTADO b; }; typedef char ID; struct VENTA { MODO venta; ID tipo; } operacion[100]; _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 43 Campos de bits struct FECHA { unsigned short int dia : 5; unsigned short int mes : 4; unsigned short int anio : 7; } ingreso; ingreso.dia = 19; // 10011 ingreso.mes = 27; // 11011 ingreso.anio = 7; // 111 � Espacio de almacenamiento fraccionado en bits � Todos los campos del mismo tipo de entero sin signo � Tamaño múltiplo según el tipo de entero aplicado � Campos no accesibles mediante punteros � Soportan operaciones de I/O _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 44 Archivos Operaciones Apertura Acceso Modo Secuencial Modo Directo Modo Indexado Lectura Escritura Cierre Almacenamiento • Persistente (discos, pendrivers, CD, DVD, etc.) • S.O. usa buffers para I/O Formato • Texto (secuencia de bytes, según formato) • Binario (secuencia de bytes a imagen de la memoria) Estructura • Bytes (con uso o no de separadores) • Registros • Implementada por medio de metadatos _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 45 Archivos int main(){ FILE *fp; char txt[7]; cin >> txt; fp = fopen(“c:\\texto.txt”, “w”); if (fp) { fprintf(fp, “%s”, txt); fclose(fp); } else cout << “error”; } disco S.O. 920 H o l a \n H o l a \n _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 46 Tipos recursivos struct CIUDAD { char nombre[15]; unsigned int dist; struct CIUDAD *prox; } *primero; Almacenamiento dinámico Tamaño ajustable Implementación de árboles, pilas, colas, etc. _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 47 Generación de lista simplemente enlazada typedef struct DATO{ char nombre[10]; struct DATO *prox; } NODO; NODO* crear(int n){ NODO *p = (NODO*)malloc(sizeof(NODO)); p->prox = NULL; for (NODO *r=p, int k=1; k < n; k++){ r->prox = (NODO*)malloc(sizeof(NODO)); r->prox->prox = NULL; r = r->prox; } return p; } ... NODO *primero = crear(3); *p stack heap nombre prox NULL nombre prox NULL nombre prox *r NULL _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 48 Destrucción de lista simplemente enlazada void destruir(NODO *p){ NODO *r; while (p){ r = p->prox; free(p); p = r; } } ... NODO *primero = crear(3); ... destruir(primero); *p stack heap nombre prox nombre prox nombre prox *r NULL _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 49 Subprogramas o subrutinas • Implementan la abstracción de procesos – Procedimientos (un punto de entrada y uno de salida) • Definen nuevos enunciados (sentencias) • No regresan valores • Pueden modificar variables del contexto de la rutina llamadora • Localidad de datos • Acceso a datos globales – Funciones (un punto de entrada y uno o más de salida) • Definen nuevas operaciones • Deben regresar un solo valor • Localidad de datos • Acceso a datos globales – Co-rutinas (múltiples puntos de entrada y salida) • Paralelismo Decisiones de diseño • ¿Las variables locales se alojan en forma estática o dinámica? • ¿Cuáles métodos de pasaje de parámetos se usan? • ¿Los argumentos de llamada son verificados con los parámetros formales? • Si se pasa como argumento un subprograma: ¿Sus parámetros de verifican? ¿Cómo se trata el ambiente de referencia? • ¿Pueden sobrecargarse? • ¿Son genéricos para operar con diferentes tipos? • ¿Se proveen formas de compilación separada? _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 50 Subrutinas y organización de la memoria local vars parameters framepointers ret address exe Code dll Code globals statics jumptables dynamic data objects 0x0012FFFF 0x00401000 0x0040a000 0x00000000 heap code data stack bss �Definido durante la traducción �Creado al invocar la subrutina �Destruido al regresar de la llamada �Gestiona datos de la subrutina �Alojado en el stack o el heap �Ubicación fija o variable (recursión) Prólogo •Salvar actual frame pointer •Apuntar nuevo frame pointer •Modificar stack pointer para reservar espacio de variables locales •Salvar registros utilizados en la subrutina Ejecución •Cuerpo de instrucciones de la subrutina Epílogo •Poner valor de retorno en RA del llamador •Restaurar registros de rutina llamadora •Restaurar stack pointer y frame pointer •Retornar el control al llamador registros de activación ejecución _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 51 Ámbitos de una subrutina char* func(char* M) { const int initval=2; char *x = "igual"; strcpy(x, (M+initval)); return x; } … char s[10] = "alguna"; cout << func(s) << endl; ¿Qué ocurre al ejecutarlo? ¿Motivo de los errores? Código ejecutable Instrucciones para crear el registro de activación Código ejecutable Instrucciones para destruir el registro 2 “igual” Registro de activación Punto de retorno Almacenamiento temporal Otros datos… Valor retornado (func) M[]:parámetro initval: const local x: local Código (code-segment) Registro (en data-segment)Registro (en data-segment) Registro (en data-segment) _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 52 var n = -1; function func2(m) { var initval=2; if (initval == 2) x = m[initval]; return n * x; } function func1() { var k; with (Math) { k = [sin(0.5), sin(0.5), sin(0.5)]; } n = func2(k); alert(x + ", " + n); } Información sobre símbolos de una subrutina Alcance y tiempo de vida de los símbolos Dinámico Local Global Estático accesible a partir del punto de declaración, desde todo el programa, durante toda la ejecución accesible sólo desde la función donde se declara accesible a partir de que se ejecute el enunciado donde aparece por primera vez objeto de dato estático, accesible desde todo el programa, durante toda la ejecución _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 53 Discriminante de acceso: ámbito.id Alcance y existencia Alcance Tiempo de vida _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 54 Mecanismos de vinculación Ámbitos Estático (depende del texto del programa) Local Bloque donde se declaran los símbolos La declaración debe ser previa al uso del símbolo De referencia Conjunto de todos los símbolos accesibles en los contextos que incluyen al actual Dinámico (depende del flujo de ejecución) Local Bloque donde se declaran los símbolos, sin importar la posición donde se lo hace De referencia Contextos de las subrutinas “vivas” llamadas previamente Símbolos accesibles hasta que alguna rutina llamada posteriormente lo redefine _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ __________________________________________________________________________________________ Diapositiva 55 Ámbito de acceso y reglas de alcance #include <iostream> using namespace std; int cant; void func2(void){ extern int cant; for (cant=1; cant<10; cant++) cout << ".”; } void func1(void){ int temp; temp = cant; func2(); cout << "cant: “ << cant << endl; } int main(){ cant = 100; func1(); getchar(); } var cadena = "hola"; function f (){ resultado = cadena + ", un saludo"; cadena = "Hasta luego"; } function ff (){ var cadena = 0; var resultado = 0; if (resultado == 0){ var valor = 1; } cadena = valor; alert("ff->R: " + resultado); alert("ff->C: " + cadena); } f(); alert("C: " + cadena + “ R: " + resultado); ff(); alert("C: " + cadena + “ R: " + resultado); ¿if falso? ¿sin var? ¿sin extern? _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 56 Ámbito de acceso y reglas de alcance procedure P is procedure Q is procedure R is ... end R ... end Q procedure S is ... end S ... end P Estático Dinámico ¿S? R S R S R S R Q Q S Q Q P P P P P Reglas de alcance estático: importa la declaración y dónde se hace Reglas de alcance dinámico: importa sólo la declaración El alcance a los símbolos es dentro de un ámbito de acceso _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 57 Bloques de código y alcance JS function sumaCuadrados(a, b) { function cuadrado(x) { return x * x; } return cuadrado(a) + cuadrado(b); } ... C/C++ (implementa una union) void P() { int I; ... if (...) { int J; ... } while (...) { int K, L; ... } } • Implementados como subprogramas sin parámetros • Reservando espacio local en el registro de activación _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 58 Referencia al contexto Código Almacenamiento int x; estático (global) int foo(int z) { dinámico en stack char ch[100]; dinámico en stack if (z == 23) foo(7); return 3; } void main() { int y; dinámico en stack char *str; dinámico en stack str = new char [100]; dinámico en heap y = foo(23); delete str; } Code: main foo Estático : x Parámetros: void Retorno: exit Link dinámico: void Link estático Variables locales: y, str Parámetros: z = 23 Retorno Link dinámico Link estático Variables locales: chr[] Parámetros: z = 7 Retorno Link dinámico Link estático Variables locales: chr[] … Heap: [] _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 59 Display Display LD Datos Display LD Datos Display LD Datos Display LD Datos Referencia al contexto en subrutinas anidadas Cadena de llamada: P()�Q()�R()�S() P … Q() … Q … R() … S R … S() … Cadena estática S R Q P LE LD Datos LE LD Datos LE LD Datos LE LD Datos Estructura del programa _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________ Diapositiva 60 Ambientes (contextos) de referencia • Clausura o cierre Evaluación en un contexto desde donde se accede a otros contextos • Acceso al ámbito de referencia Estático: si una referencia no se encuentra en el ambiente actual, se busca en los ambientes que lo contienen (sigue la cadena estática) Dinámico: si una referencia no se encuentra en el ambiente actual, se busca en los ambientes previos en la pila (sigue la cadena dinámica) ? ? _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________ _____________________________________________________________________________
Compartir