Upload
luiza-santa-ana
View
214
Download
0
Embed Size (px)
Citation preview
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 atributos2. Introdução de atributos e métodos3. Implementação do operador not em PointcutExpressao4. Implementação de cflow e cflowbelow5. Implementação de within e withincode6. Uso de Matching na definição de Pointcuts7. Advice com pointcut anônimo8. 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
Propostas1. Acrescentar Join Points para leitura/escrita de
atributos2. Introdução de atributos e métodos3. Implementação do operador not em
PointcutExpressao4. Implementação de cflow e cflowbelow5. Implementação de within e withincode6. Uso de Matching na definição de Pointcuts7. Inclusão de objeto thisJoinPoint8. 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
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étodosaspect 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 PointsPilha 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 = 1PontoLog
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
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
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.