Вы находитесь на странице: 1из 66

Compiladores

Anlisis Semntico y Chequeo


de Tipos
Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 2 Universidad Galileo


Dnde estamos?

Programa (character stream)


Analizador Lxico (Scanner)
Token Stream
Analizador Sintctico (Parser)
Arbol de Parseo

Oscar Bonilla 3 Universidad Galileo


Dnde estamos?

Programa (character stream)


Analizador Lxico (Scanner)
Token Stream
Analizador Sintctico (Parser)
Arbol de Parseo
Analizador Semntico
Generador de Cdigo Intermedio
Representacin Intermedia +
Tabla de Smbolos

Oscar Bonilla 4 Universidad Galileo


Qu es la semntica de un programa?
Sintxis
Cmo se ve un programa
Representacin textual o estructura
Es posible dar una definicin matemtica precisa

Semntica
Cul es el significado del programa
Es ms difcil dar una definicin matemtica precisa

Oscar Bonilla 5 Universidad Galileo


Por qu hacer anlisis semntico
Asegurarnos que el programa cumple con la
definicin del lenguaje de programacin
Proveer mensajes de error tiles al usuario

Oscar Bonilla 6 Universidad Galileo


Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 7 Universidad Galileo


Tabla de Smbolos
Un lugar para guardar toda la informacin
adicional acerca del programa
Representaciones intermedias: expresiones,
statements, control de flujo, etc.
Tabla de Smbolos: Tipos, variables, scope, etc.

Oscar Bonilla 8 Universidad Galileo


Scope
Un nombre puede tener significados distintos
en lugares distintos
Tipos, variables, etc tiene scope (mbito)
Tenemos que mantener una tabla de smbolos
para cada scope

Oscar Bonilla 9 Universidad Galileo


Operaciones en la tabla de smbolos
make_table(parent_table) symbol_table
scope(id) symbol_table
lookup_variable(id, symbol_table) variable
lookup_type(id, symbol_table) type
get_type(variable) type
add_type(id, symbol_table, type) type
add_variable(id, symbol_table, type) variable

Oscar Bonilla 10 Universidad Galileo


Siguiente Clase
Todo acerca de tablas de smbolos
Scopes y visibilidad
Informacin que se mantiene en la tabla de
smbolos
Implementacin de tablas de smbolos

Oscar Bonilla 11 Universidad Galileo


Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 12 Universidad Galileo


Chequeo Semntico
Chequeos estticos vs. Chequeos dinmicos
Chequeos estticos
Chequeos de control de flujo
Chequeos de unicidad
Chequeos de Tipo

Oscar Bonilla 13 Universidad Galileo


Chequeos de Control de Flujo
El control de flujo del programa es sensitivo
al contexto
Ejemplos:
Declaracin de una variable debe ser visible al
usarla (en scope)
Declaracin de una variable debe estar ntes de
usarla
Cada camino de salida (exit path) retorna un valor
del tipo correcto
Qu ms?

Oscar Bonilla 14 Universidad Galileo


Chequeos de Unicidad
Uso (y mal uso) de identificadores
No se puede representar en una CFG (mismo token)
Ejemplos:
Ningn identificador puede ser usado para dos
definiciones diferentes en el mismo scope

Oscar Bonilla 15 Universidad Galileo


Chequeos de Tipo
Los chequeos semnticos ms extensos
Ejemplos:
Que el nmero de argumentos haga match con el nmero de
parmetros formales y que los tipos correspondientes sean
equivalentes
Si se llama como expresin, debe retornar un tipo
Cada acceso a una variable debe hacer match con la declaracin
(arreglo, estructura, etc.)
Los identificadores en una expresin deben ser evaluables
LHS de una asignacin debe ser asignable
En una expresin los tipos de las variables, tipos de retorno de
mtodos y de operadores deben ser compatibles

Oscar Bonilla 16 Universidad Galileo


Chequeos Dinmicos
Chequeos de lmites de arreglos
Chequeo de dereferencia del Null Pointer

Oscar Bonilla 17 Universidad Galileo


Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 18 Universidad Galileo


Sistemas de Tipos
Un sistema de tipos es usado para el chequeo de
tipos
Un sistema de tipos incorpora
Construcciones estticas del lenguaje
Nocin de tipos
Reglas para asignar tipos a construcciones del
lenguaje

Oscar Bonilla 19 Universidad Galileo


Expresiones de Tipos
Un tipo compuesto es denotado por una
expresin de tipo
Una expresin de tipo es
Un tipo bsico
La aplicacin de un constructor de tipo a otras
expresiones de tipo

