Exame de CASS

Transcrição

Exame de CASS
Exame de CASS
5 Janeiro 2011
(duração: 2h:30m+30m)
I
Considere o seguinte procedimento escrito numa linguagem da famı́lia Java
int select(int a[], int size, int element, int b[]) {
int s = 0;
int t = 0;
while(s != size) {
if( a[s] <= element ) {
b[t] = a[s];
t = t + 1;
}
s = s + 1;
}
return t;
}
1. Indique para a função select a pré-condição mais fraca e a pós-condição mais forte que
achar conveniente. (Nota: na linguagem de asserções, pode usar o valor constante inteiro
b.length() que indica o número de elementos alocados num vector b dado.)
2. Mostre que a função select apresentada acima garante de facto a pós-condição sempre que
os seus argumentos verifiquem a pre-condição (use as condições que indicou na resposta à
alı́nea anterior). Indique todas as asserções intermédias que considerou em todos os pontos
do programa, incluindo a condição invariante do ciclo while.
II
Considere a seguinte especificação da função replace disponı́vel na classe java.lang.String.
public String replace(char oldChar, char newChar)
Returns a new string resulting from replacing all occurrences of oldChar
in this string with newChar. If the character oldChar does not occur in the
character sequence represented by this String object, then a reference to this
String object is returned. Otherwise, a new String object is created that
represents a character sequence identical to the character sequence represented
by this String object, except that every occurrence of oldChar is replaced by
an occurrence of newChar.
Examples:
"mesquite in your cellar".replace(’e’, ’o’) returns "mosquito in your collar"
"the war of baronets".replace(’r’, ’y’) returns "the way of bayonets"
Parameters:
oldChar - the old character.
newChar - the new character.
Returns:
a string derived from this string by replacing every occurrence of oldChar
with newChar.
1
1. Defina um modelo (isto é, um programa equivalente) da função replace na linguagem imperativa base usada nas aulas. (Nota: Pode substituir a string a que se aplica a operação
(objecto this) e a string resultado, por dois parâmetros (char[]) da função modelo.)
2. Para o modelo que construiu na alı́nea anterior, defina as pré-condições e a pós-condições
que achar mais adequadas.
3. Justifique detalhadamente usando lógica de Hoare, que o seu modelo da função replace
satisfaz a pós-condição se for executado num estado que satisfaça a pré-condição.
III
Este exercı́cio trata de controlo de concorrência usando monitores programados correctamente em
Java. Considere o problema de implementar uma matriz de acesso concorrente para processamento
de uma imagem através de filtros. Considere uma classe Matrix, que implementa um constructor
que aceita a largura e altura da matriz, os métodos int get(int i,int j) e void set(int i,
int j, int v). Tendo em conta que a aplicação de filtros a uma imagem normalmente requer
ler uma quantidade de grande de pontos em posições adjacentes ao ponto que se quer modificar,
pretende-se suportar o processamento de vários pontos em paralelo. Apresente o código de uma
classe wrapper, CMatrix que disponibilize a classe Matrix a um número indeterminado de threads.
A sua implementação deverá assegurar como invariante que não existem acessos simultâneos de
escrita à matriz (races).
1. Apresente o código da sua solução. Explique que variáveis-condição são necessárias para
definir o monitor, e qual é a asserção associada a cada uma. Indique também para cada
método pré-condições adequadas.
2. Exprima a invariante da classe, e argumente que ela é válida para uso de CMatrix’s por um
número arbitrário de threads, da forma mais rigorosa possı́vel.
IV
Imagine que se pretende definir um algoritmo de análise estática para programas imperativos
simples (declaração, afectação, if-then, while e output), que apenas manipulam valores inteiros e
que dispõem das quatro operações usuais e comparação de igualdade (linguagem SPL usada nas
aulas teóricas). Pretende-se que a análise seja utilizada para eliminar variáveis cujo valor nunca
é utilizado (e a respectiva expressão de inicialização) e para melhorar a alocação de variáveis a
registos no processo de compilação.
1. Explique que informação é necessário associar a cada nó de um CFG (grafo de fluxo de
controlo) para realizar a análise, usando a técnica geral abordada na disciplina.
2. Indique, para cada tipo de nó num CFG, como a informação a ele associada é calculada
com base na informação associada aos seus predecessores e antecessores no CFG.
3. É possı́vel que a sua análise não indique todas as variáveis num programa que seria possı́vel
eliminar? Justifique com exemplos concretos.
4. Aplique a técnica que definiu acima ao programa seguinte e enuncie quais os resultados que
se extraem da análise estática, e use-os para optimizar o seguinte programa:
int x,y,z,v,w;
x = 0;
y = x + 1;
z = 2*x;
v = 0;
while( z < 100 ) {
if( x%2 == 1 ) {
v = v + 1;
w = x + y + z;
}
z = 2*v;
}
out v;
2