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.