Análise e Transformação de Software
Exemplos para as aulas
- Para o seguinte programa:
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.