Projeto de PLP (2005.1) Extensão da Linguagem OA1 (2003.1) Alunos: Alberto Costa Neto (acn) Manoel Messias da Silva Menezes Júnior (mmsmj) Rafael Leão.

Slides:



Advertisements
Apresentações semelhantes
I- Introdução A Evolução dos Modelos de Dados e dos Sistemas de Gerência de Banco de Dados.
Advertisements

Paulo Marques Hernâni Pedroso
Exemplo dos Internamentos
Modularização de interesses ortogonais
Prof. Heloise Manica Paris Teixeira
Projeto Arquitetural de Software Orientado a Aspectos
Professora: Aline Vasconcelos
Programação Orientada a Aspectos
Listas lineares Listas Lineares Fila Dupla Pilha Fila Saída restrita
Alexandre Parra Site: Linguagem Java Alexandre Parra Site:
Diagrama de Classes.
Linguagem de Programação II
Introdução à Programação
PROGRAMAÇÃO ORIENTADA A ASPECTOS EM JAVA Introdução a conceitos teóricos e práticos Adriano G. do Prado José Eduardo M. Lemos José Fernando da S. Cruz.
Como o AspectJ tece o código
Classes e objetos P. O. O. Prof. Grace.
Estrutura de Dados em Java
Tópicos Tipos de Dados Variáveis por Valor Variáveis por Referência
Linguagem de Expressão (EL)
I- Introdução A Evolução dos Modelos de Dados e dos Sistemas de Gerência de Banco de Dados.
I- Introdução A Evolução dos Modelos de Dados e dos Sistemas de Gerência de Banco de Dados.
Aula prática 13 Orientação a Objetos – C++ Parte 1
Aula prática - análise contextual
DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso.
P ROGRAMAÇÃO ORIENTADA A ASPECTOS Equipe: Leandro Oliveira Anusio Menezes.
Desenvolvimento de Sistemas Orientados a Aspectos
Tipos de Dados Paradigmas de Programação
Estudo dos Conceitos e Paradigmas de Programação
Paradigmas de Linguagens de Programação BNF e Interpretador da Linguagem Orientada a Objetos Augusto Sampaio Jackson, Jean, Patrícia, Saulo Centro de Informática.
Paradigmas de Linguagens de Programação Linguagem Imperativa 1
Augusto Sampaio e Paulo Borba Centro de Informática
Augusto Sampaio e Paulo Borba Centro de Informática
Augusto Sampaio e Paulo Borba Gustavo Pinto Marcelo Queiroz
Aspect Oriented Programming (AOP)
Professor: Márcio Amador
Programação Orientada à Objetos
Sistema de Transformação para a linguagem OO1 Adeline Sousa Gustavo Santos.
Aula prática 14 Orientação a Objetos – C++ Parte 2
Estruturas de Dados Aula 8: Tipos Abstratos de Dados 30/04/2014.
Análise Orientado aos Objetos Prof. Wolley W. Silva
Projeto de Tradutor Preditivo. Introdução Introdução Esquemas L-atribuidos são reconhecidos por analisadores Top-Down. Entre estes analisadores, se encontra.
Java Kickstart, day 2 Semelhanças com linguagem C.
Interfaces POO Avançado.
Laboratório de Programação
Estruturas Revisando: tipos de dados simples
Linguagem orientada a Aspectos 2 Luiz Carlos d’Oleron Tiago Vinícius.
Faculdade Pernambucana - FAPE Setembro/2007
Construtores e Destrutores
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Bruno Inojosa MCP .NET Framework
Otimizando Compiladores de AspectJ para Java ME Fernando Henrique Calheiros Lopes Centro de Informática – UFPE.
Equipe Equipe: Ana Carolina M. Pilatti Igor de Souza Paiva Igor de Souza Paiva Rafael Stubs Parpinelli Rafael Stubs Parpinelli Vera Lúcia Marchiori Vera.
Paradigmas de Linguagens de Programação Conceitos da Linguagem Imperativa 1 Augusto Sampaio e Paulo Borba Centro de Informática Universidade Federal de.
Inserção dos conceitos de Interface e Classe Abstrata em LOO2 (2006.1) Projeto PLP Alunos: Carlos Eduardo Pontual (ceplc)‏ Fernanda d'Amorim (frsa)‏
Histórico de ações 0 para 1 – Composite e Visitor – Component, BasicComponent e Composite foram removidos. Adicionados virtual classes: ComponentCJ e CompositeCJ.
Classes abstratas São classes das quais não se pode instanciar objetos. São classes das quais não se pode instanciar objetos. Seu objetivo é ser herdada.
Estruturas de Dados Murilo Salgado Razoli.
Módulo II Capítulo 1: Orientação a Objetos
Padrão Visitor Paulo Mauricio Gonçalves Jr Rodrigo Teixeira Ramos Paradigmas de Linguagens de Programação Prof. Augusto Sampaio Julho de 2003.
UCSal – Bacharelado em Informática Tópicos Especiais em Informática II Profa. Semíramis Assis
Array e ArrayList LPOO – 01/09/14.
Curso Básico de Android
Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista POO para Redes de Computadores.
MATA56 Tipos, Verificação de Tipos Agenda Objetivo desta aula: Introduzir os principais aspectos semânticos de variáveis Palavras-chave – nomes.
Linguagem Java Programação II.
Raniere ferreira do prado
Análise Contextual Mauro Araújo Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal de Pernambuco.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
Linguagem Orientada a Objetos 2
Transcrição da apresentação:

Projeto de PLP (2005.1) Extensão da Linguagem OA1 (2003.1) Alunos: Alberto Costa Neto (acn) Manoel Messias da Silva Menezes Júnior (mmsmj) Rafael Leão da Fonseca (rlf)

Agenda BNF/API de OA1 Ambientes de Execução e Compilação Extensões da Linguagem OA1 1.Acrescentar Join Points para leitura/escrita de atributos 2.Introdução de atributos e métodos 3.Implementação do operador not em PointcutExpressao 4.Implementação de cflow e cflowbelow 5.Implementação de within e withincode 6.Uso de Matching na definição de Pointcuts 7.Advice com pointcut anônimo 8.Inclusão de objeto thisJoinPoint Conclusões Trabalhos Futuros

BNF/API de OA1

Ambientes de Execução e Compilação

Ambiente de Execução Componentes herdados de LOO1 –uma pilha de mapeamentos de identificadores (incluindo this ) em valores (incluindo referências). –um mapeamento de referências em objetos. –a referência para a próxima célula a ser alocada. –um mapeamento de identificadores em definições de classes. –listas de valores de entrada e saída. Componentes adicionais –Gerenciador de aspectos. –Pilha de interceptáveis (join points).

Ambiente de Execução Gerenciador de Aspectos –Mapeamento de identificador de pointcut em pointcut –Mapeamento de identificador de pointcut em um grupo de advices

Ambiente de Compilação Componentes herdados de LOO1 –uma pilha de mapeamentos de identificadores em tipos. –um mapeamento de identificadores em definições de classes. –listas de valores de entrada.

Extensão da Linguagem OA1

Extensão da linguagem OA1  Propostas 1.Acrescentar Join Points para leitura/escrita de atributos 2.Introdução de atributos e métodos 3.Implementação do operador not em PointcutExpressao 4.Implementação de cflow e cflowbelow 5.Implementação de within e withincode 6.Uso de Matching na definição de Pointcuts 7.Inclusão de objeto thisJoinPoint 8.Modificar advice para usar PointcutExpressao ao invés de um simples Id ( advice com pointcut anônimo)

classe Ponto { int x = 0, int y = 0; proc setX(int x) { this.x := x }, proc setY(int y) { this.y := y}, proc mover(int offsetX, int offsetY) { this.x := this.x + offsetX; this.y := this.y + offsetY }, proc printX() { write(“x:” ++ this.x) }, proc printY() { write(“y:” ++ this.y) }, proc print() { printX(); printY() } } Extensão da linguagem OA1

1.Introdução dos Join Points (get e set) –get: Captura leitura de um atributo –set: Captura modificação de um atributo aspect PontoLog { pointcut leitura: get(Ponto.x), pointcut escrita: set(Ponto.x); after : leitura { write(“leitura de Ponto.x”) }, after : escrita { write(“escrita em Ponto.x”) } };

