Organização do Ambiente de Execução (Runtime System) gap semântico Geração de código Tipos e...
Transcript of Organização do Ambiente de Execução (Runtime System) gap semântico Geração de código Tipos e...
Organização do Ambiente de Execução (Runtime System)
gap semânticoGeração de código
Tipos e valoresvariáveis expressões
procedimentosfunções
parâmetros
Linguagem deProgramação
bits byteswordsregistradores
pilhasendereços
Sub-rotinas
ArquiteturaFí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: – 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
x
y
Representação direta de x
Representação indireta de x
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 1 byte
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;
1
1
2000
‘u’
5
5
1978
Truetoday.y
today.m
today.d
her.female
her.dob
her.status
her.dob.y
her.dob.m
her.dob.d
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
point
5
circle
4
3
boxfig.s fig.s
fig.r
fig.s
fig.h
fig.w
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
‘A’
‘B’
‘C’
‘N’
‘F’
‘G’
15100
15200
15000
14200
13500grade[-2]
grade[-1]
grade[0]
grade[1]
grade[2]
grade[3]
gnp[2000]
gnp[2001]
gnp[2002]
gnp[2003]
gnp[2004]
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)
1
7
0
4
‘J’
‘e’
‘f’
‘f’
k = 7m = 0n = 4 ‘e’
‘n’
‘n’
‘a’
‘s’
‘u’
‘S’origem
d[6]
d[7]
d[5]
d[4]
d[3]
d[2]
s[0]
s[3]
s[2]
s[1]
limite inferior
limite superior
origem
limite inferior
limite superior
d
s
d[1]
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
2
3
5
7
primes
manipulador
Avaliação de Expressões (Máquina de Registradores)
• (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 (Máquina de Pilha)
• (a * b) + (1 – (c * 2))• LOAD a
LOAD bMULTLOADL 1LOAD cLOADL 2MULTSUBADD