Oscar Bonilla 20 Universidad Galileo


Expresiones de Tipos: Tipos Bsicos
Tipos atmicos definidos por el lenguaje
Ejemplos:
Enteros
Booleanos
floats
caracteres
type_error
Tipo especial que produce un error
void
Tipo bsico que denota la ausencia de un valor

Oscar Bonilla 21 Universidad Galileo


Expresiones de Tipo: Nombres
Ya que las expresiones de tipos pueden ser
nombradas, un nombre de tipo es una expresin
de tipo

Oscar Bonilla 22 Universidad Galileo


Expresiones de Tipo: Productos
Si T1 y T2 son expresiones de tipo, T1 T2 es
tambin una expresin de tipo

Oscar Bonilla 23 Universidad Galileo


Expresiones de Tipo: Arrays
Si T es una expresin de tipo, un array(T, I) es
tambin una expresin de tipo
I es una constante entera que denota el nmero de
elementos de tipo T
Ejemplo:
int foo[128];
array(integer, 128)

Oscar Bonilla 24 Universidad Galileo


Expresiones de Tipo: Function Calls
Matemticamente una funcin mapea
Elementos de un conjunto (el dominio)
A elementos de otro conjunto (el contradominio)
Ejemplo
int foobar(int a, boolean b, int c)
integer boolean integer integer

Oscar Bonilla 25 Universidad Galileo


Expresiones de Tipo: Otras
Records
Estructuras y clases
Ejemplo
class { int i; int j;}
integer integer
Lenguajes Funcionales
Funciones que toman funciones y retornan
funciones
Ejemplo
(integer integer) integer (integer integer)

Oscar Bonilla 26 Universidad Galileo


Un lenguaje simple con tipos
Un lenguaje que tiene una secuencia de
declaraciones seguidas de una sola expresin
P D; E
D D; D | id : T
T char | integer | array [ num ] of T
E literal | num | id | E + E | E [ E ]
Programa Ejemplo
var: integer;
var + 1023

Oscar Bonilla 27 Universidad Galileo


Un lenguaje simple con tipos
Un lenguaje que tiene una secuencia de
declaraciones seguidas de una sola expresin
P D; E
D D; D | id : T
T char | integer | array [ num ] of T
E literal | num | id | E + E | E [ E ]
Cules son las acciones del parser para este
lenguaje?

Oscar Bonilla 28 Universidad Galileo


Acciones del Parser
P D; E
D D; D
D id : T { addtype(id.entry, T.type); }
T char { T.type = char; }
T integer { T.type = integer; }
T array [ num ] of T1
{ T.type = array(T1.type, num.val); }

Oscar Bonilla 29 Universidad Galileo


Acciones del Parser
E literal { E.type = char; }
E num { E.type = integer; }
E id { E.type = lookup_type(id.name); }

Oscar Bonilla 30 Universidad Galileo


24

Acciones del Parser


E E1 + E2 { if E1.type == integer and
E2 .type == integer then
E.type = integer
else
E.type = type_error
}

Oscar Bonilla 31 Universidad Galileo


Acciones del Parser
E E1 [E2 ] { if E2.type == integer and
E1 .type == array(s, t) then
E.type = s
else
E.type = type_error
}

Oscar Bonilla 32 Universidad Galileo


Equivalencia de Tipos
Cmo sabemos si dos tipos son iguales?
Mismo entrada de tipo
Ejemplo:
int A[128];
foo(A);

foo(int B[128]) { }
Dos entradas de tipo distintas en dos tablas de smbolos
distintas
Pero deberan ser iguales

Oscar Bonilla 33 Universidad Galileo


Equivalencia Estructural
Si la expresin de tipo de dos tipos tiene la
misma construccin, entonces son equivalentes
Misma Construccin
Tipos base equivalentes
Mismo conjunto de constructores de tipo son
aplicados en el mismo orden (e.d. rbol de tipos
equivalente)

Oscar Bonilla 34 Universidad Galileo


Coercin de Tipos
Conversin implcita de un tipo a otro tipo
Ejemplo
int A;
float B;
B = B + A
Dos tipos de coercin
widening conversions
narrowing conversions

Oscar Bonilla 35 Universidad Galileo


Widening conversions
Conversiones sin prdida de informacin
Ejemplos:
integers a floats
shorts a longs

Oscar Bonilla 36 Universidad Galileo


Narrowing conversions
Conversiones que pueden perder informacin
Ejemplos:
integers a chars
longs a shorts
Raro en lenguajes

