Está en la página 1de 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

Universidad Galileo

Dnde estamos?
Programa (character stream)
Analizador Lxico (Scanner)
Token Stream
Analizador Sintctico (Parser)
Arbol de Parseo

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

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

Por qu hacer anlisis semntico


Asegurarnos que el programa cumple con la
definicin del lenguaje de programacin
Proveer mensajes de error tiles al usuario

Resumen

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

Oscar Bonilla

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.

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

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

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

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

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?

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

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

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

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

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

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

Expresiones de Tipo: Nombres


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

Expresiones de Tipo: Productos


Si T1 y T2 son expresiones de tipo, T1 T2 es
tambin una expresin de tipo

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)

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

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)

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

Oscar Bonilla

{ if E1.type == integer and


E2 .type == integer then
E.type = integer
else
E.type = type_error
}

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

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)

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

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

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

Raro en lenguajes

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

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 + ?

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)

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

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

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

Jerarqua de Herencia
vehicle
SUV
4wd

car
2wd

2-door

4-door

motorbike
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

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

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

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

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

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

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

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

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

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

vehicle

SUV
4wd

teen_toy

car
2wd

2-door

4-door

motorbike
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

vehicle

SUV
4wd

teen_toy

car
2wd

2-door

4-door

motorbike
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

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;

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

También podría gustarte