Page 1
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
Page 2
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
Page 3
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
Page 4
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 !!!
Page 5
Representação de Dados
• Linguagem:– Booleanos, Inteiros, Caracteres, Registros,
Arrays etc.
• Arquitetura Física: – Bits, bytes, words, double words.
• Gap semântico;
Page 6
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 …
Page 7
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;
Page 8
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
Page 9
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;
Page 10
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
Page 11
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;
Page 12
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
Page 13
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;
Page 14
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
Page 15
Representação de União Disjunta
point
5
circle
4
3
boxfig.s fig.s
fig.r
fig.s
fig.h
fig.w
Page 16
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]
Page 17
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)
Page 18
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]
Page 19
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)))
Page 20
Representação de Tipos Recursivos
2
3
5
7
primes
manipulador
Page 21
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
Page 22
Avaliação de Expressões (Máquina de Pilha)
• (a * b) + (1 – (c * 2))• LOAD a
LOAD bMULTLOADL 1LOAD cLOADL 2MULTSUBADD