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

Oscar Bonilla

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

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

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

Universidad Galileo

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.

Oscar Bonilla

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

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 id

{ E.type = integer; }
{ 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
class vehicle { int num_wheels; void print_num_wheels( ) }

campo
{ }

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

vehicle

teen_toy

SUV
4wd 2wd 2-door

car
4-door 5-door

motorbike

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

teen_toy

SUV
4wd 2wd 2-door

car
4-door 5-door

motorbike

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

También podría gustarte