Otimizando Compiladores de
AspectJ para Java ME
Fernando Henrique Calheiros Lopes
Centro de Informática – UFPE
Motivação
Jogos Móveis:
Projeções para 2011 no mercado de jogos de
celulares: 7 bilhões de dólares movimentados
Um dos mercados mais promissores do
entretenimento digital
Problema:
Grande variedade de aparelhos
Como tratar as variabilidades em nível de
código de um jogo entre os diversos
aparelhos?
Cenário de Jogos Móveis
•Variações em...
• tela,
• teclado,
• memória,
• APIs...
• Baixíssimo time to
market
• Vários idiomas
• Mudanças entre
operadoras
• ...
Linhas de Produtos de Software
BUILD
Artefatos Core
Variabilidades
Seleção de Features
Produto X
Produto Y
Pré-processamento
• Padrão da indústria para tratar variações de código
• Tags de pré-processamento features
• Vantagem: Não adiciona overhead no bytecode
• Problema: Código emaranhado
//#if device_graphics_canvas_nokiaui
public class MainCanvas extends FullCanvas{
//#elif device_graphics_canvas_midp2 || device_graphics_canvas_siemens
//# public class MainCanvas extends GameCanvas {
//#elif sku_id_se1
//# public class MainCanvas extends Canvas implements CommandListener {
//#else
//# public class MainCanvas extends Canvas {
//#endif
AspectJ
Principal vantagem:
Código de cada família de aparelhos
separados do código comum a todos os
aparelhos
Principal desvantagem:
Adiciona overhead aos classfiles de Java
Principais compiladores:
abc e ajc
AspectJ – A linguagem
Pointcuts
Expressões que descrevem pontos no fluxo de
execução do programa
Advices
Código que pode ser executado em um determinado
ponto capturado por um pointcut
Inter-type Declarations
Modificam a estrutura estática de uma classe Java
Adicionando atributos e métodos
Mudando a hierarquia de classes
Metodologia
Análise de tamanho: quantificação
Inspeção individual: qualificação
Discussão: Propor melhorias, provar
corretude e implementar
Resultados: quantificar ganho obtido
Overhead adicionado por AspectJ
Inspeção Individual
As construções de AspectJ utilizadas nos 2
jogos avaliados pelo projeto FLiP foram
inspecionadas
A partir da inspeção do bytecode resultante
do uso das mesmas foram identificados os
pontos onde cada compilador adiciona overhead
Essa inspeção indicou os motivos por trás do
overhead
Otimizações sugeridas
Baseando-se nos dados da inspeção, foram sugeridas um
conjunto de otimizações para o compilador abc:
Não relacionada a aspectos:
Remover <clinit>() vazios
Atributos com inicialização:
Mover a inicialização dos atributos para a classe alvo
Métodos:
Colocar o corpo de métodos inter-type na própria
classe alvo
Advices:
Remover chamadas desnecessárias a aspectOf()
Remover métodos accessors quando os membros
puderem ser acessados diretamente
Otimizações Implementadas
Remover chamadas desnecessárias a
aspectOf()
Colocar o corpo de métodos inter-type na
própria classe alvo
Otimizações escolhidas baseado na intuição
de que trariam o maior ganho
1º passo: provar a corretude
2º passo: implementar
Prova de corretude
Baseada em leis de programação [Col05]
Foi mostrado como sair do que o abc gera
para o que as leis denotam
Implementação
Estudada a arquitetura do abc
Enunciados algoritmos para implementar as
duas otimizações
Implementadas as duas otimizações como
transformações do framework Soot
Se encaixam no abc
Resultados
Exemplos utilizados na inspeção foram
mostrados com as otimizações
Tamanho dos builds foi comparado
novamente
Com cada otimização separadamente
Com ambas habilitadas
200 bytes a menos do que a soma dos
ganhos individuais
Diminuição de 48% do overhead adicionado
por AspectJ
Ganho no tamanho
Trabalhos relacionados
[Cor07] Eduardo Santos Cordeiro. Otimizações na compilação
de adendos de contorno em programas orientados por
aspectos. Master’s thesis, Universidade Federal de Minas
Gerais, 2007.
[Kuz04] Sascha Kuzins. Efficient implementation of aroundadvice for the aspectbench compiler. Master’s thesis, Oxford
University, 2004.
Trabalhos futuros
Provar que as outras otimizações propostas não
implementadas preservam o comportamento
Implementar as outras otimizações não implementadas
Analisar as construções de AspectJ que não estavam no
escopo deste estudo
Implementar as otimizações no ajc
Analisar o impacto de construções que interferem umas com
as outras
Avaliar o impacto das otimizações propostas com benchmarks
de performance e memória
Intuitivamente espera-se obter um ganho em ambos
Referências
Site do abc: www.aspectbench.org
Site do ajc: www.eclipse.org/aspectj
Site do Soot: http://www.sable.mcgill.ca/soot/
[Col05] Leonardo Cole. Deriving refactorings for aspectj.
Master’s thesis, Informatics Center, Federal Universisty of
Pernambuco, Recife, Brazil, February 2005.