230 likes | 293 Views
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.
E N D
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 aLOAD 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.