Engenharia de Linguagens

Engenharia de Linguagens (2011/2012)

Análise e Transformação de Software

Descrição:

A capacidade de compreender programas escritos numa dada linguagem é algo fundamental, quer para a sua avaliação, quer para a sua manutenção (optimização, ou evolução). Há várias abordagens a esta problemática da compreensão e existem diversas ajudas disponíveis, seguindo linhas mestras distintas.

Neste módulo estudam-se indicadores de qualidade e métricas e estudam-se técnicas de análise e visualização de código que calculam essas medidas e mostram o conhecimento relevante à tarefa em causa.

Especial ênfase será dado às ferramentas de análise de linguagens geradas automaticamente a partir da respectiva gramática; igual relevo é prestado à questão do armazenamento da informação extraída (a representação interna da informação) e à sua apresentação/visualização.

Neste capítulo da análise de código, será estudada uma técnica, chamada slicing, que permite extrair partes de um programa de forma a concentrar toda a atenção apenas nas componentes relevantes para um dado fim.

Não é demais relembrar que as técnicas de análise de código, mormente o slicing, juntamente com as técnicas de visualização servem, essencialmente, para construir sistemas de Compreensão de Programas, conforme acima falado.

Além da manutenção (para corrigir erros ou prever problemas), da detecção de clones, e da avaliação da qualidade (para aferição ou comparação) de um pacote de software, uma outra faceta pode advir da análise do código: a verificação e a programação/reutilização segura. Esse tópico será também aqui abordado.

Na sequência da extracção de conhecimento, a partir da análise automática do código, serão discutidas técnicas, baseadas em programação estratégica, para transformar programas, tanto no sentido de melhorar o código, como no sentido de o alterar e adaptar a novos fins ou novas regras de negócio.

Programa Resumido

  • 1. Análise de programas:
    • As operações básicas: Extracção de dados; Armazenamento da informação recolhida; Exploração do conhecimento.
    • Geração automática de FEs a partir de GAs;
    • Parsing generalizado e Regras de Desambiguidade (estudo de sistemas como o SGLR e o HaGLR).
    • Tabelas de Identificadores e Árvores de Sintaxe Abstractas Decoradas com atributos.
    • Técnicas de Slice.
    • Detecção de código morto, clones, etc.

  • 2. Verificação de Software e Programação Segura (Design-by-Contract).

  • 3. Avaliação da Qualidade de SW; Métricas para análise de programas.

  • 4. Transformação de programas:
    • Programação Estratégica.
    • Especialização de Programas e Cálculo Parcial.

  • 5. Testes de Software; automatização.

  • 6. Paradigmas para visualização:
    • Modelos para visualização de informação, de dados e de software.
    • Visualização/Navegação em Árvores, Grafos, Hiper-Cubos, Petri-Nets.
    • Visualização/Navegação em Ontologias.
    • Animação de Algoritmos.

Resultados de Aprendizagem Específicos

  • Capacidade de construir front-ends poderosos para a análise de linguagens de programação (ambíguas ou não).
  • Capacidade para conceber e implementar estruturas de dados complexas para representação intermédia da informação extraída da análise do código;
  • Capacidade para seleccionar e calcular métricas para aferição da qualidade do software;
  • Capacidade para criar representações visuais adequadas à compreensão clara do conhecimento complexo detido;
  • Capacidade para desenvolver software como uma tarefa de transformar programas e/ou especificações em implementações eficientes;
  • Capacidade para utilizar técnicas de transformação de programas para optimizar programas (e.g. cálculo parcial, detecção de código morto), efectuar debugging de programas (e.g. slicing), e melhorar a estrutura dos programas (e.g. refactoring).

Metodologia de Ensino e Avaliação

  • As aulas de 4h tem sempre um cariz teórico-prático. Em cada aula:
    • no início é sempre feito um balanço da aula anterior e discutidos os trabalhos ou questões propostos;
    • depois algum tempo é dedicado a levantar questões teóricas e a apresentar as diferentes aproximações e metodologias que suportam a sua resolução; esta parte, embora de carácter teórico, desenvolve-se sempre em forma de diálogo com os alunos.
    • continua-se a aula numa parte mais prática em que os alunos são convidados a pesquisar e fazer uma sintese do que há já escrito sobre o assunto; ou então a desenvolver experimentação de ferramentas ou implementação de algorimtos.

  • A avaliação é feita com base em 1 teste escrito (ou exame) individual e nos trabalhos entregues pelos alunos, resolvidos foras das aulas mas defendidos perante a turma. Os trabalhos para avaliação são de dois tipos:
    • monografias, com sinteses dos temas pesquisados;
    • trabalhos de implementação.

Bibliografia:

  • Mario Berón, "Program Inspection to interconnect the Behavioral and Operational Views for Program Comprehension". Ph.D. Thesis, Universidade Nacional San Luis (AR) \& Universidade do Minho, 2009.

  • Don Coleman, Dan Ash, Bruce Lowther, and Paul Oman, "Using metrics to evaluate software system maintainability. Computer, 27(8):44-49.

  • Daniela da Cruz, "Verification, Slicing and Visualization of Programs with Contracts". Ph.D. Thesis, Universidade do Minho, 2011.

  • B. Curtis, "The measurement of Software Quality and Complexity". Chapter 12 in Alan J. Perlis, Frederick Sayward, and Mary Shaw, editors "Software Metrics: An Analysis and Evaluation". MIT-Press, May 1981.

  • Norman E. Fenton, "Software Metrics: A Rigorous Approach". Chapman \& Hall, Ltd., London, UK, 1991.

  • Norman Fenton and Martin Nail, "Software metrics: roadmap". Proceedings of the Conference on The Future of Software Engineering, ACM 2000.

  • Ronald B. Finkbine, "Metrics and models in software quality engineering". SIGSOFT Software Engineering Notes, 21(1):89, 1996.

  • Thomas J. McCabe, "A complexity measure". IEEE Transactions on Software Engineering, SE-2(4):308-320, Dec. 1976.

  • Flemming Nielson, Hanne Riis Nielson and Chris Hankin, "Principles of Program Analysis". Springer, 452 pages, ISBN 3-540-65410-0, 2005.

  • Tom Mens and Serge Demeyer, "Future trends in software evolution metrics". Proceedings of the 4th International Workshop on Principles of Software Evolution, ACM, 2001.

  • Kai Pan, Sunghun Kim, and Jr. E. James Whitehead, "Bug classification using Program Slicing Metrics". In SCAM '06: Proceedings of the Sixth IEEE International Workshop on Source Code Analysis and Manipulation, pp 31-42, Washington, USA, 2006. IEEE Computer Society.

  • Terrence Par, "The Definitive \antlr\ Reference: Building Domain-Specific Languages". The Pragmatic Bookshelf, 2007

  • John M. Roche, "Software metrics and measurement principles". SIGSOFT Software Engineering Notes, ACM, volume 19, number 1, 1994.

  • M.João Varanda, "Sistematização da Animação de Programas". Ph.D. Thesis, Universidade do Minho, 2003.

  • Arthur H. Watson and Thomas J. McCabe, "Structured testing: A testing methodology using the cyclomatic complexity metric". Technical Report NIST, Special Publication 500-235, Computer Systems Laboratory, Aug. 1996.


r1 - 16 Nov 2011 - 00:26:51 - PedroRangelHenriques
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback
Syndicate this site RSSATOM