Interpretando objetos

Slides:



Advertisements
Presentaciones similares
CJ02 – Técnicas avanzadas en java 1.4 y 5.0
Advertisements

IBD Curso 2007 Clase 2.
IBD Plan 90 y 2003 Clase 10.
DATSI, FI, UPM José M. Peña Programación en C DATSI, FI, UPM José M. Peña Programación en C.
Algoritmos y Programas
MODELOS ORIENTADOS A OBJETOS
Compiladores e intérpretes Análisis Sintáctico III
Cuestiones y problemas
Curso de java básico (scjp)
Lenguaje de programación Java
PROGRAMACIÓN PARALELA Tema 5: Análisis de algoritmos paralelos
Clases Extendidas La clase extendida hereda los campos y métodos de la clase de la cual extiende. La clase original se conoce como superclase y la clase.
Desarrollo de Aplicaciones para Internet
1.1 Concepto de Tipo de Datos Abstracto.
Conceptos más avanzados de Programación Orientada a Objetos Programación 2005 Licenciatura de Lingüística y Nuevas Tecnologías.
1 Tipos inductivos y Pattern Matching Introducción a tipos inductivos y pattern matching Abstracciones con pattern matching. Traducción a cálculo lambda.
1 Parsing Un parser podría ser definido como un programa que analiza una porción de texto para determinar su estructura lógica: la fase de parsing en un.
Chequeo e inferencia de tipos
1 Agregando primitivas 2 Introducción Ahora presentaremos cómo agregar operaciones primitivas a la máquina G. Entenderemos como operaciones primitivas.
Programación monádica
Combinadores SK.
Curso de Programación 1 Plan 97
Introducción a los protocolos de enrutamiento dinámico
Tipo de Dato Abstracto Tipos de datos:
Informática II Prof. Dr. Gustavo Patiño MJ
Genéricos en Java Jaime Ramírez, Ángel Lucas González
Programación en Matlab
UNIVERSIDAD LATINA (UNILA) ENCAPSULACION Y HERENCIA
Aplicación del paradigma orientado a objetos
Ingeniería del Software
Programación Orientada a Objetos en Java
Marzo 2007 Lenguajes Visuales Clase III.
ESCUELA: NOMBRES: LÓGICA DE LA PROGRAMACIÓN UNIDAD 2: Naturaleza de los Datos FECHA: Ing. Patricio Abad Espinoza OCTUBRE 2009 – FEBRERO Ciencias.
PROGRAMACIÓN EN JAVA Curso-taller inicial de programación en JAVA Facultad de Estadística e Informática TEMA II.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Funciones en lenguaje C
Programación I Teoría VI: Recursividad
Medio de tele-comunicación
POO Java Módulo 3 Elementos de programas Identificadores
Lic. Rosemary Torrico Bascopé
ALGORITMOS Y ESTRUCTURA DE DATOS
Abstracción de los datos y Orientación a Objeto Clase 13.
ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como.
TRAMPAS EN EL DISEÑO DE LENGUAJES CON RELACIÓN A LOS NOMBRES - REGLAS DE ALCANCE - COMPILACIÓN POR SEPARADO CONTROL DE FLUJO - EVALUACIÓN DE EXPRESIONES.
Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
1 Herencia en Java Agustín J. González Diseño y Programación Orientados a Objetos.
Variables polimórficas (plantillas): definición, uso y aplicación
Semana 5 Subprogramas..
Análisis de Algoritmos
Sintaxis.
Estructura de Datos y Algoritmos
Tipos de Datos (Data Types)
Agenda Clase 16 Motivación e Historia de la Programación Funcional y la Programación Lógica. Concepto y Características de la Programación Funcional. Ventajas.
Alcance Dinámico La Asociación Actual para un Nombre dado es el encontrado recientemente durante la ejecución, y no a sido destruido aun por el retornado.
1 Samba: Un lenguaje funcional perezoso Presentación del lenguaje: qué es un programa Samba definiciones locales abstracciones lambda Tipos inductivos:
1 Compilación, pereza y expresiones let(rec) 2 Compilando un programa Describiremos un compilador para la máquina minimal usando un conjunto de esquemas.
CONTENIDO Fundamentos de la P.O.O Lenguajes basados en Clases
1 Herencia en Java Agustín J. González Diseño y Programación Orientados a Objetos.
Herencia. Introducción La idea básica es poder crear clases basadas en clases ya existentes. Cuando heredamos de una clase existente, estamos re-usando.
Unidad 2.1: INTRODUCCIÓN A LA ORIENTACIÓN A OBJETOS.
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) TRADUCTORES Y ANALIZADOR LEXICOGRÁFICO.
Programación orientada a objetos Capítulo 9 Algo mas sobre herencias.
Optimización automática de programas (OAP) Germán Vidal 1 Optimización automática de programas Tema 3: Funciones, tipos y expresiones 3.1. Intérpretes,
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Prof. Jonathan Silva Ingeniería Civil – Informática I Ingeniería Civil Informática I Clase 4 – Tipos de Datos.
Concepto de Tipo y Subtipo Diseño e Implementación Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 10 Versión.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Departamento de Informática Universidad Técnica Federico Santa María Lenguajes Funcionales Francisco Bórquez Departamento de Informática Universidad Técnica.
Transcripción de la presentación:

Interpretando objetos Gustavo Betarte Grupo de Métodos Formales - LCC InCo

Contenido Lenguajes basados en objetos El lenguaje FOb y el sistema UFOb El cálculo  Un intérprete Conceptos definidos: funciones, naturales, clases y herencia Ejemplo: Calculadora Trabajo futuro y conclusiones

Lenguajes basados en objetos Características básicas existencia de mecanismos para creación de objetos ausencia de clases prototipos y cloning (similar a new pero opera sobre objetos) Implementan: noción de objeto despacho dinámico si son tipados: tipos de objetos subtipado subsumption

Lenguajes basados en objetos (cont.) ObjectType Cell is var contents : Integer; method get() : Integer; method set(n:Integer); end; object cell : Cell is var contents : Integer := 0; method get() : Integer is return self.contents end; method set(n:Integer) is self.contents := n end;

El lenguaje FOb Es un lenguaje basado en objetos funcional Estrategia de reducción “perezosa” No tipado Provee: construcción de objetos primitivos selección de campos e invocación de métodos actualización de campos y métodos funciones y aplicación aritmética y booleanos

El lenguaje FOb: sintaxis concreta <obj> ::= <ident> | identificador [l1 = <method>, … ,ln = <method>] | objeto <obj>.l | selección / invocación <obj>.l := <obj> | act. de campo <obj>.l <- <method> | act. de método \ <ident> -> <obj> | abstracción <obj> <obj> | aplicación if <boolexp> then <obj> else <obj> | <arithexp> | <boolexp> | (<obj>) <method> ::= (<ident>)<obj> <ident> ::= String

El sistema UFOb Evaluador de objetos FOb Ambiente incremental de definición de objetos Funcionalidades adicionales: parsing, compilación, carga de archivo de definiciones, despliegue de ambiente, recuperación de definiciones, etc. Interfase XEmacs (modo .fob) Implementado en Haskell 1.4 (compilado en hbc de Chalmers)

El Cálculo  Es un cálculo puro y no tipado de objetos. A continuación resumimos la notación a ser usada para objetos y métodos: (x)b método con parámetro self x y cuerpo b [l1 = (x1)b1 … ln = (xn)bn] objeto con métodos li, i 1..n o.l invocación de método l del objeto o o.l  (x)b actualización del método l de o con método (x)b Campos no forman parte del cálculo (método con parámetro self dummy).

Sintaxis Un término  es una expresión generada por la siguiente gramática: e ::= x variable [l1 = (x1)b1 … l2 = (x2)b2] formación de objeto e.l sel. de campo / invoc. de método e1.l  (x)b actualización de campo / método Se define como FV(e) al conjunto de variables libres de un término e. La sustitución de las ocurrencias libres de un identificador x en el término b por un término c se denotará b[x:=c]

Semántica operacional Definimos ahora un sistema determinístico de reducción para los términos cerrados del cálculo . Este sistema describe una estrategia de evaluación débil, en el sentido de que no se reducen cuerpos de métodos. ------------------------------------------------ (red-obj) [li = (xi)bi i  1..n ]  [li = (xi)bi i  1..n ] a  v1 v1  [li = (xi)bi i  1..n ] bj [xj := v1]  v2 --------------------------------------------------------------------- (red-sel) a.lj  v2 a  [li = (xi)bi i  1..n ] --------------------------------------------------------- (red-update) a.lj  (x)b  [lj = (x)b, li = (x)bi i  (1..n) - {j}]

Un intérprete Las reglas que definen a la relación  sugieren naturalmente un algoritmo de reducción, el que puede entenderse como un intérprete para términos  cerrados. El algoritmo, que definiremos recursivamente y llamaremos Eval, toma como argumento un término cerrado y, si converge, produce un resultado (un objeto primitivo). Si no, retornará error, que representa un error de computación. Eval(c) denotará el resultado de correr el algoritmo sobre la entrada c.

Eval ([li = (xi)bi i  1..n ]) = [li = (xi)bi i  1..n ] Eval (a.lj) = let o = Eval (a) in case o of [li = (xi)bi i  1..n ] -> Eval (bj[xj := o]) otherwise -> error Eval (a.lj <- (x)b) = in case o of [li = (xi)bi i  1..n ] -> [lj = (x)b, li = (x)bi i (1..n) - {j}] otherwise -> error

