Análisis Semántico y Chequeo de Tipos
Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Ch...
¿Dónde estamos? Oscar Bonilla   Universidad Galileo Analizador Léxico (Scanner ) Analizador Sintáctico (Parser ) Arbol de ...
¿Dónde estamos? Oscar Bonilla   Universidad Galileo Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Arbol de Pa...
¿Qué es la semántica de un programa? <ul><li>Sintáxis  </li></ul><ul><ul><li>Cómo se ve un programa </li></ul></ul><ul><ul...
Por qué hacer análisis semántico <ul><li>Asegurarnos que el programa cumple con la definición del lenguaje de programación...
Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Ch...
Tabla de Símbolos <ul><li>Un lugar para guardar toda la información adicional acerca del programa </li></ul><ul><ul><li>Re...
Scope <ul><li>Un nombre puede tener significados distintos en lugares distintos </li></ul><ul><ul><li>Tipos, variables, et...
Operaciones en la tabla de símbolos <ul><li>make_table(parent_table)    symbol_table </li></ul><ul><li>scope(id)    symb...
Siguiente Clase <ul><li>Todo acerca de tablas de símbolos </li></ul><ul><ul><li>Scopes y visibilidad </li></ul></ul><ul><u...
Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Ch...
Chequeo Semántico <ul><li>Chequeos estáticos vs. Chequeos dinámicos </li></ul><ul><li>Chequeos estáticos </li></ul><ul><ul...
Chequeos de Control de Flujo <ul><li>El control de flujo del programa es sensitivo al contexto </li></ul><ul><li>Ejemplos:...
Chequeos de Unicidad <ul><li>Uso (y mal uso) de identificadores </li></ul><ul><ul><li>No se puede representar en una CFG (...
Chequeos de Tipo <ul><li>Los chequeos semánticos más extensos </li></ul><ul><li>Ejemplos: </li></ul><ul><ul><li>Que el núm...
Chequeos Dinámicos <ul><li>Chequeos de límites de arreglos </li></ul><ul><li>Chequeo de dereferencia del Null Pointer </li...
Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Ch...
Sistemas de Tipos <ul><li>Un sistema de tipos es usado para el chequeo de tipos </li></ul><ul><li>Un sistema de tipos inco...
Expresiones de Tipos <ul><li>Un tipo compuesto es denotado por una expresión de tipo </li></ul><ul><li>Una expresión de ti...
Expresiones de Tipos: Tipos Básicos <ul><li>Tipos atómicos definidos por el lenguaje </li></ul><ul><li>Ejemplos: </li></ul...
Expresiones de Tipo: Nombres <ul><li>Ya que las expresiones de tipos pueden ser nombradas, un nombre de tipo es una expres...
Expresiones de Tipo: Productos <ul><li>Si T 1  y T 2  son expresiones de tipo, T 1     T 2  es también una expresión de t...
Expresiones de Tipo: Arrays <ul><li>Si T es una expresión de tipo, un  array(T, I)  es también una expresión de tipo </li>...
Expresiones de Tipo: Function Calls <ul><li>Matemáticamente una función mapea </li></ul><ul><ul><li>Elementos de un conjun...
Expresiones de Tipo: Otras <ul><li>Records  </li></ul><ul><ul><li>Estructuras y clases </li></ul></ul><ul><ul><li>Ejemplo ...
Un lenguaje simple con tipos <ul><li>Un lenguaje que tiene una secuencia de declaraciones seguidas de una sola expresión <...
Un lenguaje simple con tipos <ul><li>Un lenguaje que tiene una secuencia de declaraciones seguidas de una sola expresión <...
Acciones del Parser <ul><ul><li>P     D; E </li></ul></ul><ul><ul><li>D     D; D  </li></ul></ul><ul><ul><li>D     id  ...
Acciones del Parser <ul><ul><li>E    literal  { E.type = char; }  </li></ul></ul><ul><ul><li>E    num  { E.type = intege...
Acciones del Parser <ul><ul><li>E    E 1  + E 2   { if E 1 .type == integer and </li></ul></ul><ul><ul><li>  E 2  .type =...
Acciones del Parser <ul><ul><li>E    E 1  [E 2  ]  { if E 2 .type == integer and </li></ul></ul><ul><ul><li>  E 1  .type ...
Equivalencia de Tipos <ul><li>¿Cómo sabemos si dos tipos son iguales? </li></ul><ul><ul><li>Mismo entrada de tipo </li></u...
Equivalencia Estructural <ul><li>Si la expresión de tipo de dos tipos tiene la misma construcción, entonces son equivalent...
Coerción de Tipos <ul><li>Conversión implícita de un tipo a otro tipo </li></ul><ul><li>Ejemplo </li></ul><ul><ul><li>int ...
Widening conversions <ul><li>Conversiones sin pérdida de información </li></ul><ul><li>Ejemplos: </li></ul><ul><ul><li>int...
Narrowing conversions <ul><li>Conversiones que pueden perder información </li></ul><ul><li>Ejemplos: </li></ul><ul><ul><li...
Type casting <ul><li>Conversión explícita de un tipo a otro </li></ul><ul><li>Tanto widening como narrowing </li></ul><ul>...
Pregunta: <ul><li>¿Podemos asignarle un solo tipo a todas las variables, funciones y operadores? </li></ul><ul><li>¿Qué ha...
Overloading <ul><li>Algunos operadores pueden tener más de un tipo. </li></ul><ul><li>Ejemplo </li></ul><ul><ul><li>int A,...
Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Ch...
Clases <ul><li>Una clase es un tipo de datos abstracto </li></ul><ul><li>Contiene </li></ul><ul><ul><li>Datos  (campos) </...
Clase Ejemplo <ul><li>class vehicle { </li></ul><ul><li>int num_wheels; </li></ul><ul><li>void print_num_wheels( )  { … } ...
Herencia <ul><li>Extiende las clases al permitirles relaciones de supertipo/subtipo </li></ul><ul><li>Soporta reuso de cód...
Ejemplo de Herencia <ul><li>class SUV extends vehicle { </li></ul><ul><li>int rollover_speed; </li></ul><ul><li>int get_ro...
Herencia <ul><li>Herencia Sencilla </li></ul><ul><ul><li>Cuando cada clase está restringida a tener una sola superclase in...
Jerarquía de Herencia <ul><li>La relación subclase/superclase </li></ul><ul><ul><li>Definida por los “extends” </li></ul><...
Jerarquía de Herencia <ul><li>Car es un hijo de vehicle (subclase inmediata) </li></ul><ul><li>Vehicle es un padre de SUV ...
Reglas de Control de Acceso <ul><li>Conjunto de tipos de control de acceso usados por un lenguaje OO genérico (e.d. Espres...
Visibilidad en Scope <ul><li>Las variables y los campos de una clase pueden ser declarados en cualquier parte en el progra...
Acceso a Datos <ul><li>Los campos de datos de una clase sólo pueden ser accesados por los métodos definidos en esa clase <...
Acceso a métodos públicos <ul><li>Todos los métodos públicos de una clase pueden ser invocados por cualquier método que pu...
Acceso a métodos privados <ul><li>Los métodos privados de una clase sólo pueden ser invocados por: </li></ul><ul><ul><li>L...
Ejemplo: control de acceso de C++ <ul><li>Una clase puede ser  friend  de otra clase </li></ul><ul><li>Los métodos y campo...
Conversión automática de tipos <ul><li>Una expresión de una clase es coercionada a una clase ancestro cuando se requiera <...
Métodos Estáticos vs. Dinámicos <ul><li>Consecuencia de up-casting </li></ul><ul><ul><li>Implementación del método declara...
Herencia vs. Agregación <ul><li>Una clase T2 es una agregación de una clase T1 si T2 contiene uno o más campos de tipo T1 ...
Ejemplo: Herencia vs. Agregación <ul><li>SUV es un vehículo </li></ul><ul><li>SUV tiene un motor </li></ul>Oscar Bonilla  ...
Herencia múltiple <ul><li>Permite que una clase sea una extensión de múltiples clases </li></ul><ul><ul><li>Lleva a semánt...
Ejemplo de Herencia Múltiple <ul><li>class vehicle { </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>class yuppi...
Jerarquía de Herencia Múltiple <ul><li>Jerarquía de Herencia Múltiple es un DAG </li></ul><ul><li>Pregunta: ¿Sí tanto yupp...
Jerarquía de Herencia Múltiple <ul><li>Es todavía más complicado cuándo hay un ancestro común </li></ul><ul><li>Pregunta: ...
Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Ch...
¿Qué es un tipo polimórfico? <ul><li>Procedimientos ordinarios permiten que el cuerpo sea ejecutado con argumentos de tipo...
Polimorfismo Paramétrico <ul><li>Los procedimientos tienen tipos paramétrizados </li></ul><ul><li>Instanciamos el procedim...
Lecturas <ul><li>Tigre </li></ul><ul><ul><li>6.1, Capítulos 7 y 8 </li></ul></ul><ul><li>Ballena </li></ul><ul><ul><li>4.1...
Upcoming SlideShare
Loading in …5
×

Download.php

954 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
954
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Download.php

  1. 1. Análisis Semántico y Chequeo de Tipos
  2. 2. Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Chequeo de Tipos </li></ul><ul><li>Semántica de un Programa Orientado a Objetos </li></ul><ul><li>Tipos Polimórficos </li></ul>Oscar Bonilla Universidad Galileo
  3. 3. ¿Dónde estamos? Oscar Bonilla Universidad Galileo Analizador Léxico (Scanner ) Analizador Sintáctico (Parser ) Arbol de Parseo Token Stream Programa (character stream)
  4. 4. ¿Dónde estamos? Oscar Bonilla Universidad Galileo Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Arbol de Parseo Analizador Semántico Generador de Código Intermedio Representación Intermedia + Tabla de Símbolos Token Stream Programa (character stream)
  5. 5. ¿Qué es la semántica de un programa? <ul><li>Sintáxis </li></ul><ul><ul><li>Cómo se ve un programa </li></ul></ul><ul><ul><li>Representación textual o estructura </li></ul></ul><ul><ul><li>Es posible dar una definición matemática precisa </li></ul></ul><ul><li>Semántica </li></ul><ul><ul><li>Cuál es el significado del programa </li></ul></ul><ul><ul><li>Es más difícil dar una definición matemática precisa </li></ul></ul>Oscar Bonilla Universidad Galileo
  6. 6. Por qué hacer análisis semántico <ul><li>Asegurarnos que el programa cumple con la definición del lenguaje de programación </li></ul><ul><li>Proveer mensajes de error útiles al usuario </li></ul>Oscar Bonilla Universidad Galileo
  7. 7. Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Chequeo de Tipos </li></ul><ul><li>Semántica de un Programa Orientado a Objetos </li></ul><ul><li>Tipos Polimórficos </li></ul>Oscar Bonilla Universidad Galileo
  8. 8. Tabla de Símbolos <ul><li>Un lugar para guardar toda la información adicional acerca del programa </li></ul><ul><ul><li>Representaciones intermedias: expresiones, statements, control de flujo, etc. </li></ul></ul><ul><ul><li>Tabla de Símbolos: Tipos, variables, scope, etc. </li></ul></ul>Oscar Bonilla Universidad Galileo
  9. 9. Scope <ul><li>Un nombre puede tener significados distintos en lugares distintos </li></ul><ul><ul><li>Tipos, variables, etc tiene scope (ámbito) </li></ul></ul><ul><li>Tenemos que mantener una tabla de símbolos para cada scope </li></ul>Oscar Bonilla Universidad Galileo
  10. 10. Operaciones en la tabla de símbolos <ul><li>make_table(parent_table)  symbol_table </li></ul><ul><li>scope(id)  symbol_table </li></ul><ul><li>lookup_variable(id, symbol_table)  variable </li></ul><ul><li>lookup_type(id, symbol_table)  type </li></ul><ul><li>get_type(variable)  type </li></ul><ul><li>add_type(id, symbol_table, type)  type </li></ul><ul><li>add_variable(id, symbol_table, type)  variable </li></ul>Oscar Bonilla Universidad Galileo
  11. 11. Siguiente Clase <ul><li>Todo acerca de tablas de símbolos </li></ul><ul><ul><li>Scopes y visibilidad </li></ul></ul><ul><ul><li>Información que se mantiene en la tabla de símbolos </li></ul></ul><ul><ul><li>Implementación de tablas de símbolos </li></ul></ul>Oscar Bonilla Universidad Galileo
  12. 12. Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Chequeo de Tipos </li></ul><ul><li>Semántica de un Programa Orientado a Objetos </li></ul><ul><li>Tipos Polimórficos </li></ul>Oscar Bonilla Universidad Galileo
  13. 13. Chequeo Semántico <ul><li>Chequeos estáticos vs. Chequeos dinámicos </li></ul><ul><li>Chequeos estáticos </li></ul><ul><ul><li>Chequeos de control de flujo </li></ul></ul><ul><ul><li>Chequeos de unicidad </li></ul></ul><ul><ul><li>Chequeos de Tipo </li></ul></ul>Oscar Bonilla Universidad Galileo
  14. 14. Chequeos de Control de Flujo <ul><li>El control de flujo del programa es sensitivo al contexto </li></ul><ul><li>Ejemplos: </li></ul><ul><ul><li>Declaración de una variable debe ser visible al usarla (en scope) </li></ul></ul><ul><ul><li>Declaración de una variable debe estar ántes de usarla </li></ul></ul><ul><ul><li>Cada camino de salida (exit path) retorna un valor del tipo correcto </li></ul></ul><ul><li>¿Qué más? </li></ul>Oscar Bonilla Universidad Galileo
  15. 15. Chequeos de Unicidad <ul><li>Uso (y mal uso) de identificadores </li></ul><ul><ul><li>No se puede representar en una CFG (mismo token) </li></ul></ul><ul><li>Ejemplos: </li></ul><ul><ul><li>Ningún identificador puede ser usado para dos definiciones diferentes en el mismo scope </li></ul></ul>Oscar Bonilla Universidad Galileo
  16. 16. Chequeos de Tipo <ul><li>Los chequeos semánticos más extensos </li></ul><ul><li>Ejemplos: </li></ul><ul><ul><li>Que el número de argumentos haga match con el número de parámetros formales y que los tipos correspondientes sean equivalentes </li></ul></ul><ul><ul><li>Si se llama como expresión, debe retornar un tipo </li></ul></ul><ul><ul><li>Cada acceso a una variable debe hacer match con la declaración (arreglo, estructura, etc.) </li></ul></ul><ul><ul><li>Los identificadores en una expresión deben ser “evaluables” </li></ul></ul><ul><ul><li>LHS de una asignación debe ser “asignable” </li></ul></ul><ul><ul><li>En una expresión los tipos de las variables, tipos de retorno de métodos y de operadores deben ser “compatibles” </li></ul></ul>Oscar Bonilla Universidad Galileo
  17. 17. Chequeos Dinámicos <ul><li>Chequeos de límites de arreglos </li></ul><ul><li>Chequeo de dereferencia del Null Pointer </li></ul>Oscar Bonilla Universidad Galileo
  18. 18. Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Chequeo de Tipos </li></ul><ul><li>Semántica de un Programa Orientado a Objetos </li></ul><ul><li>Tipos Polimórficos </li></ul>Oscar Bonilla Universidad Galileo
  19. 19. Sistemas de Tipos <ul><li>Un sistema de tipos es usado para el chequeo de tipos </li></ul><ul><li>Un sistema de tipos incorpora </li></ul><ul><ul><li>Construcciones estáticas del lenguaje </li></ul></ul><ul><ul><li>Noción de tipos </li></ul></ul><ul><ul><li>Reglas para asignar tipos a construcciones del lenguaje </li></ul></ul>Oscar Bonilla Universidad Galileo
  20. 20. Expresiones de Tipos <ul><li>Un tipo compuesto es denotado por una expresión de tipo </li></ul><ul><li>Una expresión de tipo es </li></ul><ul><ul><li>Un tipo básico </li></ul></ul><ul><ul><li>La aplicación de un constructor de tipo a otras expresiones de tipo </li></ul></ul>Oscar Bonilla Universidad Galileo
  21. 21. Expresiones de Tipos: Tipos Básicos <ul><li>Tipos atómicos definidos por el lenguaje </li></ul><ul><li>Ejemplos: </li></ul><ul><ul><li>Enteros </li></ul></ul><ul><ul><li>Booleanos </li></ul></ul><ul><ul><li>floats </li></ul></ul><ul><ul><li>caracteres </li></ul></ul><ul><li>type_error </li></ul><ul><ul><li>Tipo especial que produce un error </li></ul></ul><ul><li>void </li></ul><ul><ul><li>Tipo básico que denota “la ausencia de un valor” </li></ul></ul>Oscar Bonilla Universidad Galileo
  22. 22. Expresiones de Tipo: Nombres <ul><li>Ya que las expresiones de tipos pueden ser nombradas, un nombre de tipo es una expresión de tipo </li></ul>Oscar Bonilla Universidad Galileo
  23. 23. Expresiones de Tipo: Productos <ul><li>Si T 1 y T 2 son expresiones de tipo, T 1  T 2 es también una expresión de tipo </li></ul>Oscar Bonilla Universidad Galileo
  24. 24. Expresiones de Tipo: Arrays <ul><li>Si T es una expresión de tipo, un array(T, I) es también una expresión de tipo </li></ul><ul><ul><li>I es una constante entera que denota el número de elementos de tipo T </li></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul><ul><ul><ul><li>int foo[128]; </li></ul></ul></ul><ul><ul><ul><li>array(integer, 128) </li></ul></ul></ul>Oscar Bonilla Universidad Galileo
  25. 25. Expresiones de Tipo: Function Calls <ul><li>Matemáticamente una función mapea </li></ul><ul><ul><li>Elementos de un conjunto (el dominio) </li></ul></ul><ul><ul><li>A elementos de otro conjunto (el contradominio) </li></ul></ul><ul><li>Ejemplo </li></ul><ul><ul><li>int foobar(int a, boolean b, int c) </li></ul></ul><ul><ul><li>integer  boolean  integer  integer </li></ul></ul>Oscar Bonilla Universidad Galileo
  26. 26. Expresiones de Tipo: Otras <ul><li>Records </li></ul><ul><ul><li>Estructuras y clases </li></ul></ul><ul><ul><li>Ejemplo </li></ul></ul><ul><ul><ul><li>class { int i; int j;} </li></ul></ul></ul><ul><ul><ul><li>integer  integer </li></ul></ul></ul><ul><li>Lenguajes Funcionales </li></ul><ul><ul><li>Funciones que toman funciones y retornan funciones </li></ul></ul><ul><ul><li>Ejemplo </li></ul></ul><ul><ul><ul><li>(integer  integer)  integer  (integer  integer) </li></ul></ul></ul>Oscar Bonilla Universidad Galileo
  27. 27. Un lenguaje simple con tipos <ul><li>Un lenguaje que tiene una secuencia de declaraciones seguidas de una sola expresión </li></ul><ul><ul><li>P  D; E </li></ul></ul><ul><ul><li>D  D; D | id : T </li></ul></ul><ul><ul><li>T  char | integer | array [ num ] of T </li></ul></ul><ul><ul><li>E  literal | num | id | E + E | E [ E ] </li></ul></ul><ul><li>Programa Ejemplo </li></ul><ul><ul><li>var: integer; </li></ul></ul><ul><ul><li>var + 1023 </li></ul></ul>Oscar Bonilla Universidad Galileo
  28. 28. Un lenguaje simple con tipos <ul><li>Un lenguaje que tiene una secuencia de declaraciones seguidas de una sola expresión </li></ul><ul><ul><li>P  D; E </li></ul></ul><ul><ul><li>D  D; D | id : T </li></ul></ul><ul><ul><li>T  char | integer | array [ num ] of T </li></ul></ul><ul><ul><li>E  literal | num | id | E + E | E [ E ] </li></ul></ul><ul><li>¿Cuáles son las acciones del parser para este lenguaje? </li></ul>Oscar Bonilla Universidad Galileo
  29. 29. Acciones del Parser <ul><ul><li>P  D; E </li></ul></ul><ul><ul><li>D  D; D </li></ul></ul><ul><ul><li>D  id : T { addtype(id.entry, T.type); } </li></ul></ul><ul><ul><li>T  char { T.type = char; } </li></ul></ul><ul><ul><li>T  integer { T.type = integer; } </li></ul></ul><ul><ul><li>T  array [ num ] of T 1 { T.type = array(T 1 .type, num.val); } </li></ul></ul>Oscar Bonilla Universidad Galileo
  30. 30. Acciones del Parser <ul><ul><li>E  literal { E.type = char; } </li></ul></ul><ul><ul><li>E  num { E.type = integer; } </li></ul></ul><ul><ul><li>E  id { E.type = lookup_type(id.name); } </li></ul></ul>Oscar Bonilla Universidad Galileo
  31. 31. Acciones del Parser <ul><ul><li>E  E 1 + E 2 { if E 1 .type == integer and </li></ul></ul><ul><ul><li> E 2 .type == integer then </li></ul></ul><ul><ul><li>E.type = integer </li></ul></ul><ul><ul><li> else </li></ul></ul><ul><ul><li>E.type = type_error </li></ul></ul><ul><ul><li>} </li></ul></ul>Oscar Bonilla Universidad Galileo 24
  32. 32. Acciones del Parser <ul><ul><li>E  E 1 [E 2 ] { if E 2 .type == integer and </li></ul></ul><ul><ul><li> E 1 .type == array(s, t) then </li></ul></ul><ul><ul><li>E.type = s </li></ul></ul><ul><ul><li> else </li></ul></ul><ul><ul><li>E.type = type_error </li></ul></ul><ul><ul><li>} </li></ul></ul>Oscar Bonilla Universidad Galileo
  33. 33. Equivalencia de Tipos <ul><li>¿Cómo sabemos si dos tipos son iguales? </li></ul><ul><ul><li>Mismo entrada de tipo </li></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul><ul><ul><ul><li>int A[128]; </li></ul></ul></ul><ul><ul><ul><li>foo(A); </li></ul></ul></ul><ul><ul><ul><li>foo(int B[128]) { … } </li></ul></ul></ul><ul><ul><ul><li>Dos entradas de tipo distintas en dos tablas de símbolos distintas </li></ul></ul></ul><ul><ul><ul><li>Pero deberían ser iguales </li></ul></ul></ul>Oscar Bonilla Universidad Galileo
  34. 34. Equivalencia Estructural <ul><li>Si la expresión de tipo de dos tipos tiene la misma construcción, entonces son equivalentes </li></ul><ul><li>“ Misma Construcción” </li></ul><ul><ul><li>Tipos base equivalentes </li></ul></ul><ul><ul><li>Mismo conjunto de constructores de tipo son aplicados en el mismo orden (e.d. árbol de tipos equivalente) </li></ul></ul>Oscar Bonilla Universidad Galileo
  35. 35. Coerción de Tipos <ul><li>Conversión implícita de un tipo a otro tipo </li></ul><ul><li>Ejemplo </li></ul><ul><ul><li>int A; </li></ul></ul><ul><ul><li>float B; </li></ul></ul><ul><ul><li>B = B + A </li></ul></ul><ul><li>Dos tipos de coerción </li></ul><ul><ul><li>widening conversions </li></ul></ul><ul><ul><li>narrowing conversions </li></ul></ul>Oscar Bonilla Universidad Galileo
  36. 36. Widening conversions <ul><li>Conversiones sin pérdida de información </li></ul><ul><li>Ejemplos: </li></ul><ul><ul><li>integers a floats </li></ul></ul><ul><ul><li>shorts a longs </li></ul></ul>Oscar Bonilla Universidad Galileo
  37. 37. Narrowing conversions <ul><li>Conversiones que pueden perder información </li></ul><ul><li>Ejemplos: </li></ul><ul><ul><li>integers a chars </li></ul></ul><ul><ul><li>longs a shorts </li></ul></ul><ul><li>Raro en lenguajes </li></ul>Oscar Bonilla Universidad Galileo
  38. 38. Type casting <ul><li>Conversión explícita de un tipo a otro </li></ul><ul><li>Tanto widening como narrowing </li></ul><ul><li>Ejemplo </li></ul><ul><ul><li>int A; </li></ul></ul><ul><ul><li>float B; </li></ul></ul><ul><ul><li>A = A + (int)B </li></ul></ul><ul><li>Typecasting ilimitado puede ser peligroso </li></ul>Oscar Bonilla Universidad Galileo
  39. 39. Pregunta: <ul><li>¿Podemos asignarle un solo tipo a todas las variables, funciones y operadores? </li></ul><ul><li>¿Qué hay de +, cuál es su tipo? </li></ul>Oscar Bonilla Universidad Galileo
  40. 40. Overloading <ul><li>Algunos operadores pueden tener más de un tipo. </li></ul><ul><li>Ejemplo </li></ul><ul><ul><li>int A, B, C; </li></ul></ul><ul><ul><li>float X, Y, Z; </li></ul></ul><ul><ul><li>A = A + B </li></ul></ul><ul><ul><li>X = X + Y </li></ul></ul><ul><li>Complica el sistema de tipos </li></ul><ul><ul><li>Ejemplo </li></ul></ul><ul><ul><li>A = A + X </li></ul></ul><ul><ul><ul><li>¿Cuál es el tipo de + ? </li></ul></ul></ul>Oscar Bonilla Universidad Galileo
  41. 41. Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Chequeo de Tipos </li></ul><ul><li>Semántica de un Programa Orientado a Objetos </li></ul><ul><li>Tipos Polimórficos </li></ul>Oscar Bonilla Universidad Galileo
  42. 42. Clases <ul><li>Una clase es un tipo de datos abstracto </li></ul><ul><li>Contiene </li></ul><ul><ul><li>Datos (campos) </li></ul></ul><ul><ul><li>Acciones (métodos) </li></ul></ul><ul><ul><li>Restricciones de acceso </li></ul></ul><ul><li>Cada instancia de una clase va a crear un objeto separado </li></ul><ul><ul><li>Con su propia copia de las variables instanciadas (campos) </li></ul></ul><ul><ul><li>Comparte las acciones (métodos) </li></ul></ul>Oscar Bonilla Universidad Galileo
  43. 43. Clase Ejemplo <ul><li>class vehicle { </li></ul><ul><li>int num_wheels; </li></ul><ul><li>void print_num_wheels( ) { … } </li></ul><ul><li>} </li></ul>Oscar Bonilla Universidad Galileo vehicle A; A.print_num_wheels( ) campo método <ul><li>El Objeto es un parámetro implícito de la llamada del método </li></ul>
  44. 44. Herencia <ul><li>Extiende las clases al permitirles relaciones de supertipo/subtipo </li></ul><ul><li>Soporta reuso de código incremental </li></ul><ul><ul><li>Partes comúnes en un supertipo común </li></ul></ul><ul><ul><li>Diferencias individuales en cada subtipo </li></ul></ul>Oscar Bonilla Universidad Galileo
  45. 45. Ejemplo de Herencia <ul><li>class SUV extends vehicle { </li></ul><ul><li>int rollover_speed; </li></ul><ul><li>int get_rollover_speed( ) { … } </li></ul><ul><li>void print_rollover_speed( ) { … } </li></ul><ul><li>} </li></ul>Oscar Bonilla Universidad Galileo <ul><li>La clase SUV es una subclase de la clase vehicle </li></ul><ul><li>La clase vehicle es una superclase de la clase SUV </li></ul><ul><li>Una instancia (objeto) de la clase SUV contiene </li></ul><ul><ul><li>Todos los campos de la clase vehicle </li></ul></ul><ul><ul><li>Todos los campos de la clase SUV </li></ul></ul><ul><li>Los métodos tanto en SUV como en vehicle son visibles a la clase SUV </li></ul>
  46. 46. Herencia <ul><li>Herencia Sencilla </li></ul><ul><ul><li>Cuando cada clase está restringida a tener una sola superclase inmediata (máximo) </li></ul></ul><ul><li>Herencia Múltiple </li></ul><ul><ul><li>Cuando cada clase puede tener más de una superclase inmediata </li></ul></ul>Oscar Bonilla Universidad Galileo
  47. 47. Jerarquía de Herencia <ul><li>La relación subclase/superclase </li></ul><ul><ul><li>Definida por los “extends” </li></ul></ul><ul><ul><li>Puede ser modelada mediante un grafo acíclico dirigido (DAG) </li></ul></ul>Oscar Bonilla Universidad Galileo
  48. 48. Jerarquía de Herencia <ul><li>Car es un hijo de vehicle (subclase inmediata) </li></ul><ul><li>Vehicle es un padre de SUV (superclase inmediata) </li></ul><ul><li>4wd es un descendiente de vehicle (subclase) </li></ul><ul><li>Vehicle es un ancestro de 2-door (superclase) </li></ul>Oscar Bonilla Universidad Galileo vehicle SUV car motorbike 4wd 2wd 4-door 2-door 5-door
  49. 49. Reglas de Control de Acceso <ul><li>Conjunto de tipos de control de acceso usados por un lenguaje OO genérico (e.d. Espresso) </li></ul><ul><ul><li>Visibilidad en scope </li></ul></ul><ul><ul><li>Acceso a datos </li></ul></ul><ul><ul><li>Acceso a métodos públicos </li></ul></ul><ul><ul><li>Acceso a métodos privados </li></ul></ul><ul><li>Muchos lenguajes OO tienen controles de acceso más complicados </li></ul>Oscar Bonilla Universidad Galileo
  50. 50. Visibilidad en Scope <ul><li>Las variables y los campos de una clase pueden ser declarados en cualquier parte en el programa en la que se permita una declaración y la definición de la clase esté visible </li></ul><ul><li>Si un campo en una subclase y superclase usa el mismo nombre </li></ul><ul><ul><li>La resolución de nombres se hace usando reglas de scope </li></ul></ul><ul><ul><li>Se trata el scope de la subclase dentro del scope de la superclase </li></ul></ul>Oscar Bonilla Universidad Galileo
  51. 51. Acceso a Datos <ul><li>Los campos de datos de una clase sólo pueden ser accesados por los métodos definidos en esa clase </li></ul><ul><li>Una variación más permisiva: </li></ul><ul><ul><li>Todos los métodos de las subclases pueden accesar los campos en la superclase </li></ul></ul>Oscar Bonilla Universidad Galileo
  52. 52. Acceso a métodos públicos <ul><li>Todos los métodos públicos de una clase pueden ser invocados por cualquier método que pueda declarar una variable o un campo del tipo de la clase </li></ul>Oscar Bonilla Universidad Galileo
  53. 53. Acceso a métodos privados <ul><li>Los métodos privados de una clase sólo pueden ser invocados por: </li></ul><ul><ul><li>Los métodos de esa clase </li></ul></ul><ul><ul><li>Los métodos de cualquier clase que sea descendiente de la clase </li></ul></ul>Oscar Bonilla Universidad Galileo
  54. 54. Ejemplo: control de acceso de C++ <ul><li>Una clase puede ser friend de otra clase </li></ul><ul><li>Los métodos y campos pueden ser </li></ul><ul><ul><li>private: visibles a funciones miembro y friends </li></ul></ul><ul><ul><li>protected: visibles a funciones miembro, friends, y clases derivadas (y sus friends) </li></ul></ul><ul><ul><li>public: pueden ser usados por cualquier función </li></ul></ul>Oscar Bonilla Universidad Galileo
  55. 55. Conversión automática de tipos <ul><li>Una expresión de una clase es coercionada a una clase ancestro cuando se requiera </li></ul><ul><ul><li>Pero no al revés </li></ul></ul><ul><ul><li>Llamado “up-casting” </li></ul></ul><ul><ul><li>Siempre legal porque la subclase contiene todos los campos de la superclase </li></ul></ul><ul><li>Down-casting </li></ul><ul><ul><li>Esto es más permisivo </li></ul></ul><ul><ul><li>Conversión explícita de una clase ancestro a una clase descendiente </li></ul></ul><ul><ul><li>Sólo tiene sentido si el objeto fue creado inicialmente como en la subclase, pero después convertido a la superclase </li></ul></ul><ul><ul><li>No puede chequearse en tiempo de compilación </li></ul></ul>Oscar Bonilla Universidad Galileo
  56. 56. Métodos Estáticos vs. Dinámicos <ul><li>Consecuencia de up-casting </li></ul><ul><ul><li>Implementación del método declarado en una superclase puede ser desconocida al momento de compilar </li></ul></ul><ul><ul><li>El método es sobreescrito en una subclase </li></ul></ul><ul><ul><li>Variaciones de Lenguajes </li></ul></ul><ul><ul><ul><li>Todos los métodos no declarados estáticos pueden ser up-casted </li></ul></ul></ul><ul><ul><ul><li>Sólo los métodos declarados virtuales pueden ser up-casted </li></ul></ul></ul><ul><ul><li>Análisis e implementación de métodos dinámicos </li></ul></ul><ul><ul><ul><li>No se puede efectuar ningún chequeo semántico </li></ul></ul></ul><ul><ul><ul><li>Necesitamos soporte en tiempo de corrida (runtime) al generar el código </li></ul></ul></ul>Oscar Bonilla Universidad Galileo
  57. 57. Herencia vs. Agregación <ul><li>Una clase T2 es una agregación de una clase T1 si T2 contiene uno o más campos de tipo T1 </li></ul><ul><ul><li>A diferencia de la herencia, T2 no puede accesar campos o métodos privados en T1 </li></ul></ul><ul><li>¿Cuándo heredear y cuándo agregar? </li></ul><ul><ul><li>heredar: T2 es un T1 </li></ul></ul><ul><ul><li>agregar: T2 tiene un T1 </li></ul></ul>Oscar Bonilla Universidad Galileo
  58. 58. Ejemplo: Herencia vs. Agregación <ul><li>SUV es un vehículo </li></ul><ul><li>SUV tiene un motor </li></ul>Oscar Bonilla Universidad Galileo <ul><li>class vehiculo { </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>class SUV extends vehiculo { </li></ul><ul><li>motor power_plant; </li></ul><ul><li>… </li></ul><ul><li>} </li></ul>
  59. 59. Herencia múltiple <ul><li>Permite que una clase sea una extensión de múltiples clases </li></ul><ul><ul><li>Lleva a semánticas más complicadas para subtipos </li></ul></ul>Oscar Bonilla Universidad Galileo
  60. 60. Ejemplo de Herencia Múltiple <ul><li>class vehicle { </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>class yuppie_toys { </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>class SUV extends vehicle, yuppie_toys { </li></ul><ul><li>… </li></ul><ul><li>} </li></ul>Oscar Bonilla Universidad Galileo
  61. 61. Jerarquía de Herencia Múltiple <ul><li>Jerarquía de Herencia Múltiple es un DAG </li></ul><ul><li>Pregunta: ¿Sí tanto yuppie_toys como vehicle tienen un método price() cuándo SUV invoque a price, qué método se invoca? </li></ul>Oscar Bonilla Universidad Galileo vehicle SUV car motorbike 4wd 2wd 4-door 2-door 5-door toys yuppie_toy teen_toy
  62. 62. Jerarquía de Herencia Múltiple <ul><li>Es todavía más complicado cuándo hay un ancestro común </li></ul><ul><li>Pregunta: ¿Cuántas instancias de bti van a ser incluidas en la clase SUV? </li></ul>Oscar Bonilla Universidad Galileo vehicle SUV car motorbike 4wd 2wd 4-door 2-door 5-door toys yuppie_toy teen_toy big_ticket_items
  63. 63. Resumen <ul><li>Introducción </li></ul><ul><li>Tablas de Símbolos </li></ul><ul><li>Chequeo Semántico </li></ul><ul><li>Chequeo de Tipos </li></ul><ul><li>Semántica de un Programa Orientado a Objetos </li></ul><ul><li>Tipos Polimórficos </li></ul>Oscar Bonilla Universidad Galileo
  64. 64. ¿Qué es un tipo polimórfico? <ul><li>Procedimientos ordinarios permiten que el cuerpo sea ejecutado con argumentos de tipo fijo </li></ul><ul><li>Cada llamada a un procedimiento polimórfico ejecuta el cuerpo con el tipo de los argumentos </li></ul><ul><li>Beneficios del polimorfismo </li></ul><ul><ul><li>Reuso de Código </li></ul></ul><ul><ul><li>Ejemplo </li></ul></ul><ul><ul><ul><li>El mismo procedimiento puede aplicarse a una lista de enteros o a una lista de strings </li></ul></ul></ul>Oscar Bonilla Universidad Galileo
  65. 65. Polimorfismo Paramétrico <ul><li>Los procedimientos tienen tipos paramétrizados </li></ul><ul><li>Instanciamos el procedimiento con un tipo determinado de datos </li></ul><ul><li>Templates en C++ </li></ul><ul><li>Ejemplo: </li></ul><ul><ul><li>template<class T> class linked_list_elem { </li></ul></ul><ul><ul><li>T elem; linked_list_elem * next; </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>lined_list_elem<int> integer_list; </li></ul></ul><ul><ul><li>lined_list_elem<foo> foo_list; </li></ul></ul>Oscar Bonilla Universidad Galileo
  66. 66. Lecturas <ul><li>Tigre </li></ul><ul><ul><li>6.1, Capítulos 7 y 8 </li></ul></ul><ul><li>Ballena </li></ul><ul><ul><li>4.1, 4.2, 4.3, 4.4, 4.5 </li></ul></ul><ul><li>Dragón </li></ul><ul><ul><li>Capítulo 8 </li></ul></ul>Oscar Bonilla Universidad Galileo

×