Professional Documents
Culture Documents
1. Introducción Lecturas:
2. Sistemas de tipos Scott, capítulo 7
3. Representación de tipos Aho, capítulo 6
• Expresiones de tipos Fischer, sección 10.1
• Árboles Holub, sección 6.3
4. Comprobación de tipos Bennett, capítulo 9
• Equivalencia Cooper, sección 4.2
• Conversión
• Coerción
• Inferencia
5. Perspectiva
int i; i: int
int *j; j: pointer(int)
int *k(); k: function(pointer(int))
int (*l)(); l: pointer(function(int))
int *m[9]; m: array(pointer(int),int)
int (*n)[]; n: pointer(array(int,int))
int *o()[]; o: function(array(pointer(int),int))
int **p(); p: function(pointer(pointer(int)))
int *q()(); q: function(function(pointer(int)))
int **r[][]; r?
int *(*s[10])[]; s?
12048 - J. Neira – Universidad de Zaragoza 13
Árboles de Tipos
2. Una expresión de tipo también puede describirse gráficamente como un
árbol de tipos.
– Las hojas son tipos o valores primitivos.
– Los nodos interiores son constructores.
• Ejemplo (Pascal):
• Expresión de tipos:
a: array(array(integer,
subrange(integer,1,20)),
subrange(integer,1,10))
array
• Árbol de tipos:
array subrange
integer 1
12048 - J. Neira – Universidad de Zaragoza
20 14
Tipos en la Tabla de Símbolos
(Tabla de Atributos)
• Ejemplo (PASCAL P4): registro con campos variantes
type
IdPtr = ^Identifier;
Parte
Partefija:
fija:
Identifier = record •Nombre
•Nombre
Name: Alpha; •Inf.
Llink, Rlink: IdPrt; •Inf.de
deacceso
acceso
IdType: TypePtr; •Clase
•Clase
Next: IdPtr; •Tipo
•Tipo
case Class : IdClass of
Constant: ( Value: ValueType );
TypeName ();
Variable: ( Vkind: IdKind;
Vlevel: LevelRange;
Vaddr: AddressRange
);
Field: ( Offset: AddressRange );
Proc, Func: (
case PFDeclKind : DeclKind of
Standard: (...);
Declared: (...)
)
end;
12048 - J. Neira – Universidad de Zaragoza 15
Tipos en la Tabla de Símbolos
(Tabla de Atributos)
• Ejemplo (PASCAL P4): registro con campos variantes
TypePtr = ^TypeDescriptor
TypeDescriptor = record
Size: AddressRange;
PackedFlag: boolean;
case Form : TypeForm of
Scalar: (
Parte case ScalarKind : DeclKind of
Partevariable:
variable: Declared: ( First: IdPtr );
•Tamaño
•Tamaño Standard: ( )
•…..
•….. );
Subrange: ( SubBType: TypePtr;
Min, Max: Value
);
Pointer: ( PtrBType: TypePtr );
SetType: ( SetBType: TypePtr );
ArrayType: (
IndexType, ElementType: TypePtr
);
RecordType: ( FirstField: IdPtr );
FileType: ( FileBaseType: TypePtr )
end;
12048 - J. Neira – Universidad de Zaragoza 16
Representación de ELEMENTO
typedef struct {
char nombre[2];
¿representación? int natomico;
float patomico;
int metal;
} ELEMENTO;
• Identifier • TypeDescriptor
ELEMENTO, , ,
10, 0, RecordType,
nombre, , , , ,Field:0
2, 0, ArrayType, ,
natomico, , , , ,Field:2
2, 0, int
patomico, , , , , Field:4
1, 0, char
metal, , , -, , Field:8
4, 0, float
12048 - J. Neira – Universidad de Zaragoza 17
4. Comprobación de Tipos
• Comprobación Estática: • Comprobación Dinámica:
llevada a cabo durante la com- llevada a cabo durante la eje-
pilación cución.
– Toda la información necesaria – Programas menos eficientes
debe estar disponible (desventaja de los intérpretes).
– Programas más eficientes (no se procedure Compute is
genera código) K : Integer :=
Integer'Last;
#define I 5 begin
K := K + 1;
short i; end Compute;
char v[10];
– Referencia a variables sin valor
asignado.
i = 10*32767;
var i : integer;
... ...
write(i);
v[2*I] = ’b’; ...
type v1 = array[1..10]
type r1 = record of char;
i, j : integer; v2 = array[0..9]
end; of char;
type r2 = record
i : integer;
j : integer; type persona = record
end; nombre,
type r3 = record direccion : string[80];
a : integer; end;
b : integer;
end; type empresa = record
nombre,
direccion : string[80];
end;
12048 - J. Neira – Universidad de Zaragoza 19
Equivalencia estructural
• Método usual de comproba- • ¿por qué? tipos recursivos:
ción: algoritmo recursivo de
comparación de árboles. typedef struct {
int tipo;
struct nodo *izq;
• C: comprobación de tipos es- struct nodo *der;
tructural: } nodo;
{ • Árbol de tipos:
int (*f)();
int (*g)();
f = g; record
}
• ¡Excepto para registros! integer pointer pointer
struct {
int i; char c;
} a; ¡El método de comprobación
struct { debe utilizar los nombres!
int i; char c;
} b; • Expresión de tipos:
....
a = b; nodo: record(int,
pointer(nodo),
pointer(nodo))
12048 - J. Neira – Universidad de Zaragoza 20
Equivalencia
• Equivalencia Nominal: dos • Pascal: a cada definición implí-
tipos son equivalentes si tienen cita se le asigna un nombre di-
el mismo nombre ferente
type r1 : record
b : integer; var a : record
c : real; b : integer;
end;
c : real;
r2 : record end;
b : integer; d : record
c : real;
end; b : integer;
var a : r1; c : real;
d : r2; end;
...
a.b := d.b; ...
... a := d;
a := d;
• El programador diferencia los
tipos a través de los nombres: • ADA: la compatibilidad es MUY
type metros = real; restringida
millas = real;
var A, B : array(1..10)
var d : metros; l : millas; of BOOLEAN;
....
d := l; A := B;
void process_alerts () {
handle_alert (2);
…
procedure Perform_Safety_Checks is
T : Integer := Get_Time;
D : Integer := Get_Distance;
begin
…
Check_Speed (D, T);
end Perform_Safety_Checks;
• NO compila
12048 - J. Neira – Universidad de Zaragoza 31