200 likes | 315 Views
COMPILADORES 07. Prof. Marcos. AMBIENTES EM TEMPO DE EXECUÇÃO Execuçao. Antes da geração de código, deve ser relacionado o texto-fonte do programa com as ações que precisam ocorrer em tempo de execução.
E N D
COMPILADORES 07 Prof. Marcos
AMBIENTES EM TEMPO DE EXECUÇÃO Execuçao Antes da geração de código, deve ser relacionado o texto-fonte do programa com as ações que precisam ocorrer em tempo de execução. Ocorre um relacionamento entre os nomes no texto fonte e os objetos de dados na máquina (Utilização da tabela de Símbolos).
AMBIENTES EM TEMPO DE EXECUÇÃO Execuçao A alocação e liberação dos objetos de dados são gerenciados pelos pacotes de suporte em tempo de execução. A representação de um objeto de dados, em tempo de execução, é determinada pelo seu tipo.
AMBIENTES EM TEMPO DE EXECUÇÃO Execuçao Normalmente tipos de dados elementares (char, int float double) podem ser representados porr objetos de dados equivalentes, mas, agregados de dados (arrays, Strings, estruturas) são representados por coleções de objetos de dados.
AMBIENTES EM TEMPO DE EXECUÇÃO Execuçao • Um bloco de memória é disponibilizado para a execução do programa-alvo. Essa memória é dividida em: • Código • Objeto de dados • Pilha de Controle Código Dados Pilha Livre Heap
AMBIENTES EM TEMPO DE EXECUÇÃO Execuçao Quando ocorre uma chamada, a execução é interrompida e as informações sobre o estado da máquina, tais como os valores do apontador da próxima instrução e dos registradores de máquina são salvos na pilha. Quando o controle retorna, da chamada, os registradores são recompostos e o apontador da próxima instrução fica apontando para a instrução após aquela que efetuou a chamada.
AMBIENTES EM TEMPO DE EXECUÇÃO Execuçao Uma área chamada heap abriga todas as outras informações do programa. Tanto a pilha quanto o heap mudam de tamanho durante a execução. As linguagens baseadas em C necessitam da pilha e do heap, mas nem todas as linguagens usam os dois.
AMBIENTES EM TEMPO DE EXECUÇÃO Execuçao Para a execução de um procedimento cria-se um bloco contíguo na memória chamado de registro de ativação com: Valor Retornado Parâmetros Atuais Controle - Opcional Acesso - Opcional Estado do SO salvo Dados Locais Prof. Marcos Antonio Dados Temporários
AMBIENTES EM TEMPO DE EXECUÇÃO Execuçao Dados Temporários: resultados de expressões. Dados Locais: P/ a execução do procedimento. Estado do SO: Estado antes da chamada. Acesso: LP que os dados locais não são fixos. Controle: Aponta o Reg. de Ativação Chamador. Parâmetros: Passados pelo chamador. Valor Retornado: Valor ao chamador..
AMBIENTES EM TEMPO DE EXECUÇÃO Memória Endereço Memória Por exemplo: int x = 9. Cada posição de memória corresponde apenas a um byte e uma variável inteira ocupa, geralmente, 4 bytes. Assim, o número 9 vai estar representado em 4 posições de memória (ex: E2, E3, E4 e E5). E0 E1 0000 0000 E2 0000 0000 E3 0000 0000 E4 0000 1001 E5 ̊ ̊ ̊ En
AMBIENTES EM TEMPO DE EXECUÇÃO Memória Representação de ARRAYs Ao declarar um array y de 10 inteiros, o compilador vai reservar um bloco de memória consecutivo que permita guardar esses 10 inteiros. Como um inteiro ocupa 4 bytes, o compilador terá de reservar um bloco de 40 bytes (por exemplo do endereço E100 até o endereço E139).
AMBIENTES EM TEMPO DE EXECUÇÃO Memória Em arrays com quantidades fixas de elementos, tem o problema de não se saber quantos iremos serão utilizadis, então uma estratégia é: declarar os arrays com uma dimensão máxima. Por exemplo: Um programa para ordenar uma lista de n números, em que n seria um número a ser introduzido pelo usuário, teria que fazer algo parecido com:
AMBIENTES EM TEMPO DE EXECUÇÃO Memória #include <stdio.h> #define N 10000 int main() { int y[N]; int n; printf("Quantos números quer ordenar? "); scanf("%d", &n); if( n > N ) printf(“ERRO: O tamanho máximo do array é %d\n", N); else /* código para introduzir e ordenar o array de n números */ ... }
AMBIENTES EM TEMPO DE EXECUÇÃO Memória DESVANTAGEM Criamos um array de 10000 inteiros e se utilizarmos somente 10 ou 20 ou 100 ? Esta solução tem a desvantagem de desperdiçar memória.
AMBIENTES EM TEMPO DE EXECUÇÃO Memória Uma alternativa é requisitar a memória durante a própria execução do programa. Se o usuário digitar 10, solicitamos um bloco de memória que permita guardar 10 inteiros. Deste modo, o array ocupa apenas o espaço que é estritamente necessário.
AMBIENTES EM TEMPO DE EXECUÇÃO Memória a biblioteca stdlib.h existe uma função chamada malloc que permite requisitar, em tempo de execução, n bytes de memória (malloc é uma abreviatura de memory alocation).
AMBIENTES EM TEMPO DE EXECUÇÃO Memória #include <stdio.h> #include <stdlib.h> int main() { int *y; int i, k, m, min, temp, n; printf("Quantos números quer ordenar? "); scanf("%d", &n); y = (int *) malloc( n * sizeof(int) ); if( y == NULL ) { printf("ERRO: nao ha memoria.\n"); exit(1); }
AMBIENTES EM TEMPO DE EXECUÇÃO Memória /* Receber os valores a ordenar */ for (i=0; i<n; i++) { printf("%d.º numero -> ", i+1); scanf("%d",&y[i]); }
AMBIENTES EM TEMPO DE EXECUÇÃO Memória /* Ordenar o array */ for( k=0; k<=n-1; k++ ) { /* o índice do menor em y[k], y[k+1], ..., y[n-1] */ min = y[k]; m = k; for( i=k; i<=n-1; i++ ) if( y[i] < min ) { min = y[i]; m = i; }
AMBIENTES EM TEMPO DE EXECUÇÃO Memória /* troca a[k] com a[m] */ temp = y[k]; y[k] = y[m]; y[m] = temp; } /* Mostrar os elementos do array ordenados */ for( i=0; i<n; i++ ) printf("%d ", y[i]); printf("\n"); /* libertar a memória */ free( y ); }