Linguagens e Ambientes de Programação (2022/2023)



Prática 08

Ligações. Escopo estático e escopo dinâmico. Modelo de execução. Exercícios de 40 a 45.



  • 40 - Aplicação de alguns conceitos da aula teórica 13. Considere o seguinte programa em C:
  • 41 - No programa da pergunta 40, diga qual é ambiente no ponto indicado pelo comentário: "aqui".


  • 42 - No programa da pergunta 40, diga qual é o âmbito da variável global "b".


  • 43 - Escreva em C uma função polimórfica para implementar um caso particular de atribuição entre arrays: uma posição dum array recebe o conteúdo de outra posição de outro array. Use a técnica de manipulação direta de memória usando apontadores void * e a função memcpy, que foi usada na aula teórica 15. Se a cópia tiver sucesso, deve ser retornado o valor true. Se a cópia tiver insucesso, por algum dos índices ser inválido, deve ser retornado o valor false. Comece por identificar os argumentos e tipos da função e depois escreva o corpo da função. Na função main exemplifica-se uma chamada da função pretendida.
  • 44 - Mostre o estado da pilha à entrada da função h, durante a execução do seguinte programa GCC. Trata-se do segundo exercício do final da aula teórica 14. É parecido com o primeiro exercício do final da aula teórica 14 (resolvido na própria aula teórica), sendo a única diferença a passagem da função h como parâmetro para a função g, o que obriga a usar uma closure.

    (Extra: Já agora, veja ainda o que acontece se a função h for executada até ao fim.)

    AJUDA:
    1. No nosso modelo de execução, a máquina abstrata possui três registos: PC (program counter), SP (stack pointer) e FP (frame pointer).

    2. A pilha de execução contém registos de ativação (frames) e valores intermédios de operações que ainda não foram completadas.

    3. Quando se chama uma função, empilha-se o respetivo registo de ativação; quando uma função retorna desempilha-se o respetivo registo de ativação.

    4. A zona da informação de controlo num registo de ativação possui três campos:
      • DL - dinamic link - guarda o valor do FP para repor, no retorno; o DL aponta para o DL do registo de ativação imediatamente abaixo (da função que chamou).
      • SL - static link - aponta para o DL da função mãe; serve para aceder às variáveis não locais.
      • PC - program counter - guarda o valor do PC para repor, no retorno. Nos nossos exercícios, nunca sabemos qual é o valor exato e escrevemos '?'

    5. Eis o formato geral dum registo de ativação:
                         ← [SP]
        Variável local n [topo]
        ...
        Variável local 1
        Variável local 0
        PC
        SL
        DL               ← [FP]
        Argumento m
        ...
        Argumento 1
        Argumento 0      [base]
        

    6. Quando se passa uma função como parâmetro, na implementação é preciso passar uma closure = (endereço da função, static link pré-calculado).

    7. Para efeitos da criação do registo de ativação inicial, imaginamos que o programa está embebido numa função sem argumentos chamada start.
      As entidades globais do programa são consideradas locais à função start.

  • 45 - Mostre o estado da pilha de execução do seguinte programa GCC, no exato momento em que a pilha atinge a sua altura máxima.

    (Extra: Já agora, depois continue a execução do programa até ao final.)


  • 46 - Resolva o exercício que aparece no final da aula teórica 17. Confirme que a ferramenta Valgrind descobre todos os erros de execução desse programa e os assinala claramente. Não use o Eclipse, porque a compilação e a execução terão de ser feitas na linha de comando (na compilação, usar as opções -g -O0).


  • 47 - A biblioteca "crypt", referida na teórica 17, permite adicionar aos programas suporte para passwords codificadas. Nos exercícios seguintes, use o código da página: http://www.gnu.org/software/libc/manual/html_node/crypt.html



    Vídeos antigos

    Estes vídeos poderão estar um pouco desatualizados, pois foram feitos no contexto duma edição anterior do LAP. Contudo, partes dos vídeos poderão continuar a ter alguma utilidade.

    Nota: Perderam-se 2 minutos do início do vídeo por causa de problemas técnicos, mas a parte realmente importante não foi prejudicada!

    Nesta 1ª parte da prática 08, resolvem-se os exercícios 44 e 45, os quais vêm na sequência da aula teórica 15.

    (lap prática 08 parte2)