Você está na página 1de 14

Sistemas de tipos

Es el conjunto de reglas para asignar expresiones de tipos a distintas partes del programa Un comprobador de tipos establece un sistema de tipos Podemos realizar la comprobacin de tipos:
Dirigida por la sintaxis (intercalamos comprobaciones en las acciones de las producciones) Un comprobador especfico de tipos despus de la sintaxis (construimos el rbol sintctico y luego se recorre)

Compiladores e Intrpretes

Sistemas de tipos
Un lenguaje fuertemente tipado = el compilador no hace conversiones de tipos (es muy rgido con los tipos) Un lenguaje dbilmente tipado = si los tipos no coinciden, el compilador puede convertirlo Hay caractersticas de los tipos que no se pueden comprobar en tiempo de compilacin. Ej: en Pascal el ndice de un vector no se puede salir de su dimensin se genera cdigo objeto especfico para comprobar esto en tiempo de ejecucin.

Compiladores e Intrpretes

Sistemas de tipos
Comprobacin de tipos dirigida por la sintaxis
En las reglas de la seccin de declaracin de tipos se definen los tipos que fluirn por los atributos de los smbolos de la G. Manejamos los tipos del lenguaje ms algunos tipos que necesitamos
Tipo error: indica que hay un error en el chequeo de tipos Tipo vaco: Las instrucciones no tienen tipo.Algunas veces no se puede determinar el tipo de una expresin en tiempo de compilacin

Compiladores e Intrpretes

Sistemas de tipos
P D;E D D;D | id:T {aadeTipo(id.entrada,T.tipo)} T char {T.tipo=char} |integer {T.tipo=integer} |array[num] of T1 {T.tipo=array(1..num.val, T1.tipo)} | *T {T.tipo=puntero(T1.tipo)} E cadena {E.tipo=char} |num {E.tipo=integer} |id {E.tipo=busca(id.entrada)} |E1 mod E2 {E.tipo= if E1.tipo = integer and E2.tipo=integer then integer else tipoError} | E1[E2] {E.tipo=if (E2.tipo=integer and E1.tipo=array(rango,tip)) then tip else tipoError} | E1* {E.tipo = if E1.tipo=puntero(tip) then tip else tipoError}
Compiladores e Intrpretes 4

Sistemas de tipos
Comprobacin de preposiciones
P D; S S id := E {S.tipo=if id.tipo=E.tipo then tipoVaco else tipoError} | if E then S1 {S.tipo= if E.tipo=boolean then S1.tipo else tipoError} |while E do S1 {S.tipo= if E.tipo=boolean then S1.tipo else tipoError} | S1;S2 {S.tipo= if S1.tipo=tipoVacio and S2.tipo=tipoVacio then tipoVacio else tipoError}

Compiladores e Intrpretes

Sistemas de tipos
Clases de tipos: Tipos bsicos
Numerables (los que pueden servir como ndice de un array): Booleano Entero Carcter Enumerado Subrango No numerables: Reales Hilera de caracteres

