Organização do Ambiente de Execução (Runtime System) Tipos e valores variáveis expressões procedimentos funções parâmetros Linguagem de Programação Geração de código gap semântico bits bytes words registradores pilhas endereços Sub-rotinas Arquitetura Física
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
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 HOJE !!!
Representação de Dados Linguagem: Booleanos, Inteiros, Caracteres, Registros, Arrays etc. Arquitetura Física: Bits, bytes, words, double words. Gap semântico;
Princípios Básicos Não confusão: Unicidade: Valores diferentes (de um tipo) devem ter representações diferentes; Evita problemas em operações de comparação; Números Reais … (confusão é inevitável ) Unicidade: Cada valor deve ter a mesma representação. Desejável, porém não essencial; Representação de inteiros …
Questões Pragmáticas Representação em tamanho constante Todos os valores de um tipo tem mesmo tamanho; Compilador pode planejar alocação de espaço; Representação direta ou indireta Direta: Pascal, C, etc. Tipos primitivos em JAVA®; Indireta (apontadores): Linguagens Funcionais (Haskell, ML, …); Objetos em linguagens OO (Java®); Essencial para tipos cujos valores variam de tamanho;
Rep. Direta vs. Rep. Indireta x Representação direta de x x Representação indireta de x y Representação indireta de y, com mesmo tipo de x, mas requisitando maior espaço
Representação de tipos primitivos Booleanos 1 byte ou word; Caracteres Tabelas de caracteres; ISO-Latin1 (28), UNICODE (216), etc. Inteiros Em geral, representado por 1 word; -maxint, …, -1, 0, 1, …, +maxint; Maxint = 2w-1 – 1, onde w = size[[Integer]]; Java: w = 32;
Representação de tipos primitivos Exemplo: Intel Pentium 1 word = 32 bits; Armazenamento organizado em 8-bit (byte), 16-bit (half-word), 64-bit (double-word); Type Representação Size Booleano 000000002 e 111111112 1 byte Caractere ASCII Inteiros twos-complement 1 half-word ou word
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 Registros Representação direta; Simples justaposição dos campos; her.female True today.y 1 2000 her.dob.y 1978 today.m her.dob her.dob.m 5 today.d her.dob.d 5 ‘u’ her.status
Representação de união disjunta Representação matemática: T = T1 + … + Tn Tag (identifica o Ti) e parte variante (Ti); Valor do tag determina o tipo da parte variante; Operações: teste do tag e projeção da parte variante; Exemplos: Registros variantes em Pascal e Ada; Uniões em Algol-68; Tipos Algébricos em Haskell e ML (funcionais); Tamanho da parte variante varia … Como manter requisito de tamanho constante ? Aloque o máximo de bytes necessários;
Representação de união disjunta type Shape = (point, circle, box); Figure = record case s: Shape of point: () circle: (r: Integer) box: (h,w: Integer) end; var fig:Figure
Representação de União Disjunta fig.s point fig.s circle fig.s box fig.r 5 fig.h 3 fig.w 4
Representação de Arrays Arrays estáticos Limites conhecidos em tempo de compilação; Justaposição dos valores; var grade: array [-2..3] of Char gnp: array [2000..2004] of Integer grade[-2] ‘A’ ‘B’ ‘C’ ‘N’ ‘F’ ‘G’ gnp[2000] 15100 15200 15000 14200 13500 grade[-1] gnp[2001] grade[0] gnp[2002] grade[1] gnp[2003] grade[2] gnp[2004] grade[3]
Representação de Arrays Arrays dinâmicos Limites conhecidos em tempo de execução; Representação indireta: Manipulador (descritor de array): limites + ponteiro; Exemplo em Ada: type String is array (Integer range <>) of Character d: String (1 .. k) s: String (m .. n - 1)
Representação de Arrays Dinâmicos (Ada) ‘u’ ‘S’ origem 1 7 d[1] d limite inferior d[2] limite superior d[3] d[4] k = 7 m = 0 n = 4 d[5] d[6] d[7] origem 4 ‘J’ ‘e’ ‘f’ s[0] s limite inferior s[1] limite superior s[2] s[3]
Representação de Tipos Recursivos type IntList = ^IntNode; type IntNode = record head: Integer; tail: IntList; end; var primes: IntList; data IntList = Nil | Cons Int IntList primes :: IntList primes = Cons 2 (Cons 3 (Cons 5 (Cons 7 Nil)))
Representação de Tipos Recursivos primes 2 manipulador 3 5 7
Avaliação de Expressões (Máquina de Registradores) (a * b) + (1 – (c * 2)) LOAD R1 a MULT R1 b LOAD R2 #1 LOAD R3 c MULT R3 #2 SUB R2 R3 ADD R1 R2
Avaliação de Expressões (Máquina de Pilha) (a * b) + (1 – (c * 2)) LOAD a LOAD b MULT LOADL 1 LOAD c LOADL 2 MULT SUB ADD