Funciones como objetos Es posible incorporar los términos del cálculo l en el cálculo  de objetos. De hecho este cálculo es el llamado l presentado también en Abadi y Cardelli. Nosotros hemos preferido, sin embargo, mantener el conjunto de primitivas del cálculo lo más reducido posible. Traducción de términos l a objetos  x  = x  b a  = ( b .arg :=  a ).val  \x -> b  = [arg = (x)x.arg, val = (x)( b [x := x.arg])]

Funciones como objetos (cont.) La idea clave de la traducción es que una aplicación  b a primero carga el argumento  a  en al campo arg de  b , y luego invoca al método val de  b, el que puede acceder al argumento a través de self. Por ejemplo:  (\x -> x) 5  = ([arg = (x)x.arg, val = (x)x.arg].arg := 5).val  [arg = (_)5, val = (x)x.arg].val 5

Naturales como objetos En forma similar a la codificación de naturales en cálculo l, conocida como los numerales de Church, presentaremos ahora la codificación de naturales como términos del cálculo  . zero = [case = (_)\z -> \s -> z, succ = (x)x.case := \z -> \s -> s x] one = zero.succ => [case = (_)\z -> \s -> s zero, succ = (x)x.case := \z -> \s -> s z] iszero = \n -> n.case true (\x -> false) pred = \n -> n.case zero (\x -> x)

Traits, clases y herencia Las nociones de trait, clase y herencia no aparecen explícitas en el cálculo. A continuación discutiremos cómo pueden ser representadas en términos de objetos puros. Llamaremos pre-métodos a aquellas funciones que una vez embebidos en objetos se tornan métodos. Se entenderá que herencia significa reutilización de pre-método y que traits y clases son colecciones de pre-métodos reusables interdependientes. La reutilización de un método (x)b se logrará convirtiéndolo primero en un pre-método \x -> b, y luego embebiendo repeditamente esta función en objetos.

Representando Traits y Clases Un trait es una colección de pre-métodos. Si o  [li = (s)bi i  1..n] es un objeto, entonces t  [li = \s -> bi i  1..n] es un trait para o. Una clase será representada por medio de un trait y un método new, este último usado para generar objetos: c = [ new = (z)[li = (s)z.li s i  1..n], li = (_)\s -> bi i  1..n] o = c.new => [li = (s)c.li s i  1..n]

Ejemplo: la clase Cell class cell is var contents : Integer := 0; method get(): Integer is return self.contents; method set(n:Integer) is self.contents := n; end; Puede ser reformulada en  como el objeto clasCell = [new = (z)[contents = (s)z.contents s, get = … , set = (s)z.set s], contents = \s -> 0, get = \s -> s.contents, set = \s -> \n -> s.contents := n]

Representando Herencia Herencia consiste en reutilizar pre-métodos. Por ejemplo, c1, es una clase que reusa todos los pre-métodos de c y agrega además otros pre-métodos. Informalmente c1 es una subclase de c: c1 = [ new = (z)[li = (s)z.li s i  1..n], li = (_)c.li i  1..n, lk = (_)\s -> bk k  n+1..n+m] La clase c2 es una “subclase” de c que hereda los primeros n-1 pre-métodos de c y sobreescribe el último (notar super). c2 = [ new = (z)[li = (s)z.li s i  1..n], ln = (_)\s -> ...c.ln s... c.lp s ...]

Ejemplo: la clase reCell subclass reCell of cell is var backup : Integer := 0; override set(n:Integer) is self.backup := self.contents; super.set(n); end; method restore() is self.contents := self.backup end; clasReCell = [new = (z)[contents = (s)z.contents s, get = … ] contents = classCell.contents, get = classCell.get, set = \s -> \n -> classCell.set (s.backup:=s.contents) n, backup = \s -> 0 , restore = \s -> s.contents := s.backup]

Ejemplo: Una calculadora [arg = 0, acc = 0, enter = (s)\n -> s.arg := n, add = (s)(s.acc := s.equals).equals <- (s’)s’.acc + s’.arg, sub = (s)(s.acc := s.equals).equals <- (s’)s’.acc - s’.arg, equals = (s)s.arg] i) calc.enter(5).equals ii) calc.enter(5).sub.enter(3).equals iii) calc.enter(5).add.add.equals

Trabajo futuro?? Implementar chequeo de tipos versión imperativa de FOb en un lenguaje OO (Java, C++, …) Extender clases y herencia subtipos Entender alto orden compilación

Conclusiones Se estudió e implementó conjunto básico de conceptos. Herramienta para experimentar y extender. Cálculo reducido, nociones primitivas entendibles. Herramienta téorica adecuada (“buenas” propiedades). Excelencia de Haskell para prototipación (30 hs.).