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

Más contenido relacionado

PDF
Ps2 u5
PPT
Clase15
PDF
Semantico.apun
PDF
Unidad4 analisis-semantico
PDF
Analisis semantico
PPTX
Clase8 2-explicacion analizador lexico-sintactico mini dev
PPTX
Analisis semantico
PDF
ANALIZADOR SINTACTICO: INTRODUCION, CONCEPTOS, CARACTERISTICAS
Ps2 u5
Clase15
Semantico.apun
Unidad4 analisis-semantico
Analisis semantico
Clase8 2-explicacion analizador lexico-sintactico mini dev
Analisis semantico
ANALIZADOR SINTACTICO: INTRODUCION, CONCEPTOS, CARACTERISTICAS

La actualidad más candente (20)

PDF
Automatas y compiladores analisis sintactico
PDF
Tr asem-ver
PPTX
Analizador Sintáctico
PDF
Analisis sintactico
PDF
Analizador Sintactico
PDF
Analizador sintactico
PDF
Clase6 ejemplo analisis lexico dev cpp
PDF
Clase6 conceptos del analisis lexico
PPTX
Análisis léxico y análisis sintáctico
PDF
Materia unidad compiladores
DOCX
Clase8 3 ejemplo analisis lexico-sintactico miniugb
PPSX
Actividad 2 programacion de sistemas
PPTX
Presentación 2014 profe gabriel
PDF
Automatas y compiladores clase1
PDF
Compiladores, Analisis Lexico Conceptos
PDF
Analizadores Sintácticos
PPT
Proceso de Compilacion
PDF
Clase analisis lexico
PPT
Analisis Lexico
PDF
Analisis sintactico
Automatas y compiladores analisis sintactico
Tr asem-ver
Analizador Sintáctico
Analisis sintactico
Analizador Sintactico
Analizador sintactico
Clase6 ejemplo analisis lexico dev cpp
Clase6 conceptos del analisis lexico
Análisis léxico y análisis sintáctico
Materia unidad compiladores
Clase8 3 ejemplo analisis lexico-sintactico miniugb
Actividad 2 programacion de sistemas
Presentación 2014 profe gabriel
Automatas y compiladores clase1
Compiladores, Analisis Lexico Conceptos
Analizadores Sintácticos
Proceso de Compilacion
Clase analisis lexico
Analisis Lexico
Analisis sintactico
Publicidad

Destacado (7)

PDF
Apuntes01
PPTX
Analizador sintáctico
PPTX
Analizador léxico
PDF
Tipos de datos variables expresiones
PPT
Tipos De Datos
PPT
Hardware Y Software
PPTX
1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...
Apuntes01
Analizador sintáctico
Analizador léxico
Tipos de datos variables expresiones
Tipos De Datos
Hardware Y Software
1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...
Publicidad

Similar a Download.php (20)

PPTX
PPTX
Tipos de datos
PDF
Tema 2 tipos de datos y expresiones en java por gio
PPTX
tipos de datos
PDF
Tipos de datos
PPTX
Conceptos de algoritmos
DOCX
Elementos de programas
PDF
PPTX
PDF
Tipos de datos
PPT
Lenguajes De Bajo Nivel
PPT
Tipos de dato y expresiones en C++
PPT
Programación II - Estructuras de control de flujo, Arreglos y Cadenas
PPTX
Elementos para Construir Algoritmos I Parte.pptx
PDF
3. lenguaje c-
PPT
Des.Apli.Net 02.Sintaxis C Sharp
PPSX
Ejercicio De Analisis Semantico
PPTX
PPT
C# Diferencias
PPT
Unidad 1.1 PROGRAMACION I
Tipos de datos
Tema 2 tipos de datos y expresiones en java por gio
tipos de datos
Tipos de datos
Conceptos de algoritmos
Elementos de programas
Tipos de datos
Lenguajes De Bajo Nivel
Tipos de dato y expresiones en C++
Programación II - Estructuras de control de flujo, Arreglos y Cadenas
Elementos para Construir Algoritmos I Parte.pptx
3. lenguaje c-
Des.Apli.Net 02.Sintaxis C Sharp
Ejercicio De Analisis Semantico
C# Diferencias
Unidad 1.1 PROGRAMACION I

Último (20)

PDF
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PPTX
la-historia-de-la-medicina Edna Silva.pptx
PDF
SAP Transportation Management para LSP, TM140 Col18
PPTX
Presentación de Redes de Datos modelo osi
PPTX
Propuesta BKP servidores con Acronis1.pptx
PDF
Tips de Seguridad para evitar clonar sus claves del portal bancario.pdf
PPT
introduccion a las_web en el 2025_mejoras.ppt
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PDF
capacitación de aire acondicionado Bgh r 410
PDF
Diapositiva proyecto de vida, materia catedra
PDF
Ronmy José Cañas Zambrano - Potenciando la tecnología en Venezuela.pdf
PDF
informe_fichas1y2_corregido.docx (2) (1).pdf
PPTX
modulo seguimiento 1 para iniciantes del
PPTX
Curso de generación de energía mediante sistemas solares
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PPTX
Presentacion de Alba Curso Auditores Internos ISO 19011
PPTX
Sesion 1 de microsoft power point - Clase 1
PDF
MANUAL de recursos humanos para ODOO.pdf
PPTX
Power Point Nicolás Carrasco (disertación Roblox).pptx
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
historia_web de la creacion de un navegador_presentacion.pptx
la-historia-de-la-medicina Edna Silva.pptx
SAP Transportation Management para LSP, TM140 Col18
Presentación de Redes de Datos modelo osi
Propuesta BKP servidores con Acronis1.pptx
Tips de Seguridad para evitar clonar sus claves del portal bancario.pdf
introduccion a las_web en el 2025_mejoras.ppt
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
capacitación de aire acondicionado Bgh r 410
Diapositiva proyecto de vida, materia catedra
Ronmy José Cañas Zambrano - Potenciando la tecnología en Venezuela.pdf
informe_fichas1y2_corregido.docx (2) (1).pdf
modulo seguimiento 1 para iniciantes del
Curso de generación de energía mediante sistemas solares
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Presentacion de Alba Curso Auditores Internos ISO 19011
Sesion 1 de microsoft power point - Clase 1
MANUAL de recursos humanos para ODOO.pdf
Power Point Nicolás Carrasco (disertación Roblox).pptx

Download.php

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