Oscar Bonilla 37 Universidad Galileo


Type casting
Conversin explcita de un tipo a otro
Tanto widening como narrowing
Ejemplo
int A;
float B;
A = A + (int)B
Typecasting ilimitado puede ser peligroso

Oscar Bonilla 38 Universidad Galileo


Pregunta:
Podemos asignarle un solo tipo a todas las
variables, funciones y operadores?
Qu hay de +, cul es su tipo?

Oscar Bonilla 39 Universidad Galileo


Overloading
Algunos operadores pueden tener ms de un tipo.
Ejemplo
int A, B, C;
float X, Y, Z;
A = A + B
X = X + Y
Complica el sistema de tipos
Ejemplo
A = A + X
Cul es el tipo de + ?

Oscar Bonilla 40 Universidad Galileo


Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 41 Universidad Galileo


Clases
Una clase es un tipo de datos abstracto
Contiene
Datos (campos)
Acciones (mtodos)
Restricciones de acceso
Cada instancia de una clase va a crear un objeto
separado
Con su propia copia de las variables instanciadas
(compos)
Comparte las acciones (mtodos)
Oscar Bonilla 42 Universidad Galileo
Clase Ejemplo
campo
class vehicle {
int num_wheels;
void print_num_wheels( ) { }
}
mtodo

vehicle A;
A.print_num_wheels( )

El Objeto es un parmetro implcito de la llamada del mtodo


Oscar Bonilla 43 Universidad Galileo
Herencia
Extiende las clases al permitirles relaciones de
supertipo/subtipo

Soporta reuso de cdigo incremental


Partes comnes en un supertipo comn
Diferencias individuales en cada subtipo

Oscar Bonilla 44 Universidad Galileo


Ejemplo de Herencia
class SUV extends vehicle {
int rollover_speed;
int get_rollover_speed( ) { }
void print_rollover_speed( ) { }
}
La clase SUV es una subclase de la clase vehicle
La clase vehicle es una superclase de la clase SUV
Una instancia (objeto) de la clase SUV contiene
Todos los campos de la clase vehicle
Todos los campos de la clase SUV
Los mtodos tanto en SUV como en vehicle son
visibles a la clase SUV
Oscar Bonilla 45 Universidad Galileo
Herencia
Herencia Sencilla
Cuando cada clase est restringida a tener una sola
superclase inmediata (mximo)

Herencia Mltiple
Cuando cada clase puede tener ms de una
superclase inmediata

Oscar Bonilla 46 Universidad Galileo


Jerarqua de Herencia
La relacin subclase/superclase
Definida por los extends
Puede ser modelada mediante un grafo acclico
dirigido (DAG)

Oscar Bonilla 47 Universidad Galileo


Jerarqua de Herencia
vehicle

SUV car motorbike

4wd 2wd 2-door 4-door 5-door

Car es un hijo de vehicle (subclase inmediata)


Vehicle es un padre de SUV (superclase inmediata)
4wd es un descendiente de vehicle (subclase)
Vehicle es un ancestro de 2-door (superclase)

Oscar Bonilla 48 Universidad Galileo


Reglas de Control de Acceso
Conjunto de tipos de control de acceso usados
por un lenguaje OO genrico (e.d. Espresso)
Visibilidad en scope
Acceso a datos
Acceso a mtodos pblicos
Acceso a mtodos privados

Muchos lenguajes OO tienen controles de


acceso ms complicados
Oscar Bonilla 49 Universidad Galileo
Visibilidad en Scope
Las variables y los campos de una clase pueden ser
declarados en cualquier parte en el programa en la que
se permita una declaracin y la definicin de la clase
est visible

Si un campo en una subclase y superclase usa el


mismo nombre
La resolucin de nombres se hace usando reglas de scope
Se trata el scope de la subclase dentro del scope de la
superclase

Oscar Bonilla 50 Universidad Galileo


Acceso a Datos
Los campos de datos de una clase slo pueden
ser accesados por los mtodos definidos en esa
clase
Una variacin ms permisiva:
Todos los mtodos de las subclases pueden accesar
los campos en la superclase

Oscar Bonilla 51 Universidad Galileo


Acceso a mtodos pblicos
Todos los mtodos pblicos de una clase
pueden ser invocados por cualquier mtodo que
pueda declarar una variable o un campo del tipo
de la clase

Oscar Bonilla 52 Universidad Galileo


Acceso a mtodos privados
Los mtodos privados de una clase slo pueden
ser invocados por:
Los mtodos de esa clase
Los mtodos de cualquier clase que sea
descendiente de la clase

