Cálculo de Programas

Licenciatura em Engenharia Informática

Tópicos

Avisos

27 Set As notas da época especial foram publicadas na secção de funcionamento. O aluno que não preencheu o nome deve contactar pessoalmente o responsável da disciplina com a máxima urgência.

17 Jul O exame da época especial será no dia 21 de Setembro às 14h00 na sala 2206.

25 Jul As notas dos exames de recurso foram publicadas na secção de funcionamento. Os exames podem ser consultados na 3ª feira, dia 28 de Julho às 11h00 na sala DI 0.02. As orais para os alunos com notas de 8 e 9 serão no mesmo dia e sala às 14h00.

9 Jul A consulta dos testes será na sala DI 0.02.

Arquivo

Enunciado do Projecto0708

Considere o seguinte tipo Haskell para representar uma linguagem de programação imperativa muito simples:

data Exp = Const Int 
         | Var String 
         | Add Exp Exp 
         | Sub Exp Exp

data Cond = Eq Exp Exp 
          | Gt Exp Exp

data Lang = Atrib String Exp 
          | If Cond Lang Lang 
          | While Cond Lang 
          | Seq Lang Lang

Na linguagem Lang seria possível escrever um programa para calcular o máximo de dois números da seguinte forma:

x = 3;
y = 4;
if (x>y) r = x else r = y;

Note que nesta linguagem não existe input/output, sendo o resultado de executar um programa o valor final das suas variáveis. As variáveis de um programa Lang são sempre do tipo inteiro. Em Haskell este programa seria representado pelo seguinte termo:

maximo :: Lang
maximo = Seq (Atrib "x" (Const 4)) $ 
         Seq (Atrib "y" (Const 3)) $ 
         If (Gt (Var "x") (Var "y")) (Atrib "r" (Var "x")) 
                                     (Atrib "r" (Var "y"))

Usando ciclos é possível escrever programas um pouco mais sofisticados, como por exemplo o seguinte que coloca em r o resultado de multiplicar x e y.

x = 4;
y = 3;
r = 0;
while (y>0) {r = r + x; y = y - 1}

Tarefa 1
Escrever um interpretador para a linguagem Lang, ou seja, uma função que dado um programa devolve o valor final das suas variáveis.

Relembre a arquitectura Y86 que é leccionada nas disciplinas de Sistemas de Computação e Arquitectura de Computadores. A descrição simplificada desta arquitectura pode ser encontrada aqui.

É relativamente simples compilar programas escritos em Lang para esta arquitectura. Por exemplo, o seguinte programa em Y86 é um possível resultado de compilar o programa maximo.

  .pos 0
  irmovl stack, %esp
  jmp main
x:
  .long 0
y:
  .long 0
r:
  .long 0
main:
  irmovl 4, %eax
  irmovl x, %ecx
  rmmovl %eax, 0(%ecx)
  irmovl 3, %eax
  irmovl y, %ecx
  rmmovl %eax, 0(%ecx)
  irmovl x, %ecx
  mrmovl 0(%ecx), %ebx
  irmovl y, %ecx
  mrmovl 0(%ecx), %eax
  subl %eax, %ebx
  jle else
  irmovl x, %ecx
  mrmovl 0(%ecx), %eax
  irmovl r, %ecx
  rmmovl %eax, 0(%ecx)
  jmp fim
else:
  irmovl y, %ecx
  mrmovl 0(%ecx), %eax
  irmovl r, %ecx
  rmmovl %eax, 0(%ecx)
fim:
  halt
  .pos 0x100
stack:

Tarefa 2
Escrever um compilador que, dado um programa escrito em Lang, gere um programa Y86 equivalente.

Para que o programa acima possa executar na máquina Y86 tem que antes passar por um assembler, que o converte numa sequência de bytes pronta a carregar na memória. Cada instrução é codificada numa sequência de 1 a 6 bytes de acordo com o documento acima referido. Também é necessário converter a tags em endereços de memória absolutos, tendo em atenção não só o comprimento de cada instrução, mas também as directivas pos usadas.

Tarefa 3
Escreva um assembler que, dado um programa escrito em Y86, gere a sequência de bytes que o implementa.

Depois de passado pelo assembler, um programa está finalmente pronto a executar.

Tarefa 4
Implemente um simulador da arquitectura Y86. Este simulador é uma função que, dada a sequência de bytes produzida pelo assembler, carrega essa sequência na memória e começa a execução do programa com o PC a zero. O resultado desta função é o estado final da memória, dos registos e das flags.

Tarefa 5
Para além das tarefas apresentadas acima, cada grupo deve implementar mais alguma funcionalidade à sua escolha. Sugerem-se as seguintes, por ordem de preferência: teste da correcção do compilador usando QuickCheck; incluir funcionalidades de debugging no simulador que permitam consultar o estado da máquina durante a sua execução; extender a funcionalidade da linguagem Lang, nomeadamente incluindo a possibilidade de definir e invocar funções.

Logística

O projecto deverá ser realizado em grupos de 3 alunos. Toda a documentação (vulgo relatório) deve ser desenvolvida em literate Haskell ou afins (Haddock, lhs2TeX, ...).

Para ter aprovação no projecto é necessário executar no mínimo a tarefa 4 mais uma das 3 primeiras tarefas. A tarefa 5 vale 3 valores. Naturalmente, deverão sempre que possível usar monads na resolução das tarefas descritas.

O projecto deverá ser apresentado preferencialmente nos dias 12 e 13 de Maio à tarde. Opcionalmente, poderá ser apresentado no dia 7 de Maio também à tarde. A apresentação terá a duração de 30m. As folhas para marcação da apresentação serão disponibilizadas na recepção do departamento na semana de 7 a 11 de Abril. Não serão permitidas marcações fora deste período.

r5 - 20 Feb 2009 - 14:00:21 - AlcinoCunha
This site is powered by the TWiki collaboration platform Copyright © by the contributing authors. Ideas, requests, problems? Send feedback.
Syndicate this site RSSATOM