Tipos bsicos
Otros: TError: indica que una expresin no se puede construir porque hay un error de tipos Tvacio: un tipo que Compiladores e Intrpretes tipo) no tiene valor (no hay 6

Sistemas de tipos
Clases de tipos Tipos Constructores:
Array: un tipo bsico + conjunto de ndices (cada uno tiene un lmite superior e inferior y un tipo). El chequeo de ndices se hace en tiempo de ejecucin. Registro / unin: un conjunto de campos (cada uno con un identificador y un tipo) Funcin: el tipo de los argumentos y el que devuelve Procedimiento: el tipo de los argumentos y devuelve un tipo vaco Conjunto Puntero Lista Producto cartesiano: el tipo de las tuplas
Compiladores e Intrpretes

Sistemas de tipos
Una gramtica de tipos:
%{ ... %} %union{ entrada e; int tam; interval i; /*tipo interval es estructura de 2 int (limite inferior y superior)*/ } %type <e> Elem Campo NomTipo %type <tam> Cadena %type <i> subrango Indice %%
Compiladores e Intrpretes 8

Sistemas de tipos
Tipo : Tbasico | Compuesto |NomTipo|VarTipo Tbasico: Tnum | Real | Cadena | Tvacio | Terror Tnum: Boolenao | Carcter | Entero | Enumerado | subrango Enumerado: Elem * Subrango: t: Tnum Compuesto: Array |Registro |Union |Producto |Conjunto |Lista |Puntero |Funcion Array: i:indices, tb: Tipo Indices: indice * Indice: t:Tnum Registro: campo* Union: campo* Conjunto: t:Tipo Puntero: t: tipo Lista: t: tipo Funcion: r: tipo, args: Producto Producto: Tipo *
Compiladores e Intrpretes

Sistemas de tipos
Tipo con nombre (NomTipo): son los tipos que define el usuario. Por lo tanto pueden estar en las hojas como los tipos bsicos. Tipo con nombre: est en la tabla de smbolos ( ej.: un registro que es un tipo persona) Tipo sin nombre: variables de tipos annimos (una variable que la defino como un registro) Tipos variables (VarTipo): una variable puede ser cualquier tipo (de un conjunto de tipos). Ej: Puntero(t), siendo t un tipo variable

Compiladores e Intrpretes

10

Sistemas de tipos
Igualdad y Compatibilidad de tipos: es necesario saber cundo dos tipos son equivalentes. 1. Equivalencia estructural de tipos: dos tipos son estructuralmente equivalentes si - o bien son el mismo tipo bsico - o bien estn formados aplicando el mismo constructor a tipos estructuralmente equivalentes. (son iguales si la estructura de los dos rboles de tipos son iguales) 2. Igualdad por nombre: son iguales si los dos rboles son idnticos (son el mismo rbol) el puntero de los dos rboles de tipo apuntan al mismo rbol. 3. Igualdad mixta: a unas partes de los rboles a analizar se les realiza una igualdad estructural y a otras una igualdad por nombre
Compiladores e Intrpretes 11

Sistemas de tipos
a,b: registro{ c1: t1 } c: registro{ c1:t1; } a := b iguales por igualdad estructural y por nombre a:= c iguales por igualdad estructural y diferentes por nombre

Compiladores e Intrpretes

12

Sistemas de tipos
Dinmica: al ir evaluando las expresiones compruebo si son compatibles los tipos y el resultado de la expresin. Necesito saber si dos tipos son iguales Necesito saber cual es el tipo resultante de operar dos tipos con un operador (int + int) Necesito saber si dos tipos son compatibles con un operador (int + real) Dispongo de las siguientes funciones para llamarlas desde el anlisis dirigido por la sintaxis: Boolean Igual_tipo (tipo t1, tipo t2); Tipo result_bin (tipo t1, tipo t2, opb ob); Tipo result_un (tipo t1, opu ou); Boolean compatible_bin (tipo t1, tipo t2, opb ob); Boolean compatible_un (tipo t1, opu ou);

Compiladores e Intrpretes

13

Sistemas de tipos
Ej: Tipos: matrices, productos, punteros y funciones Boolean Igual_tipo (tipo s, tipo t) Begin if s y t son el mismo tipo bsico then return true else if s=array(s1,s2) and t=array(t1,t2) then return igual_tipo(s1,t1) and igual_tipo(s2,t2) else if s=s1xs2 and t=t1xt2 then return igual_tipo(s1,t1) and igual_tipo(s2,t2) else if s=puntero(s1) and t=puntero(t1) then return igual_tipo(s1,t1) else if s=s1 s2 and t= t1 t2 then return igual_tipo(s1,t1) and igual_tipo(s2,t2) else return false End
Compiladores e Intrpretes 14

Sistemas de tipos
Representacin de los tipos: Se representan los tipos en una estructura de rbol (como la de las expresiones), realizndose en el anlisis sintctico y analizndola posteriormente Hojas = tipos bsicos o nombres de tipos = n o variables Nodos = constructores de tipos = operadores artimticos
puntero +

pun tero 3 in t
Compiladores e Intrpretes 15

Sistemas de tipos
En representaciones en rbol puede aparecen ciclos para tipos recursivos Type enlace = * nodo; nodo= record info:int sig:enlace end; Se evitan basndonos en igualdad por nombre (los tipos definidos recursivamente son sustituidos por su nombre)
Nodo = record Nodo = record

info = int

sig = puntero

info = int

sig = puntero

Nodo Compiladores e Intrpretes 16

Sistemas de tipos
Representacin de los tipos: Se representan mediante una codificacin binaria:
ventaja: ahorra espacio. desventaja: codificar ms aspectos (tamao de las matrices,..)
TIPO BASICO Boolean Char Integer Real CODIGO 0000 0001 0010 0011 T. CONSTRUCTOR Puntero Array freturns CODIGO 01 10 11

EXPRESIN DE TIPO char freturns(char) Array(puntero(freturns(char)))

CODIGO 000000 0001 000111 0001 100111 0001


17

Compiladores e Intrpretes

Sistemas de tipos
Conversin de tipos
Coerciones o conversin de tipos implcita: si el compilador la realiza automticamente (C convierte los ASCII a enteros entre 0 y 127) Conversin de tipos explcita: el programador promueve la conversin (Pascal proporciona ord(c) que pasa un char a un entero) La conversin implcita se llevan a cabo en tiempo de compilacin. Consiste en introducir en el rbol llamadas a funciones de conversin En las funciones de igualdad y compatibilidad hacemos la conversin.
Compiladores e Intrpretes 18

Sistemas de tipos
Conversin de tipos
+ (real)

+ (real)

2 (in t)

3 (real)

2 (real)

3 (real)

2 (int) Introducimos reglas que hacen la conversin o llamadas a funciones de conversin (Tipo result_bin (tipo t1, tipo t2, opb ob) o Tipo result_un (tipo t1, opu ou))
E E1 op E2 {if E1.tipo=int and E2.tipo=real then E.tipo=real else if E1.tipo=int and E2.tipo=inte e.tipo=int else...... }
Compiladores e Intrpretes 19

Sistemas de tipos
Sobrecarga de operadores
Conlleva una transformacin de operadores Por ej. el operador + puede sumar dos nmeros enteros, dos nmeros reales o concatenar dos cadenas.

2,0

3,0

"hola"

"pepe"

Compiladores e Intrpretes

20

Sistemas de tipos
Sobrecarga de operadores
En el momento de generacin de cdigo es necesario saber qu operador en concreto es. Extendemos el operador suma a sumar, sumai, concatenar: Opb: sumar|sumai|concatenar|.....

sumai

s umar

c oncatenar

2,0

3,0

"hola"

"pepe"
21

Compiladores e Intrpretes

Sistemas de tipos
Valores-l y valores-r (l-value y r-value)
Ayuda a realizar comprobaciones en la asignacin de expresiones Hay que distinguir y:= 3+x de 3+x :=y; o de *(x+1) Se dice que una expresin tiene l-value si representa una direccin de memoria. Si tiene l-value se puede poner a la izquierda de una asignacin. Una variable tiene l-value y una constante no. Con l-value podemos comprobar que los parmetros S y E/S de las funciones son correctos, asignaciones mltiples, ... Podemos ver las expresiones como valores l-value y r-value combinados por operadores
Compiladores e Intrpretes 22

Sistemas de tipos
Valores-l y valores-r (l-value y r-value)
Por ejemplo, el operador . de un acceso a un registro: exige que le operando de la izquierda tenga l-value y el resultado es un l-value, el operador unario & exige que el operando tenga l-value y el resultado es un r-value. Operadores con l-value en C:
_ _ _ * [ _ ] vector -> _ puntero a estructura . _ estructura _ puntero

Compiladores e Intrpretes

23

Sistemas de tipos
Valores-l y valores-r (l-value y r-value) Paralelamente a la comprobacin comprobamos l-value Podramos utilizar instrucciones del tipo: de tipos

Comprobar que los l-value de los operandos son compatibles con el opb (3.campo1 no es compatible) Bool comp_lv_bin(bool, bool, opb); Bool comp_lv_un(bool, opu); Indican si el resultado de expresin tiene l-value o no Bool resul_lv_bin(bool, bool, opb); Bool resul_lv_un(bool, opu);
Compiladores e Intrpretes 24

Sistemas de tipos
Tipos variables o politipos
Se permite que una expresin de tipo sea variable Esta clase de tipos se denomina politipo o tipo con variable y en realidad representa una familia de tipos Hay funciones que aceptan una familia de tipos para sus argumentos. Se denominan funciones polimrficas Ej. de polimorfismo: Lista(t) concat (lista(t) l1, lista(t) l2),, t es un politipo El problema est en deducir si dos politipos son iguales o compatibles: para ello debo encontrar una sustitucin de tal forma que los dos politipos queden iguales.

Compiladores e Intrpretes

25

Sistemas de tipos
Tipos variables o politipos
Ej. t1 = ((a1 a2) x list(a2)) list(a1) t2 = ((a3 a4) x list(a4)) a5 t1=t2? hago sustituciones en un tipo y luego comparo con el otro a1/a1 (a1 es sustituido por a1) a2/a2 a3/a1 a4/a2 a5/list(a1) Obtenemos el tipo resultante ((a1 a2) x list(a1)) list(a2)
Compiladores e Intrpretes 26

Sistemas de tipos
Tipos variables o politipos La sustitucin se determina por un algoritmo de unificacin que recorre el segundo rbol relacionando con el primero
- -> ( 1) --> (8 ) *1

x (2 )

l ist (3 )

x (9 )

*2

a5 ( 14)

*3

--> (4 ) a1 (5 )

l is t ( 7)

*4

-- > (1 0 )

li st (1 3 )

*7

a2 (6 )

*5

a3 ( 11)

a4 (1 2 )

*6

Compiladores e Intrpretes

27

Você também pode gostar