Oscar Bonilla 53 Universidad Galileo


Ejemplo: control de acceso de C++
Una clase puede ser friend de otra clase
Los mtodos y campos pueden ser
private: visibles a funciones miembro y friends
protected: visibles a funciones miembro, friends, y
clases derivadas (y sus friends)
public: pueden ser usados por cualquier funcin

Oscar Bonilla 54 Universidad Galileo


Conversin automtica de tipos
Una expresin de una clase es coercionada a
una clase ancestro cuando se requiera
Pero no al revs
Llamado up-casting
Siempre legal porque la subclase contiene todos los
campos de la superclase
Down-casting
Esto es ms permisivo
Conversin explcita de una clase ancestro a una
clase descendiente
Slo tiene sentido si el objeto fue creado
inicialmente como en la subclase, pero despus
convertido a la superclase
No puede chequearse en tiempo de compilacin
Oscar Bonilla 55 Universidad Galileo
Mtodos Estticos vs. Dinmicos
Consecuencia de up-casting
Implementacin del mtodo declarado en una superclase
puede ser desconocida al momento de compilar
El mtodo es sobreescrito en una subclase
Variaciones de Lenguajes
Todos los mtodos no declarados estticos pueden ser up-casted
Slo los mtodos declarados virtuales pueden ser up-casted
Anlisis e implementacin de mtodos dinmicos
No se puede efectuar ningn chequeo semntico
Necesitamos soporte en tiempo de corrida (runtime) al generar el
cdigo

Oscar Bonilla 56 Universidad Galileo


Herencia vs. Agregacin
Una clase T2 es una agregacin de una clase T1
si T2 contiene uno o ms campos de tipo T1
A diferencia de la herencia, T2 no puede accesar
campos o mtodos privados en T1

Cundo heredear y cundo agregar?


heredar: T2 es un T1
agregar: T2 tiene un T1

Oscar Bonilla 57 Universidad Galileo


Ejemplo: Herencia vs. Agregacin
SUV es un vehculo
SUV tiene un motor

class vehiculo {

}

class SUV extends vehiculo {


motor power_plant;

}
Oscar Bonilla 58 Universidad Galileo
Herencia mltiple
Permite que una clase sea una extensin de
mltiples clases
Lleva a semnticas ms complicadas para subtipos

Oscar Bonilla 59 Universidad Galileo


Ejemplo de Herencia Mltiple
class vehicle {

}

class yuppie_toys {

}

class SUV extends vehicle, yuppie_toys {



}

Oscar Bonilla 60 Universidad Galileo


Jerarqua de Herencia Mltiple
toys

yuppie_toy teen_toy
vehicle

SUV car motorbike

4wd 2wd 2-door 4-door 5-door

Jerarqua de Herencia Mltiple es un DAG


Pregunta: S tanto yuppie_toys como vehicle tienen un mtodo
price() cundo SUV invoque a price, qu mtodo se invoca?

Oscar Bonilla 61 Universidad Galileo


Jerarqua de Herencia Mltiple
big_ticket_items

toys

yuppie_toy teen_toy
vehicle

SUV car motorbike

4wd 2wd 2-door 4-door 5-door

Es todava ms complicado cundo hay un ancestro


comn
Pregunta: Cuntas instancias de bti van a ser incluidas en
la clase SUV?
Oscar Bonilla 62 Universidad Galileo
Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 63 Universidad Galileo


Qu es un tipo polimrfico?
Procedimientos ordinarios permiten que el
cuerpo sea ejecutado con argumentos de tipo
fijo
Cada llamada a un procedimiento polimrfico
ejecuta el cuerpo con el tipo de los argumentos
Beneficios del polimorfismo
Reuso de Cdigo
Ejemplo
El mismo procedimiento puede aplicarse a una lista de
enteros o a una lista de strings

Oscar Bonilla 64 Universidad Galileo


Polimorfismo Paramtrico
Los procedimientos tienen tipos paramtrizados
Instanciamos el procedimiento con un tipo
determinado de datos
Templates en C++
Ejemplo:
template<class T> class linked_list_elem {
T elem; linked_list_elem * next;
...
}
lined_list_elem<int> integer_list;
lined_list_elem<foo> foo_list;

Oscar Bonilla 65 Universidad Galileo


Lecturas
Tigre
6.1, Captulos 7 y 8
Ballena
4.1, 4.2, 4.3, 4.4, 4.5
Dragn
Captulo 8

Oscar Bonilla 66 Universidad Galileo

Вам также может понравиться