610 likes | 863 Views
Cobol. C. Pascal. Fortran. 3. TIPOS DE DATOS. SmallTalk. Java. C++. Conceptos básicos. Un tipo de dato es: Un conjunto de objetos Con una colección de operaciones Tipos de datos: Elementales o primitivos, por ejemplo, float Estructurados o agregados, por ejemplo, struct Abstractos
E N D
Cobol C Pascal Fortran 3. TIPOS DE DATOS SmallTalk Java C++
Conceptos básicos • Un tipo de dato es: • Un conjunto de objetos • Con una colección de operaciones • Tipos de datos: • Elementales o primitivos, por ejemplo, float • Estructurados o agregados, por ejemplo, struct • Abstractos • Modelo de definición de datos, por ejemplo, typedef • Modelo de definición de objetos, por ejemplo, class
Estructura de tipos La estructura de tipos en un lenguaje se establece mediante dos conceptos: • Equivalencia (criterio para decidir que dos objetos son del mismo tipo) • Nominal, si los tipos tienen el mismo nombre • Estructural, si los tipos tienen la misma estructura • Conversión (transformación de la representación interna de un r-valor según la representación interna del respectivo l-valor) • Implícita o coerción • Explícita o casting
Equivalencia Ejemplo en Pascal Program Ejemplo; Type Vector1 = Array[1..10] of Real; Vector2 = Array[1..10] of Real; Var X, Z : Vector1; Y : Vector2; Procedure Rutina(A : Vector1); Begin … End; Begin X := Y; Rutina(Y); End. Error!! según equivalencia nominal Correcto según equivalencia estructural
Conversión Ejemplo en C float x,y,z; int i=5, j=2, k=4; x = i/k; y = i/(float)j; z = (float)i/k; printf("%f %f \n", x, y,z); x = 5/4 = 1 x=1.0 coerción y = 5/2.0 = 5.0/2.0 y = 2.5 castingcoerción z = 5.0/4 = 5.0/4.0 z = 1.25 castingcoerción
Comprobación de tipos Comprobación de tipos es la acción de verificar la consistencia entre un l-valor y un r-valor La comprobación puede ser: • Estática (lenguajes fuertemente tipados) • Dinámica (lenguajes débilmente tipados) NO existen lenguajes de programación que realicen TODA la comprobación de tipos durante compilación
Comprobación estática • Ocurre casi totalmente durante compilación • Requiere declarar datos • Participa de la tabla de símbolos • Dota a los códigos ejecutables de: • Escasa flexibilidad • Gran eficiencia • Alta seguridad
Comprobación dinámica • Ocurre durante ejecución • Excluye la declaración de datos • Acepta modificar tipos de datos durante ejecución • Demanda espacio de almacenamiento adicional • Dota a los códigos ejecutables de: • Gran flexibilidad • Escasa eficiencia • Insuficiente seguridad
Comprobación de tipos Para la sentencia en C x = f(x) + z; El compilador comprobará la compatibilidad de los tipos de: • x y el parámetro formal de f • f y z • x y la operación + En Pascal Type Rango = 1..100; Var k, n : Rango; Begin n = 2*k + 1; End; El r-valor de n sólo se podrá comprobar en tiempo de ejecución
Modelos de Definición de Tipos Estructurados de Datos
Producto Cartesiano El producto cartesiano de n conjuntos C1, C2, C3, ... Cn, denotado en la forma C1 x C2 x ... x Cn, es un conjunto cuyos elementos son n-tuplas (c1, c2, ... cn) con ciÎ Ci Los lenguajes de programación proveen el modelo de producto cartesiano a través de los conceptos de estructura o registro Los polígonos regulares se pueden caracterizar por: • Un número entero que representa el numero de lados, y • Un número real que representa la longitud de un lado Todo polígono regular así expresado es un elemento del producto cartesianoZ X R
f : D I Aplicación Indexada Una aplicación indexada es una función de un conjunto de valores pertenecientes a un dominio D, sobre un conjunto de valores pertenecientes a una imagen I Los lenguajes de programación proveen el modelo de aplicación indexada a través del concepto de arreglo La declaración en C, float v[5]; constituye una aplicación del subrango de enteros [0, 4] sobre los números reales
Aplicación Indexada Para ligar el dominio D a un subconjunto específico de valores, los lenguajes optan por una de tres estrategias: • Estática, para la cual el subconjunto se determina en tiempo de compilación • Semidinámica, para la cual el subconjunto se determina en tiempo de creación • Dinámica, para la cual el subconjunto se determina en tiempo de ejecución
Aplicación Indexada Estrategia Estática En C, int v[5]; declara un arreglo de tamaño 5 Estrategia Semidinámica En Algol, [m : n] int a; declara un arreglo de tamaño conforme a los valores actuales de m y n Estrategia Dinámica En Algol, flex [1: 0] int b; declara un arreglo vacío, de modo que b := (2, 3, 8) cambia sus límites a [1:3]
Unión Discriminada Modo Pascal Es una extensión del producto cartesiano, la cual consta de: • Una parte fija, cuyo último campo es un discriminante • Una parte variable, definida como un conjunto de variantes En este modelo: • La parte fija precede a la parte variable • El discriminante permite seleccionar una de las variantes pertenecientes al conjunto definido • Cada variante es, a su vez, un producto cartesiano Técnicamente se conoce como registro con variantes
Unión Discriminada Ejemplo Type RegVar = Record f1 : Integer; f2 : Real; case variable : Boolean of True : (v1 : Real); False : (v2 : Char); End; Var rv : RegVar;
Unión Modo C Una union se caracteriza por • Ser, sintácticamente, un producto cartesiano • Declararse como un conjunto de campos variantes • Ser, semánticamente, una estructuravariable • Disponer, durante ejecución, de tan sólo uno de los campos variantes En C, un registro con variantes se simula mediante una struct: • Cuyo último campo es una union • Cuyo penúltimo campo se utiliza como discriminante
Unión Ejemplo typedef struct { int f1; float f2; int variable; union { float v1; char v2; } var; } regvar; regvar rv;
Conjunto Potencia Modo Pascal Un conjunto potencia es el conjunto de todos los subconjuntos que se pueden formar con los elementos de cierto conjunto base T; se denota P(T) Permite declarar variables cuyos valores son elementos de P(T) Si T = {a, b, c} entonces P(T) = {, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}} #(P(T)) = 2#(T) = 23 = 8
Modelos de Construcción de Tipos Estructurados de Datos
Modelos de Construcción Un tipo estructurado de datos se obtiene a partir de tipos elementales mediante un constructor de tipo Un constructor de tipo impone la necesidad de contar con un modelo de construcción para la futura creación de objetos en memoria Los traductores de lenguajes operan con tales modelos con el propósito de satisfacer abstracciones de alto nivel Un modelo de construcción está formado por un descriptor y un modelo de representación
Modelos de Construcción El descriptor es un conjunto de atributos del objeto El modelo de representación corresponde a la forma física que adoptará el objeto en RAM Como la RAM es lineal, todo objeto adopta la forma física unidimensional Luego, se debe proveer una funcionalidad que convierta acciones de alto nivel en acciones sobre la representación Una fórmula de acceso es una función que transforma referencias lógicas en referencias físicas, a partir de los atributos contenidos en el descriptor
Un puntero del bloque A al bloque B (enlace) se representa guardando la dirección de la primera localidad del bloque B en una localidad reservada para ese fin en el bloque A Tipos Estructurados Representación Secuencial: La estructura de datos se guarda en un bloque contiguo de almacenamiento Representación Enlazada: La estructura de datos se guarda en varios bloques no contiguos enlazados entre sí a través de punteros
Componente Descriptor Componente Componente Componente Componente Componente . . . ...... Componente Componente Tipos Estructurados enlace Representación Secuencial Representación Enlazada
Tipos Estructurados • Representación Secuencial: • Se usa para estructuras de tamaño fijo • Ocasionalmente en estructuras homogéneas de tamaño variable • Ejemplo : registros, vectores, strings, etc. • Representación Enlazada: • Se usa para estructuras de tamaño variable • Ejemplo : listas enlazadas
Modelos de Representación de Tipos Estructurados de Datos
Producto Cartesiano Pascal Var R : Record a : integer; b : real; End; C struct { int a; float b; } R ;
Objeto a b Producto Cartesiano Descriptor
Objeto Producto Cartesiano Fórmula de acceso Dirección absoluta de memoria donde se encuentra el i-ésimo selector del registro R • donde • es la dirección base de R, resuelta en tiempo de creación, y • tkel tamaño del k-ésimo selector
i - 1 i - 1 å å tk tk k = 1 k = 1 = Producto Cartesiano Sin embargo, la expresión se resuelve en tiempo de traducción. Luego, con y = 0, constantes
R: int boolean char float int float float int puntero Producto Cartesiano Ejercicio: Dada la estructura a b c d e f g h j • Declararla en C++ • b) Establecer una fómula de acceso a una componente del registroR • c) Aplicar la fórmula para determinar la dirección absoluta del campo g del registro R, si la dirección base es 1000
Producto Cartesiano a) Declaración en C++ typedef float *puntero; struct Registro { int a, d, j; float b, f, g; char c ; bool e ; puntero h; } ; Registro R;
Producto Cartesiano b) Fórmula de acceso: i-1 Dir(R.Si) = + tk Dir(R.Si) = + (t1+ … + ti-1) k=1
a b c d e f g h j Producto Cartesiano c) Aplicación de la fórmula de acceso: Dir(R.g) = Dir(R.S7) Dir(R.g) = + t1 + t2 + t3 + t4 + t5 + t6 Dir(R.g) = + t(a) + t(b) + t(c) + t(d) + t(e) + t(f) Como = 1000, se tiene Dir(R.g) = 1000 + 2 + 4 + 1 + 2 + 1 + 4 = 1000 + 14 Por lo tanto, Dir(R.g) = 1014
A[0] A[1] A[2] A[3] A[4] Aplicación Indexada Caso unidimesional Como resultado de la declaración Var A : array[0 .. 4] of integer; los elementos del arreglo A ocupan localidades consecutivas de memoria
Localidad inicial del bloque completo Localidad relativa del elemento seleccionado dentro del bloque secuencial Aplicación Indexada Dada una representación secuencial, en la selección directa de un elemento intervienen: la dirección base + el desplazamiento a través de una fórmula de acceso
Aplicación Indexada • Ejemplo : Considérese el arreglo en C, char s[10]; • Este arreglo se dispone, secuencialmente en memoria, como s[0], s[1], ..., s[9] • La dirección de s[1] es la dirección base de s más 1 • Para arreglos de char en C, la dirección del i-ésimo elemento es • Dir(s[i]) = l-value(s[0]) + i
s[0] 154: Dirección base = localidad de s[0] 155: s[1] 156: s[2] 157: s[3] 158: s[4] Desplazamiento = i * tamaño del elemento = 5 * 1 = 5 s[5] 159: 160: s[6] Dirección base + desplazamiento = l-valor( s[0] ) + 5 = l-valor( s[5] ) 161: s[7] 162: s[8] 163: s[9] Aplicación Indexada
Descriptor Objeto V[1] V[2] V[3] V[10] Aplicación Indexada Vectores (modalidad Pascal) Var V = Array [1..10] of Real;
Aplicación Indexada Fórmula de acceso La ubicación en RAM del i-ésimo elemento de V, durante ejecución, se determina mediante Dir(V[i]) = + (i – li)*T Aquí, • li y Tse determinan en tiempo de traducción • , la dirección base, se determina en tiempo de creación
-2 -1 0 1 2 3 4 5 6 7 8 V: Aplicación Indexada Ejercicio: Con respecto al vector Real • Declararlo en Pascal • Proponer una fórmula para acceder al i-ésimo elemento de V • Determinar la dirección absoluta de V[4], si la dirección base es 1000
Aplicación Indexada a) Type Vector = Array[-2..8] of Real; Var V : Vector; b) Dir(V[i]) = + (i – li)*T c) Dir(V[4]) = 1000 + ( 4 – -2 )*4 = 1000 + (4 + 2)*4 = 1000 + 6*4 = 1024
1 2 3 4 5 A: 1 2 3 4 5 6 7 8 9 10 Por filas: 1,1 1,2 1,3 1,4 1,5 2,1 2,2 10,5 ... Por columnas: 1,1 2,1 3,1 4,1 10,1 1,2 2,2 3,2 .. 10,5 ... Aplicación Indexada Caso bidimesional (modalidad Pascal) Var A : Array [1..10, 1..5] of Real; Linealización
Descriptor Objeto A[1,1] A[1,2] A[1,3] A[1,4] A[1,5] A[2,1] A[2,2] A[2,3] : A[10,5] Aplicación Indexada Vectores (modalidad Pascal) Var A = Array [1..10, 1..5] of Real;
Aplicación Indexada Fórmula de acceso La ubicación en RAM del elemento de A[i, j] durante ejecución, se determina mediante Dir(A[i, j]) = + (i – if)*S + (j– ic)*T conS = (sc–ic + 1)*T Aquí, • if, S y Tse determinan en tiempo de traducción • , la dirección base, se determina en tiempo de creación
1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 B: Aplicación Indexada Ejercicio: Con respecto a la matriz • Declararlo en Pascal, asumiendo elementos reales • Determinar la dirección absoluta del elemento situado en la tercera columna de la cuarta fila
Aplicación Indexada a) Var B = Array[1..10, 1..5] of Real; b) Dir(B[i, j]) = + (i – if )*S + (j – ic)*T S = (sc – ic + 1)*T S = (5 – 1 + 1)*4 = 20 Dir(B[4, 3]) = + ( 4 – 1)*20 + (3 – 1)*4 = + 3*20 + 2*4 = + 60 + 8 = + 68
4 1 i 1 10 j 1 5 k Aplicación Indexada Caso tridimesional (modalidad Pascal) Var C : Array [1..4, 1..10, 1..5] of Real; Acceso a un elemento C[i, j, k] en un vector de matrices
k j i Var C : Array [1..4,1..10,1..5] of Real; Por planos Por filas Por columnas 4 1 4 1 i i i 1 10 1 10 j j j k k 1 5 1 5 k Aplicación Indexada Linealización
Aplicación Indexada Fórmula de acceso Dir(C[i, j, k]) = + (i – ip)*R+ (j – if)*S + (k– ic)*T donde • S = (sc–ic + 1)*T • R = (sf–if + 1)*S = (sf–if + 1)* (sc–ic + 1)*T • ip, R, S y Tse determinan en tiempo de traducción • , la dirección base, se determina en tiempo de creación