organização do ambiente de execução (runtime system) representação de dados avaliação de...

Post on 19-Apr-2015

110 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

Interesse Prático

• Todo programador deve ter uma idéia básica dos aspectos de eficiência de várias construções da linguagem.

• Exemplo: escolha de estruturas de dados

Representação de Dados

• Booleanos, Inteiros, Caracteres, Registros, Arrays etc.

• Bits, bytes, words, double words.

• Gap semântico.

Princípios Básicos

• Não confusão: valores diferentes de um tipo devem ter representações diferentes.

• Unicidade: cada valor (de um determinado tipo) deveria ter a mesma representação.

Questões Pragmáticas

• Representação em tamanho constante• Representação direta ou indireta

Representação de tipos primitivos

• Booleanos

• Caracteres

• Inteiros

Representação de Registros

type Data = record y:Integer, m: Integer, d: Integer end;

type Details = record female: Boolean, dob: Date, status: Char end;

var today: Date;var her: Details;

Representação de união disjunta

• Tag e parte variante

• Valor do tag determina o tipo da parte variante

• Representação matemática: T = T1 + … + Tn

• Operações: teste do tag e projeção da parte variante

Representação de união disjunta

• Exemplos: registros variantes em Pascal e Ada, datatypes em Haskell e ML

• type Number = record case acc: Boolean of true: (i: Integer); false: (r: Real) end;

Representação de Arrays

• Arrays estáticos

• Arrays dinâmicos

Representação de tipos recursivos

type IntList = ^IntNode;

type IntNode = record head: Integer; tail: IntList; end;

var primes: IntList;

Avaliação de expressões

• (a * b) + (1 – (c * 2))

• LOAD R1 aMULT R1 bLOAD R2 #1LOAD R3 cMULT R3 #2SUB R2 R3ADD R1 R2

Avaliação de expressões

• (a * b) + (1 – (c * 2))• LOAD a

LOAD bMULTLOADL 1LOAD cLOADL 2MULTSUBADD

Avaliação de expressões

• (0 < n) /\ odd(n)

• LOADL 0LOAD nLTLOAD nCALL oddAND

Organização do Armazenamento

• Estática

• Dinâmica (pilha e heap)

Alocação estática

• endereços são conhecidos em tempo de compilação, possibilitando acesso mais eficiente.

• Valores “persistem” entre chamadas diferentes a procedimentos (se usada para procedimentos).

Alocação estática - limitações

• tamanho dos objetos tem que ser conhecido em tempo de compilação.

• Procedimentos recursivos não são permitidos.

• Estruturas de dados não podem ser criadas dinâmicamente.

Organização do Armazenamento - pilha

• Uso da pilha para armazenar variáveis locais

• A pilha também para armazenar o estado do programa quando da chamada de procedimentos: valores de registradores, contador do programa etc.

Registros de Ativação ou frame

• empilhado no início da execução de um procedimento e desempilhado ao final.

Alocação na pilha

• baseada em uma pilha de controle, com registros de ativação sendo empilhados e desempilhados.

• Armazenamento de variáveis locais na pilha (no registro de ativação da chamada).

• Valores locais são removidos (perdidos) ao final da ativação (tempo de vida)

Alocação na Pilha

– Tempo de vida aninhado (variáveis locais)

– Frames: um frame para cada procedimento ativo

– Registradores: StackBase, LocalBase, StackTop

– Link data: return address e dynamic link

Alocação na heap

• necessária quando valores de nomes locais devem ser mantidos após o fim da ativação, ou

• se uma ativação deve sobreviver ao procedimento chamador.

• Gerenciamento da heap pode ser feito de várias maneiras (automático ou controlado pelo programador).

Pilha x Heap

• Como o tamanho desses estruturas cresce e diminui dinamicamente, normalmente elas são estruturadas de forma a uma crescer em direção à outra.

top related