Buscar

10 AmbientesExecucao - Compiladores CEFET MG

Prévia do material em texto

Compiladores 
Prof.ª Kecia Aline Marques Ferreira 
CEFET-MG 
 
Ambientes de Execução 
1 
Ambientes de Execução 
 
• Introdução 
• Organização de memória 
• Alocação de espaço na pilha 
– Árvores de ativação 
– Registros de ativação 
– Sequências de chamadas 
 
 
 
 
 
 
2 
Introdução 
• Um compilador precisa implementar com precisão as abstrações 
incorporadas na definição da linguagem de programação, tais como: 
 
– nomes 
– escopos 
– amarrações 
– tipos de dados 
– operadores 
– procedimentos 
– parâmetros 
– construções de fluxo de controle 
 
• O compilador coopera com o sistema operacional e outros softwares do 
sistema para dar suporte a essas abstrações na máquina alvo 
 
• Para fazer isso, o compilador assume um ambiente em tempo de execução 
no qual presume que seus programas serão executados 
 
 
 
3 
Organização de Memória 
• Em geral, considera-se que: 
– o endereçamento em tempo de execução é feito em blocos de bytes contíguos 
– um byte é a menor unidade endereçável 
– um byte tem oito bits 
– objetos multibytes são armazenados em bytes consecutivos e recebem o endereço do 
primeiro byte 
 
• A quantidade de memória necessária para um nome é determinada a 
partir de seu tipo 
 
• O tamanho do código objeto gerado é fixado durante a compilação 
– O compilador associa o código objeto executável a uma área Código determinada 
estaticamente 
 
 
 
 
4 
Organização de Memória 
• Outros objetos, como constantes e variáveis globais, têm tamanho fixado 
durante a compilação e são alocados em uma área determinada 
estaticamente, denominada Estática 
 
• Para maximizar a utilização de espaço durante a execução, duas outras 
áreas localizadas nas extremidades opostas do restante da memória são 
utilizadas: pilha e heap 
 
– Essas áreas são dinâmicas: seus tamanhos mudam à medida que o programa é 
executado 
– Essas áreas crescem uma em direção à outra 
– Pilha: usada para armazenar estruturas de dados denominadas registros de 
ativação (gerados durante as chamadas de procedimentos) 
– Heap: usado para alocação de dados de longa duração (que são alocados e 
liberados sob o controle do programa) 
 
 
 
5 
Organização de Memória 
• Subdivisão típica de memória durante a execução em áreas de código e 
dados 
 
 
 
 
6 
Código 
Estática 
Heap 
Memória livre 
Pilha 
Alocação de espaço na pilha 
 
• Toda vez que um procedimento (função, método) é chamado, o espaço 
para suas variáveis locais é colocado na Pilha 
 
 
• Quando o procedimento termina, esse espaço é retirado da Pilha 
 
 
• A alocação de Pilha é viável porque as chamadas de procedimentos são 
aninhadas no tempo 
 
 
 
7 
Registros de Ativação 
• As chamadas e os retornos de procedimento usualmente são gerenciados 
por uma pilha de execução, chamada pilha de controle 
 
• Cada ativação viva tem um registro de ativação (ou frame) na pilha de 
controle 
 
• A pilha de controle contém: 
– a raiz da árvore de ativação no seu fundo 
– toda a sequência de registros de ativação, correspondendo ao 
caminho na árvore de ativação para a ativação onde o controle está 
correntemente 
– a última ativação no topo da pilha. 
 
• Por convenção, as pilhas de controle são desenhadas com o fundo da pilha 
na parte superior do desenho e o topo em sua parte inferior. 
 
 
 
 
8 
Registros de Ativação 
• Conteúdo de um registro de ativação: 
 
 
 
 
9 
Parâmetros reais 
Valor de retorno 
Elo de controle (control ou dynamic link) 
Elo de acesso (access ou static link) 
Estado da máquina salvo 
Dados locais 
Temporários 
Registros de Ativação 
• Temporários: valores temporários, como aqueles para avaliação de 
expressões, em casos nos quais esses temporários não podem ser 
mantidos em registradores 
 
• Dados locais: dados pertencentes ao procedimento correspondente ao 
registro de ativação 
 
• Estado da máquina salvo: registra informações sobre o estado da 
máquina imediatamente antes da chamada ao procedimento. 
Tipicamente, inclui: 
 
– Endereço de retorno: valor do contador de programa, ao qual o programa 
deve retornar 
 
– Conteúdo dos registradores que foram usados pelo procedimento chamador e 
que precisam ser restaurados quando ocorrer o retorno 
 
 
 
 
10 
Registros de Ativação 
• Elo de acesso: pode ser necessário para localizar os dados utilizados no 
procedimento chamado, mas encontrados em outro lugar, por exemplo, 
em outro registro de ativação 
 
• Elo de controle: apontador para o registro de ativação do procedimento 
chamador 
 
• Valor de retorno: espaço para o valor de retorno da função chamada, se 
houver. 
 
• Parâmetros reais: valores dos parâmetros passados para o procedimento 
 
 
 
 
 
 
11 
Sequências de Chamadas 
• As chamadas de procedimento são implementadas pelo que é conhecido 
como sequências de chamadas. 
 
• Sequência de chamada consiste em código que aloca um registro de 
ativação na pilha de execução e entra com informações em seus campos 
 
• Sequência de retorno é o código que restaura o estado da máquina, de 
modo que o procedimento que chamou possa continuar sua execução 
após a chamada 
 
• O código em uma sequência de chamada é dividido entre o procedimento 
chamador (caller) e o chamado (callee) 
 
• Utiliza-se um registrador top_sp que aponta para o fim do campo estado 
da máquina no registro de ativação corrente 
 
 
 
 
12 
Registros de Ativação 
 
 
 
 
13 
Parâmetros reais 
Valor de retorno 
Elo de controle (control ou dynamic link) 
Elo de acesso (access ou static link) 
Estado da máquina salvo 
Dados locais 
Temporários 
top_sp 
Sequência de Chamada 
• A sequência de chamada e sua divisão entre os procedimentos chamador 
e chamado é a seguinte: 
 
1. O procedimento chamador avalia os parâmetros reais 
2. O procedimento chamador armazena o valor do endereço de retorno e do top_sp 
no campo estado da máquina do registro de ativação do procedimento chamado. 
3. O procedimento chamador atualiza top_sp para que ele passe a apontar para o 
fim do campo de estado da máquina do registro de ativação do procedimento 
chamado 
 
1. O procedimento chamado salva os valores de registradores no campo de estado 
da máquina 
2. O procedimento chamado inicializa os seus dados locais e começa a execução 
 
 
 
 14 
Sequência de Retorno 
• A sequência de retorno correspondente é a seguinte: 
 
1. O procedimento chamado coloca o valor de retorno no campo adequado de seu 
registro de ativação 
2. Com as informações do campo estado da máquina de seu registro de ativação, o 
procedimento chamado: 
– Restaura top_sp 
– Restaura outros registradores 
– Retorna para o endereço de retorno 
 
3. Embora top_sp tenha sido restaurado, o procedimento chamador sabe onde está 
o valor de retorno em relação ao valor corrente de top_sp, então ele pode usar 
esse valor. 
 
 
 
 15 
Referência Bibliográfica 
Compiladores – Princípios, técnicas e ferramentas. 
Aho, A. V et al. 2ª edição 
Capítulo 7: até seção 7.3 (inclusive) 
 
 
 
 
 
 
 
 
16

Continue navegando