Escolar Documentos
Profissional Documentos
Cultura Documentos
gestão de memória
Linguagens de Programação
2017.2018
Teresa Gonçalves
tcg@uevora.pt
2 LP 1718
Linguagens estruturadas em blocos
3
LP 1718
Bloco
O que é? Exemplo
Região de texto do programa Decl.
nova variável
Como se identifca?
Marcadores de início e fm { int x=2;
{ int y=3;
O que contém?
x=y+2;
Declarações locais à região
}
Instruções Global Local
}
Bloco interior
Bloco exterior
4 LP 1718
Linguagens estruturadas em blocos
Blocos em linha
C
{…}
Pascal
begin … end
ML
let … in … end
Funções / procedimentos
Associados à execução
5 LP 1718
Propriedades
6 LP 1718
Conceitos básicos
Âmbito
Região do texto do programa onde a declaração é visível
Tempo de vida
Período de tempo onde a localização está acessível ao programa
Exemplo
{ int x = … ;
{ int y = … ;
Tempo de vida de x inclui o
{ int x = … ;
tempo de execução do bloco
…. interior
} Esta declaração de x esconde a
variável x exterior → buraco de
} âmbito
}
7 LP 1718
Modelo simplifcado da máquina
Runtim
e Stack
Program Counter
Heap
Environment Pointer
8 LP 1718
Gestão de memória
Segmento de dados
Stack contém informação relativa à entrada/saída dos blocos
Para cada bloco existe um registo de ativação
Heap contém informação com tempo de vida variável
Apontador de ambiente
Aponta para o registo de ativação corrente
Entrada no bloco → adição de um novo registo de ativação
Saída do bloco → remoção do registo de ativação mais recente
9 LP 1718
Variáveis e parâmetros
Variáveis locais
Mantidas no registo de ativação associado ao bloco
Variáveis globais
São declaradas noutro bloco → estão num registo de ativação criado
anteriormente ao bloco corrente
10 LP 1718
Registo de ativação
11 LP 1718
Variáveis locais e globais
Variável local
Variável declarada no bloco atual
Variável global
Variável declarada fora do bloco atual
O acesso involve encontrar o RA “certo” no stack
Exemplo
x e y locais no bloco exterior { int x=0;
z local no bloco interior int y=x+1;
x e y globais no bloco interior { int z=(x+y)*(x-y);
}
}
12 LP 1718
Blocos em linha
13
LP 1718
Blocos em linha
Registo de ativação
Espaço para variáveis locais
Espaço adicional para valores intermédios (se necessário)
Exemplo
{ int x=0; Push registo com espaço para x, y
Atribui valores a x e y
int y=x+1;
Push registo para bloco interior
{ int z=(x+y)*(x-y); Atribui valor a z
} Pop registo do bloco interior
14 LP 1718
RA para blocos em linha
15 LP 1718
Exemplo
Control link
{ int x=0;
int y=x+1; x 0
{ int z=(x+y)*(x-y); y 1
}
} Control link
z -1
Push registo com espaço para x, y
x+y 1
Atribui valores a x e y
x-y -1
Push registo para bloco interior
Atribui valor a z
Pop registo do bloco interior
Environment
Pop registo do bloco exterior Pointer
16 LP 1718
Funções e procedimentos
17
LP 1718
Funções e procedimentos
Sintaxe
<tipo> function f(<pars>)
{
<vars locais>;
<corpo função>;
}
Registo de ativação
Endereço de retorno
Endereço para valor de retorno da função
Parâmetros
Variáveis locais
Resultados intermédios (+ valor de retorno)
18 LP 1718
RA para funções
Control link
End. retorno
End. retorno
Endereço do código a executar
depois do retorno da função End. valor retorno
19 LP 1718
Exemplo
Control link
Função
End. retorno
fact(n) = if n<=1
then 1 End. valor retorno
20 LP 1718
Chamada de função
1 + fact(3)
fact(n) = if n<=1 fact(3) Control link
then 1
End. valor retorno
else n*fact(n-1)
n 3
fact(k) fact(n-1)
Control link fact(2) Control link
End. valor retorno
End. valor retorno
n k
n 2
fact(n-1)
fact(n-1)
fact(1) Control link
21 LP 1718
Retorno da função
22 LP 1718
Parâmetro formal e atual
Parâmetro formal
Nome utilizado na declaração da função
Parâmetro atual
Valor do parâmetro numa chamada de função
Exemplo
proc p ( int x, int y){
if (x>y) then … else ...;
… Parâmetros formais
x := y*2+3;
… Parâmetros atuais
}
p (z, 4*z+1);
23 LP 1718
R-value e L-value
Atribuição
x := y+3
L-value
Refere localização da variável
R-value
Refere conteúdo da variável
24 LP 1718
Passagem por referência e por valor
25 LP 1718
Exemplo
por
g em y 0
s a ia
Pas rênc f(y)
e
ref
f(y)
function f (x) = Control link
26 LP 1718
Outro exemplo
Qual o output?
27 LP 1718
Acesso a variáveis globais
28 LP 1718
Regras de âmbito
Âmbito estático
Global refere o identifcador declarado no bloco envolvente mais
próximo do texto do programa
Utiliza a relação estática entre blocos
Âmbito dinâmico
Global refere o identifcador associado ao registo de ativação mais
recente
Utiliza a sequência dinâmica de chamadas na execução
29 LP 1718
RA para âmbito estático
Control link
Control link
Access link Ligação ao RA do bloco anterior
(chamador)
End. retorno
Depende do comportamento
End. valor retorno dinâmico do programa
Parâmetros
Access link
Ligação ao RA do bloco
Variáveis locais envolvente mais próximo (no
texto do programa)
Resultados intermédios
Depende da forma estática do
texto do programa
Environment Pointer Também designado por static
link
30 LP 1718
Âmbito estático
Bloco em linha
O bloco envolvente mais próximo é o bloco mais recente
control link = access link
Função
O bloco envolvente mais próximo é determinado pelo sítio onde a
função é declarada, que usualmente é diferente do sítio onde é
chamada
control link ≠ access link!
31 LP 1718
Exemplo
Bloco x 1
var x=1; exterior
control link
function g(z) { access link
return x+z; g …
}
control link
function f(y) { access link
var x = y+1; f …
return g(y*x); f(3) control link
} access link
f(3); y 3
x 4
32 LP 1718
Access link
33 LP 1718
Âmbito nas linguagens de programação
Âmbito dinâmico
Primeiros Lisp
Tex/Latex
Exceções
Macros
Âmbito estático
Novos Lisp, Scheme
Algol e Pascal
C
ML
Outras lings. atuais
34 LP 1718
Recursividade terminal
Chamada terminal
A chamada da função f no corpo de g é terminal se g retornar o
resultado da chamada de f sem mais computação
fun g(x) = if x>0 then f(x) else f(x)*2
Recursividade terminal
A função f é recursiva terminal se todas as chamadas recursivas em
f forem terminais
fun fact(n,a) =
if n<=1 then a else fact(n-1, n*a)
35 LP 1718
Recursividade terminal
Chamada terminal
A chamada da função f no corpo de g é terminal se g retornar o
resultado da chamada de f sem mais computação
fun g(x) = if x>0 then f(x) else f(x)*2
Recursividade terminal
A função f é recursiva terminal se todas as chamadas recursivas em
f forem terminais
fun fact(n,a) =
if n<=1 then a else fact(n-1, n*a)
36 LP 1718
Exemplo
f(1,3) CL
fun f(x,y) =
end. val ret
if x>y then x x 1
else f(2*x, y); y 3
f(1,3) + 7; f(2,3) CL
end. val ret
x 2
y 3
f(4,3) CL
end. val ret
x 4
y 3
37 LP 1718
Otimização
Exemplo
fun f(x,y) = if x>y then x else f(2*x, y);
f(1,3) + 7;
38 LP 1718
Recursividade terminal e iteração
São equivalentes!
40
LP 1718
Função de ordem superior
Caraterísticas
declarada em qualquer âmbito
passada como argumento de outras funções
devolve função como resultado
41 LP 1718
Linguagens com funções de 1ª classe
42 LP 1718
Função como argumento
val x = 4; global
O que é?
A representação do valor de uma função em linguagens com funções
de 1ª classe e âmbito estático
Como é constituído?
Par <ambiente, código>
Ambiente → aponta o RA da declaração da função
Código → aponta o código da função
Como funciona?
Quando uma função é chamada é criado o RA e
O access link fca com o valor do ambiente do fecho da função
44 LP 1718
Função como argumento e fecho
val x = 4;
fun f(y) = x*y;
x 4
fun g(h) = código
access de f
let val x=7
f
in
access
h(3) + x;
g código
g(f); de g
g(f) access
g(f) h
x 7
h(3) access
h(3) AL atribuido
y 3 através do fecho
45 LP 1718
Resumo
46 LP 1718
Função como resultado de função
Exemplo
fun compose (f,g) = (fn x => g (f x));
47 LP 1718
Exemplo
48 LP 1718
Função como resultado e fecho
fun mk_counter (init:int) =
let val count = ref init
fun counter (inc:int)=(count:=!count+inc;!count)
in counter end;
val c = mk_counter(1); mk_c
c(2) + c(2); código de
mk_counter
access
c
3 5
mk_counter(1) access 1
mk_counter(1) init 1
RA necessário após o
count
retorno de mk_counter
porque a função count counter
devolvida necessita das
vars init e count c(2) access
c(2)
inc 2
código de
A chamada altera o valor counter
de count de 1 para 3
49 LP 1718
Resumo
Como resolver?
Esquecer a libertação explícita
Colocar os RA na heap
Invocar o garbage collector quando necessário
50 LP 1718
Conceitos importantes
51 LP 1718