Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
* CES-41 COMPILADORES Capítulo VIII Ambientes de Execução * Capítulo VIII – Ambientes de Execução 8.1 – Organização da memória durante a execução 8.2 – Ambientes de execução estáticos 8.3 – Ambientes baseados em pilhas * 8.1 – Organização da Memória Durante a Execução Um compilador deve organizar o espaço a ser ocupado por um programa Esse espaço deve conter: Instruções executáveis em linguagem de máquina – área de código Armazenamento de informações em processamento (variáveis, constantes) – área de dados * Durante a execução de um programa: Instruções de máquina da área de código são executadas Posições de memória da área de dados são consultadas e alteradas pelas instruções Subprogramas são ativados e desativados As instruções surgem da tradução do código intermediário, com consultas à tabela de símbolos * Visualização da área de código: A área de código é estabelecida antes da execução Código do subprograma 1 Código do subprograma 2 . . . Código do subprograma n * A organização da área de dados depende da semântica da linguagem Perguntas sobre essa semântica: O que deve acontecer com as variáveis locais e seus valores, quando seu subprograma “sai do ar”? Num subprograma, pode-se referenciar variáveis não-locais? Quais os modos de passagem de parâmetros? Os subprogramas podem ser recursivos? Pode haver alocação dinâmica de memória? * A organização da área de dados depende da semântica da linguagem Perguntas sobre essa semântica: A desalocação de memória deve ser explicitada? Subprogramas podem ser parâmetros? Subprogramas podem ser retornados como resultados? Com relação às variáveis de um subprograma, a alocação de memória pode ser: Estática ou Dinâmica * Alocação estática: a posição de memória de cada variável é conhecida antes da execução Não há necessidade de gerenciamento em tempo de execução Chamadas de subprogramas são mais rápidas O local e o número de bytes de cada variável (escalar ou estruturada) é fixo Subprogramas recursivos são muito limitados: Cada variável local não pode ocupar mais de uma posição na memória Estruturas de dados não podem ser criadas dinamicamente * Alocação dinâmica: as variáveis locais de um subprograma ficam alocadas na memória somente enquanto ele estiver em execução Memória para variáveis indexadas pode ser alocada numa quantidade conforme a necessidade Recursividade pode ser usada de modo bem menos restrito Um subprograma pode ter várias ativações simultâneas É necessário incluir no código objeto instruções para gerenciamento de memória em tempo de execução Chamadas de subprogramas são mais demoradas * Registro de ativação: Bloco de memória na área de dados, contendo informações necessárias à ativação de um subprograma Visualização dos campos do registro de ativação de um subprograma: * Registro de ativação: Valor retornado: a ser retirado pela ativação que chamou o subprograma Parâmetros: recebem os argumentos da ativação que chamou o subprograma Ligação de controle: aponta para o registro de ativação de quem chamou o subprograma Ligação de acesso: referências a variáveis não-locais alocadas em outros registros de ativação * Registro de ativação: Variáveis locais: seu layout é planejado pelos dados da TabSimb Temporárias: valores intermediários de cálculo de expressões Status da máquina: valores de registradores (PC, SP, etc.) antes da chamada do subprograma * Registro de ativação: Nem todas as linguagens e compiladores usam todos esses campos: Fortran não usa ligação de acesso Parâmetros e valores retornados muitas vezes usam registradores, para maior eficiência * 8.2 – Ambientes de Execução Estáticos É o tipo mais simples de ambiente Não há necessidade de código para gerenciamento de memória durante a execução Cada subprograma tem um único registro de ativação, alocado antes da execução As variáveis de todos os subprogramas permanecem alocadas durante toda a execução do programa Os valores das variáveis locais se mantêm entre duas chamadas do subprograma * Visualização de toda a área do programa: Código do programa principal Código do subprograma 1 . . . Código do subprograma n Área de dados globais Registro de ativação do programa principal . . . Registro de ativação do subprograma n Registro de ativação do subprograma 1 Área de código Área de dados * 8.3 – Ambientes Baseados em Pilhas Adotados para permitir recursividade de modo mais amplo Um mesmo subprograma pode ter vários registros de ativação Variáveis locais recebem novas posições a cada alocação Registros de ativação são guardados numa pilha * Subdivisão típica do espaço de memória reservado para a execução de um programa: A área de código tem tamanho fixo, determinada antes da execução A área de dados globais e/ou estáticos também é fixa e estabelecida antes da execução * Subdivisão típica do espaço de memória reservado para a execução de um programa: Quando um subprograma é chamado, seu registro de ativação é empilhado Ao se retornar dele, tal registro é desempilhado A alocação dinâmica de variáveis é feita na área heap A pilha e a heap têm tamanhos variáveis durante a execução * Subdivisão típica do espaço de memória reservado para a execução de um programa: Quando um subprograma é chamado, seu registro de ativação é empilhado A execução do subprograma que chama é interrompida No registro empilhado são incluídos os valores do program counter e de outros registradores Também são incluídas as variáveis locais do programa chamado * Subdivisão típica do espaço de memória reservado para a execução de um programa: Ao se retornar de um subprograma, seu registro de ativação é desempilhado:
Compartilhar