| Historia
tipos
definidos por el usuario
nombres
de tipos definidos
evaluación
arreglos
récords
variant records
apuntadores
Equivalencia
de tipos
|
|
- real
- integer
- boolean
- character
- por enumeración: type sex = (masc, fem);
- por especificación de intervalo: type minuto = 0..59;
- por definición de conjunto: type diasClase: set of (lu,ma.mi,ju,vi);
- declarar tipo con nombre: type vector = array [1..100] of
0..24; y después declarar var v1 : vector;
- declarar tipo anónimo en la declaración de una
variable: var v1: array [1..100] of 0..24;
operaciones sobre conjuntos: d1,d2, d3 : set of (lu,ma.mi,ju,vi);
- + unión; d3 := d1 + d2;
- * intersección; d3 := d1 * d2;
- := asignación, constructor; d1 := [ma,ju];
- - resta; d3 := d1 - d2;
- in miembro_de; IF ma in d1 THEN ......
- <= condición de subconjunto; IF d1 <= d2 THEN ....
- = condición de igualdad; IF d1 <= d2 THEN ....
- contribuyen a mayor seguridad: el compilador puede identificar más
errores: puede enviar mensajes de error más informativos; cotejo de
intervalo a la hora de compilación, pero no a la hora de ejecución
- hay implementación eficiente: en n bits se puede representar una
enumeración o un range de 2n valores
- le permiten al programador expresarse a un nivel más alto, en la
terminología del problema.
- elegancia
- agrupación de datos homogéneos
- arreglos de una sola dimensión
- se especifica el tipo del index: cualquier tipo discreto y finito
- se especifica el tipo de los elementos: cualquier tipo; así que
se pueden definir arreglos de arreglos: var xyz: array [0..20] of
array [2..25] of (blue,green,red);
- selección de componente (nombre[i]) es dinámico: el compilador
no sabe a que componente se va a accesar
- en Pascal, arreglos son estáticos; dimensiones no pueden variar a
la hora de ejecución. ¿Porqué? Pascal tiene un sistema fuerte de
tipos de datos: el compilador tiene que conocer el tipo de cada dato;
las dimensiones de un arreglo son parte de su tipo. Así que las
dimensiones de un arreglo tienen que poderse determinar a la hora de
compiulación.
consecuencia: si tengo un procedure que suma un arreglo de tipo
array [1..10] of real; el comp;lador no va a permitir ni que le pase
un arreglo definido como array [0..9] of real !!!! No puedo escribir
un proc que me sume un arreglo de reales de dimensiones arbitrarias.
(ISO Pascal lo resuleve con conformant arrays).
- de COBOL a Pascal a C
- agrupación de datos heterogéneos (arreglo: homogéneo)
- selección de componente (variable.campo) es estático: el
compilador sabe a que componente se va a accesar
- declaración de un tipo de récord con nombre (type r1 =
record ......end;) , o un tipo anónimo (var v1: record
........end;)
- comparación y asignación de récords del mismo tipo (S := R; If
S=R .....
- cuando hay subtipos, cada uno con sus propios datos: todos los
empleados tienen un número de empleados y una fecha de nacimiento,
algunos tienen horas tarbajadas y pagoPorHora, otros tienen
salarioMensual. En lugar de crar un tipo de record con campos para
todos los atributos, se puede usar un variant record:
dynamic variable: a variable whose address is determined when
the program is run. In contrast, a static variable has memory
reserved for it at compilation time.
heap: an area of memory reserved for data that is created at
runtime -- that is, when the program actually executes. In contrast, the
stack is an area of memory used for data whose size can be
determined when the program is compiled.
new: creates a new dynamic variable and sets a pointer
variable to point to it
- apuntadores tienen tipo: var p: ^real; declara una variable
p que contiene no simplemente una dirección, sino la dirección
de un real!
- listas, árboles, programación de sistema
- la declaración de la variable (var A : nodePrt) crea espacio para
una variable que va a tener un apuntador (a una estructura de tipo
nodePtr)
- el new(A) asigna memoria para una estructura nodePtr y pone la
dirección de ella en la variable A
- variables que tienen su propio nombre (A,B,C del ejemplo): memoria se asigna en el AR
a la hora d elaboración del bloque
- variables que no tienen nombre propio (los records de tipo node): se les asigna memoria en el
heap cuando se ejecuta el new. ¿Por qué? El new(A) podría
estar en un ciclo que ejecuta un numero de veces que no se sabe a la
hora de compilación. El compilador no puede reservar espacio en el
AR.
- el heap es un bloque de memoria que lo maneja el run-time system
para guardar datos que surjan durante la ejecución. En el heap se
asigna y se libera memoria en un orden no-predefinido.
- En Pascal el programa puede (debe) liberar memoria en el heap que
ya no se necesita, por ejemplo: dispose(A). Cuando se llena el heap
disponible, Pascal da un HEAP OVERFLOW
¿Cuándo dos variables o expresiones son del mismo tipo?
- equivalencia de nombre: cuando se han declarado con el tipo del
mismo nombre
- si el programador le dió nombre diferente deben ser cosa
diferntes
- fácil de implementar (hay que comprar los nombres)
- equivalencia de estructura: cuando se han declarado con tipos cuya
estructura se declaró en forma idéntica
- el compilador puede atrapar menos errores
- facil de implementar (hay que comparar el texto de las
declaraciones)
|