Você está na página 1de 8

1

Compiladores
Ambiente de execuo
2
Ambientes de Execuo
Relacionar o cdigo fonte com aes a
serem executadas em tempo de execuo
Conjunto de rotinas (run-time support
package) carregado junto com o cdigo
objeto gerado
Composio do cdigo objeto
declaraes
comandos
rea de dados
cdigo objeto
3
Questes Importantes
Representaes de dados
Procedimentos e Regras para visibilidade
de variveis
Alocao de memria para vrias classes
de armazenamento
Chamadas de procedimentos:
entrada
sada
retorno
4
Representao de tipos bsicos
Variveis de tipos simples so
representadas por localizaes de
memria suficientemente grandes para
conter cada tipo:
char: 1 byte
integers: 2 ou 4 bytes
floats: 4 a 16 bytes
booleans: 1 bit (usualmente 1 byte)
5
Representacao de tipos estruturados
Arranjos:
linearizados por linha (row-major)
Maioria das linguagens de programao
tipo matriz[dim
1
, dim
2
, ..., dim
n
;
O endereo de matriz[i
1
,i
2
,...,i
n
] :
base(matriz) + size(tipo) .
k=1..n
(i
k
-dim
k
)
j=k+1..n
(dim
j
+1)
linearizados por coluna (row-major)
Fortran
6
Representao de tipos estruturados
struct s1 {
int large1;
short int small1;
};
struct s2 {
int large2 : 18;
short int small2 : 10;
};
32 16 16
18 10 4
large1
large2
small1
small2

7
Uso de registradores
Acesso mais rpido que a memria
Nmero limitado pois so caros a nvel de hardware
Metas:
Alocar as variveis mais freqentemente usadas pelo
maior tempo possvel
Acessar variveis no armazenadas em registradores o
mais rpido possvel
Minimizar o nmero de registradores usados para
gerenciamento do acesso de memria
Maximizar a eficincia de chamadas de procedimentos e
operaes relacionadas
8
Comandos
Organizados em procedimentos:
Declarao com um nome associado que
realiza uma dada tarefa
Definio:
nome
variveis
corpo
9
Procedimentos em ao (ativao)
Fluxo de controle:
Execuo seqencial (seqncia de passos)
comea no incio do corpo
Termina no final do corpo
Tempo de vida:
seqncia de passos executados
Chamada de procedimentos:
desvio de execuo
retorna o controle para o ponto imediatamente
aps o ponto de chamada
10
program sort(input, output);
var a : array [0..10] of integer;
procedure readarray;
var i: integer;
begin
for i:=1 to 9 do read(a[i]);
end;
function partition(y, z: integer): integer;
var i, j, x, v: integer; begin ... end;
procedure quicksort(m, n: integer);
var i: integer;
begin
if ( n > m) then begin
i:= partition(m, n);
quicksort(m, i-1);
quicksort(i+1, n);
end;
end;
begin
a[0] := -9999; a[10]:= 9999; readarray;
quicksort(1, 9);
end.
11
rvores de Ativao
Cada nodo representa uma ativao de um
procedimento
A raiz representa a ativao do programa principal
O nodo de a pai de b se e somente se o fluxo de
controle muda de a para b
O nodo de a est a esquerda de b se e somente se
a vida de a ocorre antes de b
12
rvores de ativao
execution begins s

13
rvores de ativao
execution begins
enter readarray
s
r
14
rvores de ativao
execution begins
enter readarray
leave readarray
s
r
15
rvores de ativao
execution begins
enter readarray
leave readarray
enter quicksort(1, 9)
s
r q(1,9)
16
rvores de ativao
execution begins
enter readarray
leave readarray
enter quicksort(1, 9)
enter partition(1, 9)
s
r q(1,9)
p(1,9)
17
rvores de ativao
execution begins
enter readarray
leave readarray
enter quicksort(1, 9)
enter partition(1, 9)
leave partition(1,9)
s
r q(1,9)
p(1,9)
18
rvores de ativao
execution begins
enter readarray
leave readarray
enter quicksort(1, 9)
enter partition(1, 9)
leave partition(1,9)
enter quicksort(1,3)
s
r q(1,9)
q(1,3)
p(1,9)

19
rvores de ativao
execution begins
enter readarray
leave readarray
enter quicksort(1, 9)
enter partition(1, 9)
leave partition(1,9)
enter quicksort(1,3)
...
leave quicksort(5, 9)
s
r q(1,9)
q(1,3)
p(1,3) q(1,0) q(2,3)
p(2,3) q(2,1) q(3,3)
p(7,9) q(7,7) q(9,9)
p(5,9) q(5,5) q(7,9)
q(5,9) p(1,9)
20
rvores de ativao
execution begins
enter readarray
leave readarray
enter quicksort(1, 9)
enter partition(1, 9)
leave partition(1,9)
enter quicksort(1,3)
...
leave quicksort(5, 9)
leave quicksort(1,9)
s
r q(1,9)
q(1,3)
p(1,3) q(1,0) q(2,3)
p(2,3) q(2,1) q(3,3)
p(7,9) q(7,7) q(9,9)
p(5,9) q(5,5) q(7,9)
q(5,9) p(1,9)
21
rvores de ativao
execution begins
enter readarray
leave readarray
enter quicksort(1, 9)
enter partition(1, 9)
leave partition(1,9)
enter quicksort(1,3)
...
leave quicksort(5, 9)
leave quicksort(1,9)
execution terminated
s
r q(1,9)
q(1,3)
p(1,3) q(1,0) q(2,3)
p(2,3) q(2,1) q(3,3)
p(7,9) q(7,7) q(9,9)
p(5,9) q(5,5) q(7,9)
q(5,9) p(1,9)
22
Pilhas de controle
Fluxo de controle corresponde a uma busca em
profundidade na rvore de ativao
Usar uma pilha para controlar as ativaes de
procedimentos ativos
s
r q(1,9)
q(1,3)
p(1,3) q(1,0) q(2,3)
p(1,9)
23
Organizao de Memria
Como a memria do programa
armazenada ?
Cdigo objeto gerado
Espao para variveis globais
rea esttica
Pilha para ativao de procedimentos
Espao para memria dinmica (heap)
24
Organizao de Memria
rea dados (SisOp)
Texto
Cdigo
PC
Pilha
Stack Pointer
HEAP

25
Alocao de memria
Alocao esttica:
reserva de memria feita durante a compilao,
de forma esttica.
Tipo (ou comprimento) do dado conhecido em
tempo de compilao
Comprimento no modificado durante a execuo
do programa
26
Alocao de memria
Alocao dinmica (HEAP):
estruturas de dados referenciadas atravs de
ponteiros, as reas tambm so reservadas
dinamicamente.
reas so alocadas e liberadas, sob o controle do
programa
alocadas na rea de "heap", que cresce no
sentido contrrio ao da pilha.
Cdgo ob|eto
Dados esttcos

Pha
Heap
27
Alocao de memria
Alocao em pilha (STACK):
reas para dados locais de procedimentos (subrotinas
ou funes) devem ser alocadas dinamicamente.
A alocao de espao de memria somente pode ser
realizada em tempo de execuo, porque a ordem de
chamadas determinada pela execuo do programa.
reas so alocadas numa estrutura em pilha de ativao
de procedimentos.
Na pilha entram (e saem) registros de ativao.
28
Registro de Ativao
aponta para dados no-locais, armazenados
em outros registros de ativao
valor retornado
parmetros efetivos
ponteiro de controle
ponteiro de acesso
estado da CPU
variveis locais
temporrios
podem ser passados ou retornados em
registradores (para maior eficincia)
"program counter"e registradores
aponta para o registro de ativao
da rotina chamadora
29
Ponteiros de Acesso

parmetros e
valores retornados
apontadores de controle
e estado da mquina
variveis locais
e temporrios
avaliados pela rotina chamadora
algumas informaes so preenchidas
pela rotina chamadora
rea usada pela
rotina chamada
registro de ativao da
rotina chamadora
sp
fp
2 ponteros:
frame_ponter (fp): aponta para o regstro de atvao corrente
stack_ponter (sp): topo da pha de regstros de atvao
30
Cdigo de Chamada
Rotina chamadora:
Avalia os parmetros efetivos e os coloca na pilha
Registradores em uso pelo chamador so salvos em
memria
Armazena o endereo de retorno e o valor antigo do
frame_pointer no registro de ativao da rotina
chamada e atualiza o valor do frame_pointer;
Rotina chamada:
Salva valores de registradores e outras informaes
do estado da mquina;
Inicializa variveis locais e comea sua execuo.

31
Cdigo de Retorno
Rotina chamada:
Armazena o valor de retorno logo aps o registro de
ativao da rotina chamadora;
Restaura o apontador topo_ra e os registradores da
mquina e desvia para o endereo de retorno dentro
da rotina chamadora;
Rotina chamadora:
Copia o valor retornado no seu prprio registro de
ativao
32
Controle

parmetros e
valores retornados
apontadores de controle
e estado da UCP
variveis locais
e temporrios
parmetros e
valores retornados
variveis locais
e temporrios
apontadores de controle
e estado da UCP
. . .
controlado pela
rotina chamadora
controlado pela
rotina chamada
registro de ativao
da rotina chamadora
registro de ativao
da rotina chamada topo_ra
33
Escopo de declaraes
Escopo: rea de atuao de uma varivel
Nveis de escopo:
Diferentes lugares onde variveis so definidas
Escopos aninhados: uma linha de cdigo pode
pertencer a mais de um escopo
Escopo corrente: o mais interno
Escopos abertos e fechados
34
Funes associadas a nomes (bindings)
Ambiente:
Mapear um nome para uma localizao de
memria
Estado:
Mapear uma posio de memria ao valor
armazenado
nome memra vaor
ambente estado
L-VALUE R-VALUE
35
Funes associadas a nomes
vida de uma
associao
escopo de uma
declarao
associao de
um nome
declarao de um
nome
ativaes de
procedimento
definio de um
procedimento
Noo dinmica Noo esttica
36
Checagem de escopo
Como fazer ?
Pilha de escopos (pilha de tabela de smbolos):
Uma entrada para cada escopo
Escopo corrente est no topo da pilha
Escopo global est no final da pilha
Empilhar/desempilhar escopos
Busca de nomes: acessar escopos do topo para o
incio da pilha

37
Pilha de ativao com ponteiros de acesso
expoX
x, erro, expX:real
somatorio(2.5,0.0001)
expoX
fatorial(5)
n: integer
expoX
fatorial(5)
n: integer
ponteiro acesso
fatorial(3)
n: integer
fatorial(4)
n: integer
x, erro, expX:real
x, tol, soma, termo: real
n: integer
x, tol, soma, termo: real
n: integer
somatorio(2.5,0.0001) somatorio(2.5,0.0001)
x, tol, soma, termo: real
n: integer
x, erro, expX:real
38
Pilhas de ativao com ponteiros de nveis
expoX
x, erro, expX
somatorio(2.5, 0.0001)
x, tol, soma, termo, n
fatorial(5)
n: integer
fatorial(3)
n: integer
fatorial(4)
n: integer
V[1]
V[2]
V[3] salvo
V[3]
V[2]
V[1]
x, erro, expX
fatorial(5)
n: integer
V[3]
V[2]
V[1] V[3] salvo
V[3] salvo
expoX
somatorio(2.5, 0.0001)
somatorio(2.5, 0.0001)
x, tol, soma, termo, n
expoX
x, erro, expX
x, tol, soma, termo, n
39
Checagem de escopo
Como fazer ?
Pilha de escopos (pilha de tabela de smbolos):
Uma entrada para cada escopo
Escopo corrente est no topo da pilha
Escopo global est no final da pilha
Empilhar/desempilhar escopos
Busca de nomes: acessar escopos do topo para o incio da
pilha
nica tabela de escopos com identificador de escopo
Usar um contador de escopos como identificador
Busca deve varrer toda tabela
40
Passagem de Parmetros
Passagem de parmetros por valor
Mtodo mais simples de passagem de parmetros
Parmetros so avaliados, e seus valores so
passados para o procedimento chamado.
Implementao:
um parmetro formal tratado exatamente como um nome
local, de maneira que a memria para os parmetros formais
reservada no registro de ativao do procedimento
chamado;
o procedimento chamador avalia os parmetros reais e
armazena seus valores na memria reservada para os
parmetros formais.
41
Passagem de Parmetros
Passagem de parmetros por endereo
Procedimento chamador passa o endereo de cada
parmetro real.
Se um parmetro real :
Identificador:
seu endereo passado;
Expresso:
expresso avaliada num temporrio, e o endereo desse
temporrio passado;
Referncias a parmetros formais, no procedimento
chamado, so feitas de forma indireta.
42
Passagem de Parmetros
Passagem de parmetros por cpia-restaurao
Meio-termo entre passagem por valor e passagem por
referncia (ADA inout e FORTRAN)
Tambm conhecido como passagem por valor-resultado
(call-by-value-result):
Antes da transferncia para o procedimento chamado:
os parmetros reais so avaliados.
argumentos que correspondem a valores so passados por valor
argumentos que correspondem a endereos so determinados.
No retorno do procedimento:
os valores dos argumentos computados pelo procedimento so
copiados nos endereos anteriormente determinados.

43
Passagem de Parmetros
Passagem de parmetros por nome
Tradicional da linguagem Algol 60 (pouco usado)
Procedimento chamado tratado como se fosse uma
macro:
sua chamada substituda pelo corpo do procedimento
parmetros formais so literalmente substitudos pelos parmetros
de chamada
nomes locais do procedimento chamado so mantidos distintos dos
nomes do procedimento chamador (cada nome sistematicamente
renomeado antes de ser realizada a expanso da macro)
44
Passagem de Parmetros
program prova2;
var v1, v2: integer;
function f1(m, n: integer): integer;
var v1: integer;
function f2(var n: integer): integer;
var v2: integer;
begin
v2 := 1;
n := v1*v2;
f2 := n+v1 (1)
end;
begin
v1 := 3 + v2;
v1 := f2(v1);
f1 := m + n + v1; (2)
end;
begin
v1 := 0; v2 := 1;
v1 := f1(v1, v2); (3)
end.
A passagem por parmetros feita por valor (default) e por referncia (precedendo o parmetro com var).
Desenhe o estado da pilha de execuo para os 3 pontos indicados, mostrando os valores dentro da
pilha logo aps executar o comando da linha marcada.
valor retornado
parmetros reais
ponteiro de controle
ponteiro de acesso
estado da UCP
variveis locais
temporrios
45
Sntese
1. Pode a memria ser alocada dinamicamente ?
2. Pode a memria ser liberada explicitamente ?
Heap vs. Pilha
3. Procedimentos podem ser recursivos ?
Pilha de ativao
4. O que acontece com valores de nomes quando o controle retorna de
uma ativao ?
5. Pode um procedimento referenciar nomes no locais ?
Ponteiros de acesso
6. Como os parmetros so passados quando procedimentos so
chamados ?
Passagem de parmetros
7. Podem procedimentos ser chamados como parmetros ?
8. Podem procedimentos ser retornados como resultados ?
Os assuntos apresentados trazem respostas s perguntas
seguintes:

Você também pode gostar