ces-41 compiladores capítulo viii ambientes de execução
TRANSCRIPT
CES-41 CES-41 COMPILADORESCOMPILADORES
Capítulo VIIICapítulo VIII
Ambientes de Ambientes de ExecuçãoExecução
Capítulo VIII – Ambientes Capítulo VIII – Ambientes de Execuçãode Execução
8.1 – Organização da memória durante 8.1 – Organização da memória durante a execuçãoa execução
8.2 – Ambientes de execução estáticos8.2 – Ambientes de execução estáticos
8.3 – Ambientes baseados em pilhas8.3 – Ambientes baseados em pilhas
8.1 – Organização da 8.1 – Organização da Memória Durante a Memória Durante a
ExecuçãoExecução Um Um compiladorcompilador deve deve organizar o espaçoorganizar o espaço a a
ser ocupado por um programaser ocupado por um programa
Esse espaço deve conter:Esse espaço deve conter:
Instruções executáveis em linguagem de Instruções executáveis em linguagem de máquina – área de códigomáquina – área de código
Armazenamento de informações em Armazenamento de informações em processamento (variáveis, constantes) – processamento (variáveis, constantes) – área de dadosárea de dados
Durante a Durante a execuçãoexecução de um programa: de um programa:
Instruções de máquinaInstruções de máquina da área de código da área de código são são executadasexecutadas
Posições de memóriaPosições de memória da área de dados são da área de dados são consultadasconsultadas e e alteradasalteradas pelas instruções pelas instruções
SubprogramasSubprogramas são são ativadosativados e e desativadosdesativados
As As instruçõesinstruções surgem da tradução do surgem da tradução do código código intermediáriointermediário, com consultas à , com consultas à tabela de tabela de símbolossímbolos
Visualização da Visualização da área de códigoárea de código::
A área de código é estabelecida A área de código é estabelecida antes da antes da execuçãoexecução
Código do subprograma 1
Código do subprograma 2
.
.
.Código do
subprograma n
Ponto de entrada do subprograma 1
Ponto de entrada do subprograma 2
Ponto de entrada do subprograma n
A A organização da área de dadosorganização da área de dados depende da depende da semântica da linguagemsemântica da linguagem
Perguntas sobre essa semântica:Perguntas sobre essa semântica:
O que deve acontecer com as O que deve acontecer com as variáveis locaisvariáveis locais e e seus valores, quando seu subprograma seus valores, quando seu subprograma “sai do “sai do ar”ar”??
Num subprograma, pode-se referenciar Num subprograma, pode-se referenciar variáveis não-locaisvariáveis não-locais??
Quais os modos de Quais os modos de passagem de parâmetrospassagem de parâmetros??
Os subprogramas podem ser Os subprogramas podem ser recursivosrecursivos??
Pode haver Pode haver alocação dinâmicaalocação dinâmica de memória? de memória?
A A organização da área de dadosorganização da área de dados depende da depende da semântica da linguagemsemântica da linguagem
Perguntas sobre essa semântica:Perguntas sobre essa semântica:
A A desalocação de memóriadesalocação de memória deve ser deve ser explicitada?explicitada?
SubprogramasSubprogramas podem ser podem ser parâmetrosparâmetros??
SubprogramasSubprogramas podem ser podem ser retornadosretornados como como resultados?resultados?
Com relação às Com relação às variáveisvariáveis de um subprograma, a de um subprograma, a alocação de memória alocação de memória pode ser:pode ser:
Estática ou DinâmicaEstática ou Dinâmica
Alocação estática: Alocação estática: a posição de memória de cada a posição de memória de cada variável é conhecida variável é conhecida antes da execuçãoantes da execução
Não há necessidade de gerenciamento em tempo Não há necessidade de gerenciamento em tempo de execuçãode execução
ChamadasChamadas de subprogramas são mais de subprogramas são mais rápidasrápidas
O local e o número de bytes de cada variável O local e o número de bytes de cada variável (escalar ou estruturada) é (escalar ou estruturada) é fixofixo
Subprogramas Subprogramas recursivosrecursivos são muito são muito limitadoslimitados: : Cada Cada variávelvariável local não pode ocupar mais de local não pode ocupar mais de
uma uma posiçãoposição na memória na memória
Estruturas de dados Estruturas de dados nãonão podem ser criadas podem ser criadas dinamicamentedinamicamente
Alocação dinâmica: Alocação dinâmica: as as variáveis locais variáveis locais de um de um subprograma ficam alocadas na memória somente subprograma ficam alocadas na memória somente enquanto ele estiver enquanto ele estiver em execuçãoem execução
Memória para Memória para variáveis indexadasvariáveis indexadas pode ser pode ser alocada numa quantidade conforme a alocada numa quantidade conforme a necessidadenecessidade
RecursividadeRecursividade pode ser usada de modo bem menos pode ser usada de modo bem menos restritorestrito
Um Um subprogramasubprograma pode ter várias pode ter várias ativações ativações simultâneassimultâneas
É necessário incluir no código objeto instruções É necessário incluir no código objeto instruções para para gerenciamento de memóriagerenciamento de memória em tempo de em tempo de execuçãoexecução
ChamadasChamadas de subprogramas são mais de subprogramas são mais demoradasdemoradas
Registro de ativação:Registro de ativação:
Bloco de memória na área de dados, contendo Bloco de memória na área de dados, contendo informações necessárias à informações necessárias à ativaçãoativação de um de um subprogramasubprogramaVisualização dos campos do registro de ativação de um subprograma:
Valor retornado
ParâmetrosLigação de controle
Ligação de acessoStatus da máquina
Variáveis locais
Temporárias
Registro de ativação:Registro de ativação:
Valor retornado
ParâmetrosLigação de controle
Ligação de acessoStatus da máquina
Variáveis locais
Temporárias
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:Registro de ativação:
Valor retornado
ParâmetrosLigação de controle
Ligação de acessoStatus da máquina
Variáveis locais
Temporárias
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:Registro de ativação:
Valor retornado
ParâmetrosLigação de controle
Ligação de acessoStatus da máquina
Variáveis locais
Temporárias
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 8.2 – Ambientes de Execução EstáticosExecução Estáticos
É o tipo mais É o tipo mais simplessimples de ambiente de ambiente
Não há necessidadeNão há necessidade de código para de código para gerenciamento de memória durante a execuçãogerenciamento de memória durante a execução
Cada Cada subprogramasubprograma tem um tem um únicoúnico registro de registro de ativação, alocado ativação, alocado antes da execuçãoantes da execução
As variáveis de todos os subprogramas As variáveis de todos os subprogramas permanecempermanecem alocadasalocadas durante toda a durante toda a execução do programa execução do programa
Os valores das variáveis locais se mantêm Os valores das variáveis locais se mantêm entre entre duas chamadasduas chamadas do subprograma do subprograma
Visualização de toda a área do programa:Visualização de toda a área do programa:
Código do programa principalCó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 8.3 – Ambientes Baseados em Pilhasem Pilhas
Adotados para permitir Adotados para permitir recursividaderecursividade de de modo mais amplo modo mais amplo
Um mesmo subprograma pode ter Um mesmo subprograma pode ter vários vários registros de ativaçãoregistros de ativação
Variáveis locais recebem Variáveis locais recebem novas posiçõesnovas posições a a cada alocaçãocada alocação
Registros de ativaçãoRegistros de ativação são guardados numa são guardados numa pilhapilha
Subdivisão típica do espaço de memória Subdivisão típica do espaço de memória reservado para a execução de um programa:reservado para a execução de um programa:
Área de código
Área de dados globais e/ou estáticos
Espaço livre
Heap
Pilha de registros de ativação
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 Subdivisão típica do espaço de memória reservado para a execução de um programa:reservado para a execução de um programa:
Área de código
Área de dados globais e/ou estáticos
Espaço livre
Heap
Pilha de registros de ativação
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 Subdivisão típica do espaço de memória reservado para a execução de um programa:reservado para a execução de um programa:
Área de código
Área de dados globais e/ou estáticos
Espaço livre
Heap
Pilha de registros de ativação
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 Subdivisão típica do espaço de memória reservado para a execução de um programa:reservado para a execução de um programa:
Área de código
Área de dados globais e/ou estáticos
Espaço livre
Heap
Pilha de registros de ativação
Ao se retornar de um subprograma, seu registro de ativação é desempilhado:
•A execução da ativação do subprograma que o chamou é retomada
•Os valores do program counter e de registradores relevantes são restabelecidos
•A variáveis locais do subprograma chamado são desalocadas
Exemplo:Exemplo: seja o programa a seguir para o seja o programa a seguir para o QuickSortQuickSort
int A[8];int A[8];
void ReadVetor ( ) {void ReadVetor ( ) {
int i; for (i = 0; i <= 7; i++) scanf (“%d”, &A[i]);}int i; for (i = 0; i <= 7; i++) scanf (“%d”, &A[i]);}
int Partition (int inic, int fim) { - - - - - }int Partition (int inic, int fim) { - - - - - }
void QuickSort (int inic, int fim) {void QuickSort (int inic, int fim) {
int k;int k;
if (inic < fim) {if (inic < fim) {
k = Partition (inic, fim);k = Partition (inic, fim);
QuickSort (inic, k-1); QuickSort (k, fim);QuickSort (inic, k-1); QuickSort (k, fim);
}}
}}
void main () {ReadVetor (); QuickSort (0, 7);}void main () {ReadVetor (); QuickSort (0, 7);}
Árvore de ativação para certa entrada de Árvore de ativação para certa entrada de dados:dados:
main
Read Q(0,7)
Q(0,2) Q(3,7)P(0,7)
Q(0,1) Q(2,2)P(0,2) Q(3,4)
Q(5,7)P(3,7)
Q(0,0)
Q(1,1)
P(0,1)
Q(3,3)
Q(4,4)
P(3,4)
Q(5,6)
Q(7,7)
P(5,7)
Q(5,5)
Q(6,6)
P(5,6)
As ativações vivas são as que ficam na pilha da área de dados
Exemplo: ativações na pilha, no início da ativação de Q(2,2)
main
Read Q(0,7)
Q(0,2)P(0,7)
Q(0,1) Q(2,2)P(0,2)
Q(0,0)
Q(1,1)
P(0,1)
As linhas tracejadas são ativações já completadas, que já pertenceram à pilha da área de dados
Exemplo: ativações na pilha, no início da ativação de Q(2,2)
A tradução das quádruplas dos operadoresA tradução das quádruplas dos operadores
CALLCALL, , OPENMODOPENMOD, , RETURNRETURN
deve conter código para gerenciar a pilha de deve conter código para gerenciar a pilha de registros de ativação e para construir cada um registros de ativação e para construir cada um desses registrosdesses registros
Valor retornado
ParâmetrosLigação de controle
Ligação de acessoStatus da máquina
Variáveis locais
Temporárias
CALL:CALL:
Deposita os argumentos nos parâmetrosDeposita os argumentos nos parâmetros Guarda o valor do Guarda o valor do program-counterprogram-counter Faz as ligações de controleFaz as ligações de controle
Valor retornado
ParâmetrosLigação de controle
Ligação de acessoStatus da máquina
Variáveis locais
Temporárias
OPENMOD:OPENMOD:
Aloca as variáveis locaisAloca as variáveis locais Guarda valores de registradores importantesGuarda valores de registradores importantes Faz as ligações de acessoFaz as ligações de acesso Aloca variáveis temporáriasAloca variáveis temporárias
Valor retornado
ParâmetrosLigação de controle
Ligação de acessoStatus da máquina
Variáveis locais
Temporárias
RETURN:RETURN:
Coloca o valor a ser retornado em sua posiçãoColoca o valor a ser retornado em sua posição Restabelece os valores anteriores do Restabelece os valores anteriores do program-program-
countercounter e de outros registradores e de outros registradores Desempilha o registro de ativação e, com ele, Desempilha o registro de ativação e, com ele,
as variáveis locaisas variáveis locaisValor retornado
ParâmetrosLigação de controle
Ligação de acessoStatus da máquina
Variáveis locais
Temporárias
A A complexidadecomplexidade de um ambiente de execução de um ambiente de execução baseado em pilha baseado em pilha crescecresce para linguagens com para linguagens com
AninhamentosAninhamentos de subprogramas e/ou de de subprogramas e/ou de blocosblocos
Para essas linguagens, o acesso a Para essas linguagens, o acesso a variáveis variáveis não-locaisnão-locais requer uma procura nos requer uma procura nos vários vários registros de ativaçãoregistros de ativação presentes na pilha presentes na pilha
Sem aninhamentosSem aninhamentos, as variáveis não-locais , as variáveis não-locais são as do são as do escopo globalescopo global