organização do ambiente de execução (runtime system) representação de dados avaliação de...
Post on 19-Apr-2015
110 Views
Preview:
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