de Tipos Oscar Bonilla 2 Universidad Galileo Resumen Introduccin Tablas de Smbolos Chequeo Semntico Chequeo de Tipos Semntica de un Programa Orientado a Objetos Tipos Polimrficos
Oscar Bonilla 3 Universidad Galileo Dnde estamos? Analizador Lxico (Scanner) Analizador Sintctico (Parser) Token Stream Arbol de Parseo Programa (character stream) Oscar Bonilla 4 Universidad Galileo Dnde estamos? Analizador Lxico (Scanner) Analizador Sintctico (Parser) Token Stream Arbol de Parseo Programa (character stream) Analizador Semntico Generador de Cdigo Intermedio Representacin Intermedia + Tabla de Smbolos Oscar Bonilla 5 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 6 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 7 Universidad Galileo Resumen Introduccin Tablas de Smbolos Chequeo Semntico Chequeo de Tipos Semntica de un Programa Orientado a Objetos Tipos Polimrficos
Oscar Bonilla 8 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 9 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 10 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 11 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 12 Universidad Galileo Resumen Introduccin Tablas de Smbolos Chequeo Semntico Chequeo de Tipos Semntica de un Programa Orientado a Objetos Tipos Polimrficos
Oscar Bonilla 13 Universidad Galileo Chequeo Semntico Chequeos estticos vs. Chequeos dinmicos Chequeos estticos Chequeos de control de flujo Chequeos de unicidad Chequeos de Tipo Oscar Bonilla 14 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 15 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 16 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 17 Universidad Galileo Chequeos Dinmicos Chequeos de lmites de arreglos Chequeo de dereferencia del Null Pointer Oscar Bonilla 18 Universidad Galileo Resumen Introduccin Tablas de Smbolos Chequeo Semntico Chequeo de Tipos Semntica de un Programa Orientado a Objetos Tipos Polimrficos
Oscar Bonilla 19 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 20 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 21 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 22 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 23 Universidad Galileo Expresiones de Tipo: Productos Si T 1 y T 2 son expresiones de tipo, T 1 T 2 es tambin una expresin de tipo
Oscar Bonilla 24 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 25 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 26 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 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 ] Programa Ejemplo var: integer; var + 1023 Oscar Bonilla 28 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 29 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 T 1
{ T.type = array(T 1 .type, num.val); } Oscar Bonilla 30 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 31 Universidad Galileo Acciones del Parser E E 1 + E 2 { if E 1 .type == integer and E 2 .type == integer then E.type = integer else E.type = type_error } 24 Oscar Bonilla 32 Universidad Galileo Acciones del Parser E E 1 [E 2 ] { if E 2 .type == integer and E 1 .type == array(s, t) then E.type = s else E.type = type_error }
Oscar Bonilla 33 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 34 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 35 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 36 Universidad Galileo Widening conversions Conversiones sin prdida de informacin Ejemplos: integers a floats shorts a longs Oscar Bonilla 37 Universidad Galileo Narrowing conversions Conversiones que pueden perder informacin Ejemplos: integers a chars longs a shorts Raro en lenguajes Oscar Bonilla 38 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 39 Universidad Galileo Pregunta: Podemos asignarle un solo tipo a todas las variables, funciones y operadores? Qu hay de +, cul es su tipo? Oscar Bonilla 40 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 41 Universidad Galileo Resumen Introduccin Tablas de Smbolos Chequeo Semntico Chequeo de Tipos Semntica de un Programa Orientado a Objetos Tipos Polimrficos
Oscar Bonilla 42 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 43 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 44 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 45 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 46 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 47 Universidad Galileo Jerarqua de Herencia La relacin subclase/superclase Definida por los extends Puede ser modelada mediante un grafo acclico dirigido (DAG) Oscar Bonilla 48 Universidad Galileo Jerarqua de Herencia 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) vehicle SUV car motorbike 4wd 2wd 4-door 2-door 5-door Oscar Bonilla 49 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 50 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 51 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 52 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 53 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 54 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 55 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 56 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 57 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 58 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 59 Universidad Galileo Herencia mltiple Permite que una clase sea una extensin de mltiples clases Lleva a semnticas ms complicadas para subtipos Oscar Bonilla 60 Universidad Galileo Ejemplo de Herencia Mltiple class vehicle {
}
class yuppie_toys {
}
class SUV extends vehicle, yuppie_toys {
} Oscar Bonilla 61 Universidad Galileo Jerarqua de Herencia Mltiple 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? vehicle SUV car motorbike 4wd 2wd 4-door 2-door 5-door toys yuppie_toy teen_toy Oscar Bonilla 62 Universidad Galileo Jerarqua de Herencia Mltiple Es todava ms complicado cundo hay un ancestro comn Pregunta: Cuntas instancias de bti van a ser incluidas en la clase SUV? vehicle SUV car motorbike 4wd 2wd 4-door 2-door 5-door toys yuppie_toy teen_toy big_ticket_items Oscar Bonilla 63 Universidad Galileo Resumen Introduccin Tablas de Smbolos Chequeo Semntico Chequeo de Tipos Semntica de un Programa Orientado a Objetos Tipos Polimrficos
Oscar Bonilla 64 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 65 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 66 Universidad Galileo Lecturas Tigre 6.1, Captulos 7 y 8 Ballena 4.1, 4.2, 4.3, 4.4, 4.5 Dragn Captulo 8