Capítulo VIII Ambientes de Execução

Slides:



Advertisements
Apresentações semelhantes
Sistemas Operacionais
Advertisements

Parte 1: Organização de Computadores
Parte 1: Organização de Computadores
gerador de código intermediário
Capítulo II – Algoritmos e Programas
Sistemas Operacionais
Alocação Dinâmida de Memória
Algoritmos e Estrutura de Dados I
Prof. Heloise Manica Paris Teixeira
1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
CISC e RISC.
Alocação Dinâmica de Memória
Listas lineares Listas Lineares Fila Dupla Pilha Fila Saída restrita
LPG - I: Alocação Dinâmica de Memória - Ponteiros
Estruturas de Controle
Construção de Compiladores
Aula 4 Nomes, Vinculações, Tipos e Escopos
1 Aula 7 ImplementandoSubprogramas Universidade do Vale do Rio dos Sinos
Listas Encadeadas.
Revisão da Linguagem C.
Sistemas Operacionais I
Gerência de Memória.
Alocação Dinâmica de Memória Professor Mário Dantas
Introdução a Computação e Cálculo Numérico
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Aula prática 13 Orientação a Objetos – C++ Parte 1
Aula prática 6 Vetores e Matrizes
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Fundamentos da Arquitetura de Computadores
Representação de Instruções
Linguagem de Programação II Parte IX
Sistemas Operacionais
Conceitos de Linguagem de Programação
Definição de Tipos Estruturas e Ponteiros
Eric, Fabrício, João Vicente
PROGRAMAÇÃO ESTRUTURADA (MODULARIZAÇÃO/SUBPROGRAMAÇÃO)
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Organização do Ambiente de Execução (Runtime system) Representação de dados Avaliação de expressões Alocação de memória Rotinas Objetos e métodos.
Ambiente de Execução - Rotinas
Algoritmos e Estruturas de Dados I – Ponteiros
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
SISTEMAS OPERACIONAIS I
Sistemas Operacionais
SISTEMAS OPERACIONAIS I Memória Virtual e Paginação
Geração de Código aula-12-geração-de-código.pdf.
Software Básico Nível ISA Capítulo 5 Mitsuo Takaki
Universidade do Vale do Rio dos Sinos - São Leopoldo -
Sistemas Operacionais
Algoritmos - Profa. Alciléia1 Profa. Maria Alciléia Alves Rocha Funções em C 2011.
SISTEMAS OPERACIONAIS I
Algoritmos e Estruturas de Dados
Sistemas Operacionais
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
8088 Assembly Software Básico Mitsuo Takaki.
Fundamentos de linguagens de programação
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Geração de Código Fase final do compilador
Gerenciamento de Memória - Capítulo 7 - Sistemas Operacionais Prof. Dr. José Carlos Becceneri Luciana Sêda Cardoso.
Estrutura de Dados II Alocação Dinâmica. Alocação de memória Ao ser executado, um programa carrega seu código executável para a memória; Uma parte da.
Sistemas de Arquivos Sistemas Operacionais Profa. Priscila Facciolli
SISTEMAS DE INFORMAÇÃO
Ponteiros em C Prof. Kariston Pereira
Ponteiros. Programação II Professora: Mai-Ly vanessa horário: ter 9h-11h; sex 11h-13h Aula 1.
Linguagem de Programação
COMPILADORES 07 Prof. Marcos.
Programação em C Aula 9.
INE5408 Estruturas de Dados Listas Encadeadas Simples.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
Jean Carlo Mendes
FUNÇÕES Dilvan Moreira (baseado em material de Z. Liang)
Transcrição da apresentação:

Capítulo VIII Ambientes de Execução 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 Ponto de entrada do subprograma 1 Código do subprograma 1 Ponto de entrada do subprograma 2 Código do subprograma 2 . Ponto de entrada do subprograma n 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: Valor retornado Parâmetros Ligação de controle Ligação de acesso Status da máquina Variáveis locais Temporárias

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 Valor retornado Parâmetros Ligação de controle Ligação de acesso Status da máquina Variáveis locais Temporárias

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 Valor retornado Parâmetros Ligação de controle Ligação de acesso Status da máquina Variáveis locais Temporárias

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 Valor retornado Parâmetros Ligação de controle Ligação de acesso Status da máquina Variáveis locais Temporárias

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 Área de código . Código do subprograma n Área de dados globais Registro de ativação do programa principal Registro de ativação do subprograma 1 Área de dados . Registro de ativação do subprograma n

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

Pilha de registros de ativação 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 Área de código Área de dados globais e/ou estáticos Espaço livre Heap Pilha de registros de ativação

Pilha de registros de ativaçã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 Área de código Área de dados globais e/ou estáticos Espaço livre Heap Pilha de registros de ativação

Pilha de registros de ativaçã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 Área de código Área de dados globais e/ou estáticos Espaço livre Heap Pilha de registros de ativação

Pilha de registros de ativação 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: 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 Área de código Área de dados globais e/ou estáticos Espaço livre Heap Pilha de registros de ativação

Exemplo: seja o programa a seguir para o QuickSort int A[8]; void ReadVetor ( ) { int i; for (i = 0; i <= 7; i++) scanf (“%d”, &A[i]);} int Partition (int inic, int fim) { - - - - - } void QuickSort (int inic, int fim) { int k; if (inic < fim) { k = Partition (inic, fim); QuickSort (inic, k-1); QuickSort (k, fim); } void main () {ReadVetor (); QuickSort (0, 7);}

Árvore de ativação para certa entrada 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) 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) P(0,7) Q(0,2) P(0,2) Q(0,1) Q(2,2) P(0,1) Q(0,0) Q(1,1) As linhas tracejadas são ativações já completadas, que já pertenceram à pilha da área de dados

A tradução das quádruplas dos operadores CALL, OPENMOD, RETURN deve conter código para gerenciar a pilha de registros de ativação e para construir cada um desses registros Valor retornado Parâmetros Ligação de controle Ligação de acesso Status da máquina Variáveis locais Temporárias

CALL: Deposita os argumentos nos parâmetros Guarda o valor do program-counter Faz as ligações de controle Valor retornado Parâmetros Ligação de controle Ligação de acesso Status da máquina Variáveis locais Temporárias

OPENMOD: Aloca as variáveis locais Guarda valores de registradores importantes Faz as ligações de acesso Aloca variáveis temporárias Valor retornado Parâmetros Ligação de controle Ligação de acesso Status da máquina Variáveis locais Temporárias

RETURN: Coloca o valor a ser retornado em sua posição Restabelece os valores anteriores do program-counter e de outros registradores Desempilha o registro de ativação e, com ele, as variáveis locais Valor retornado Parâmetros Ligação de controle Ligação de acesso Status da máquina Variáveis locais Temporárias

A complexidade de um ambiente de execução baseado em pilha cresce para linguagens com Aninhamentos de subprogramas e/ou de blocos Para essas linguagens, o acesso a variáveis não-locais requer uma procura nos vários registros de ativação presentes na pilha Sem aninhamentos, as variáveis não-locais são as do escopo global