230 likes | 299 Views
Understanding the organization of the runtime system, data representation, memory allocation, routines, objects, and methods is essential for programmers. This includes practical aspects of efficiency in language constructions, such as choosing data structures and representation of data types like booleans, integers, characters, records, and arrays. Key fundamentals include avoiding confusion between different values, ensuring uniqueness of representations for each value, and dealing with pragmatic issues like constant size representation and direct or indirect representation. Topics covered involve representation of primitive types, disjoint unions, arrays (static and dynamic), recursive types, expression evaluation, and storage organization (static and dynamic allocation including stack and heap).
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.