Extensão da linguagem OA1 2.Introdução de atributos e métodos aspect PontoLog { proc Ponto.moverX(int offsetX) { this.x := this.x + offsetX }, proc Ponto.moverY(int offsetY) { this.y := this.y + offsetY }

Extensão da linguagem OA1 3.Implementação do operador not em PointcutExpressao Negação de qualquer PointcutExpressao.

Extensão da linguagem OA1 4.Implementação de cflow e cflowbellow –cflow(Pointcut) : intercepta qualquer join point no fluxo de controle de qualquer join point P interceptado por Pointcut, incluindo P. aspect PontoLog { pointcut noFluxoDePrint: cflow(Ponto.print()); before : noFluxoDePrint { write("JP no fluxo de controle de print()") } };

Extensão da linguagem OA1 –cflowbelow(Pointcut) : intercepta qualquer join point no fluxo de controle de qualquer join point P interceptado por Pointcut, sem incluir P. aspect PontoLog { pointcut noFluxoDePrint: cflowbelow(Ponto.print()); before : noFluxoDePrint { write("JP no fluxo de controle abaixo de print()") } };

Extensão da linguagem OA1 Pilha / Cache de Join Points Pilha de Join Points Cache de Join Points

Extensão da linguagem OA1 1. Chamada à Ponto.print() Ponto.print() Pilha de Join Points Ponto.print() = 1 Cache de Join Points

Extensão da linguagem OA1 2. Execução do Advice de PontoLog Ponto.print() Pilha de Join Points Ponto.print() = 1 Cache de Join Points PontoLog PontoLog = 1

Extensão da linguagem OA1 3. Fim da execução do Advice Ponto.print() Pilha de Join Points Ponto.print() = 1 Cache de Join Points

Extensão da linguagem OA1 4. Chamada a Ponto.printX() Ponto.print() Pilha de Join Points Ponto.printX() = 1 Cache de Join Points Ponto.printX() Ponto.print() = 1

Extensão da linguagem OA1 5. Execução do Advice de PontoLog Ponto.print() Pilha de Join Points Ponto.printX() = 1 Cache de Join Points Ponto.printX() Ponto.print() = 1 PontoLog PontoLog = 1

Extensão da linguagem OA1 6. Fim da execução do Advice Ponto.print() Pilha de Join Points Ponto.printX() = 1 Cache de Join Points Ponto.printX() Ponto.print() = 1

Extensão da linguagem OA1 7. Acesso a Ponto.x Ponto.print() Pilha de Join Points Ponto.printX() = 1 Cache de Join Points Ponto.printX() Ponto.print() = 1 Ponto.x Ponto.x = 1

Extensão da linguagem OA1 8. Execução do Advice de PontoLog Ponto.print() Pilha de Join Points Ponto.printX() = 1 Cache de Join Points Ponto.printX() Ponto.print() = 1 Ponto.x Ponto.x = 1 PontoLog PontoLog = 1

Extensão da linguagem OA1 9. Fim da execução do Advice Ponto.print() Pilha de Join Points Ponto.printX() = 1 Cache de Join Points Ponto.printX() Ponto.print() = 1 Ponto.x Ponto.x = 1

Extensão da linguagem OA1 10. Remoção de Acesso a Ponto.x Ponto.print() Pilha de Join Points Ponto.printX() = 1 Cache de Join Points Ponto.printX() Ponto.print() = 1

Extensão da linguagem OA1 11. Remoção de Chamada a Ponto.printX() Ponto.print() Pilha de Join Points Cache de Join Points Ponto.print() = 1

Extensão da linguagem OA1 12. Chamada à Ponto.printY() –Executa de forma similar à chamada de Ponto.printX(). –Intercepta dois join points: Ponto.printY() e get(Ponto.y), executando o advice de PontoLog duas vezes.

Extensão da linguagem OA1 13. Remoção de Chamada a Ponto.print() Pilha de Join Points Cache de Join Points

Extensão da linguagem OA1 5.Implementação de within e withincode –within(PadrãoCasamento) : intercepta os join points nos quais o código em execução é definido na declaração de um dos tipos de PadrãoCasamento. –withincode(PadrãoCasamentoMetodo) : intercepta cada join point onde o código em execução é definido na declaração do método especificado.

Extensão da linguagem OA1 { aspect PontoLog { pointcut noFluxoDePrintEForaDePontoLog: cflow(Ponto.print()) and not within(PontoLog), pointcut withincodePrint: withincode(Ponto.print()); before : noFluxoDePrintEForaDePontoLog { write(“No fluxo de controle de print() e not Within PontoLog”) }, before : withincodePrint { write("Withincode Ponto.print()") }

Extensão da linguagem OA1 Uso da pilha –Within: Checa o nome da classe/aspecto do join point que está abaixo do elemento no topo da pilha –Withincode: Checa o join point que está abaixo do elemento no topo da pilha, que deve ser uma chamada de método e casar com a fornecida Ponto.print() Pilha de Join Points Ponto.printX() = 1 Cache de Join Points Ponto.printX() Ponto.print() = 1

Extensão da linguagem OA1 6.Uso de Matching na definição de Pointcuts aspect PontoLog { pointcut movimento:Ponto.se*(*) or Ponto.mover(..); after : movimento { write(“O ponto mudou de posicao.") };

Extensão da linguagem OA1 Exemplos de Matching –get/set/cflow(below) get(*.*), get(*.x), get(Ponto.*), get(P*.*), get(*o.*), get(P*o.*), cflow(*.*), cflowbelow(*.x) –within within(*), within(P*), within(*to), within(Po*o) –Chamada de método/withincode/cflow(below) *.*(int, string), *.*(*), *.*(..), *.*(..,int), *.*(int,..), *.*(..,int,..) *.*(..,..,..), *.*(..,..,int,..,..)

Extensão da linguagem OA1 7.Uso de PointcutExpressao na definição de Advice aspect PontoLog { pointcut setX : Ponto.setX(int); after : setX or Ponto.setY(*) or Ponto.mover(..) { write("O ponto mudou de posicao.") }

Extensão da linguagem OA1 8.Inclusão de objeto thisJoinPoint –Dá acesso a metadados sobre o join point interceptado durante a execução de um advice. –Oferece os seguintes atributos: kind: string com tipo do join point signature: string com a assinatura do método

Extensão da linguagem OA1 Uso de thisJoinPoint na definição de Advice aspect PontoLog { before : Ponto.setX(*) or Ponto.setY(*) { write(thisJoinPoint.signature); write(thisJoinPoint.kind) }

Conclusões

A introdução do conceito de aspectos tornou a implementação do interpretador relativamente complexa –Se usássemos AspectJ na implementação do interpretador, seria mais simples A introdução de aspectos na LOO1 faz com que expressões tenham efeitos colaterais –Execução dos advices ativados por um pointcut designators get

Conclusões A implementação interpretada exige que para cada comando ou expressão interceptável seja feita a avaliação de todos os pointcuts Essa abordagem é bastante lenta, principalmente quando utiliza-se cflow/cflowbelow –O cache de join points implementados ajuda, mas não no caso de matching

Conclusões A utilização de Generics na implementação das pilhas e mapeamentos permitiu –melhor reutilização de código –checagem estática Otimização das pilhas para permitir navegação sem desempilhar/empilhar

Trabalhos Futuros

Estender o ambiente de compilação para permitir a verificação estática das declarações de aspectos Retirar obrigatoriedade de haver um pointcut e um advice no aspecto Permitir declarações de atributos e métodos nos aspectos

Trabalhos Futuros Controlar a instanciação de aspectos por cflow (percflow), cflowbelow (percflowbelow), this (perthis), target (pertarget) e única (issingleton) Implementação dos poincut designators adviceexecution e if de AspectJ Permitir o uso de anotações ao estilo de AspectJ 5

Trabalhos Futuros Estender LOO1 com conceitos como: função, herança, array e type casting. –Isso permitiria, implementar outros pointcut designators Permitir que um método ou atributo introduzido em uma classe não seja utilizado apenas dentro do aspecto que realizou a introdução Implementar a precedência entre os operadores and e or.