Engenharia de Linguagens

Engenharia de Linguagens (2009/10)

Análise e Transformação de Software

Exemplos para as aulas

  • Para o seguinte programa:
    • Calcule o backward slicing relativamente à instrução
      printf("Maximo: %d\nMinimo: %d\n", max, min);
      
      com respeito à variável max.
    • Calcule o forward slicing relativamente à instrução
      int i, max, min;
      com respeito à variável min.

int main()
{
     int array[MAX];
     int i, max, min;
     for (i = 0; i < MAX; i++)
    {
         printf("Introduza numero:\n");
         scanf("%d", &i);
    }

    max = array[0];
    min = array[0];
    for (i = 1; i < MAX; i++)
   {
        if (array[i] < min)   { min = array[i]; }
        if (array[i] > max)  { max = array[i]; }
   }

  printf("Maximo: %d\nMinimo: %d\n", max, min);
  return 0;
}

  • Calcule o System Dependency Graph para o seguinte programa:


     void Add(int* a, int b)
     {
          *a = *a + b;
     }

     void Increment(int* z)
     {
          Add(z,1);
     }

     int main()
     {
         int sum = 0;
         int i = 1;
         while(i < 11)
         {
             Add(&sum,i);
             Increment(&i);
         }
         printf("Sum: %d\n", sum);
      }

  • Calcule o Program Dependency Graph para o seguinte programa:

  • Calcule o Control Flow Graph para o seguinte programa:
     int main()
     {
         int n, i, sum, product;
         scanf("%d",&n);
         i=1;
         sum=0
         product=1;
         while(i <= n)
         {
            sum += i;
            product *= i;
            i++;
         }
         printf("Sum: %d\n", sum);
         printf("Product: %d\n", product);
     }

Notas sobre AnTLR

  • Configurar CLASSPATH para permitir a invocação via linha de comandos (Windows): set CLASSPATH = %CLASSPATH%;pathANTLR; onde a pathANTLR é a respectiva path para o ANTLR (.jar).

  • Fazer download dos seguintes ficheiros Test.java e input.txt para a pasta "output" para onde foram gerados os ficheiros na alínea anterior.

  • Executar "javac *.java" e finalmente "java Test".

Fichas de Avaliaçao

Ficha IV

Após a pesquisa genérica sobre o tema "Transformação de Programas" estude em concreto uma das ferramentas enocntradas e prepare uma pequena apresntação à turna sobre ela: filosofia, campos de aplicação, funcionalidades e utilização. Mostre, a título de exemplo, como implementaria o problema de transformação de um programa em C-- proposto na Ficha II.

Ficha III

Faça uma pesquisa sobre o tema "Transformação de Programas" e procure em concreto abordagens, ferramentas e aplicações. Depois identifique lacunas de modo a defnir o projecto que vai levar a cabo para colmatar essas fraquezas. Por fim implemente o sistema de transformação idealizado.

Ficha II

Partindo de uma versão "light" da gramática do C (C--) disponível no site do AnTLR, pretende-se que os alunos manipulem um dado programa de entrada, cumprindo os seguintes requisitos:

  • Construir a Tabela de identificadores;
  • Adicionar a respectiva declaração de tipo (infira o tipo se necessário), por cada variável usada não declarada.
  • Construir o Data Dependence Graph (DDG), usando a técnica de Single Static Assignment (SSA)
  • Construir o Control Flow Graph (CFG)

Ficha I

Com a intenção de levar os alunos a fazer um exercício de transformação de SW que os obrigue a pensar no problema, nas fases, nas estratégias e nas ferramentas -- percebendo a necessidade de fazer a análise sintatica e semantica, de construir uma representação intermédia (RI), tipo ASD+TabDefs, e de criar uma Base de Regras de Transformação e um Sistema de Reescrita de ASDs para facilitar a especificação e sistematizar a implementação -- pretende-se que crie uma ferramenta para fazer o upgrade de programas escritos em SQL1 para SQL2.

A questão está que em SQL1 não existe a instrução UPDATE TABLE para alterar um ou mais campos não-chave de um registo. Isso leva a que a actualização é sempre feita à custa de uma remoção (REMOVE FROM T WHERE chv="X") seguida de uma inserção (INSERT INTO T (chv="X", a1=...) ).

O upgrader a implementar deve detectar os pares (REMOVE,INSERT) na mesma chaves e substituir por um UPDATE nessa mesma chaves.


r11 - 18 Oct 2010 - 05:58:03 - 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