Buscar

CES41 Cap 8

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:

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais