Baixe o app para aproveitar ainda mais
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
Compartilhar