Compilação de Linguagens OO
Marco Simões (macs3)
André Santos (alms)
Tópicos da Aula




Alocação de Objetos e Classes
Herança e Polimorfismo
Verificação de Tipos
Garbage Collection
Revisando alocação de dados ...

Alocação Estática
–

Alocação na Pilha
–

Variáveis Globais
Variáveis Locais e Passagem de Argumentos
Alocação no Heap
–
Variáveis Dinâmicas
Alocação de Dados numa
Linguagem OO
public float dist(Point that) {
 Exemplo:
int dx= this.x – that.x;
class Point {
int dy= this.y – that.y;
protected int x,y;
return Math.sqrt(dx*dx +
public Point (int x, int y) {
dy*dy);
this.x=x; this.y=y;
}
}
}
public void move(int dx, int dy) {
this.x += dx; this.y += dy;
}
public float area() {
return 0.0;
}
Alocação das Instâncias
Construtor
move
area
dist
Heap
Objeto de
Classe Point
x
y
x
y
Instâncias
x
y
Variáveis e Invocação de Métodos
p
2
3
q
0
0
Heap
Construtor
move
area
dist
Point p = new Point(2,3);
Point q = new Point(0,0);
Variáveis e Invocação de Métodos
p
3
4
q
0
0
Heap
Construtor
move
area
dist
Point p = new Point(2,3);
Point q = new Point(0,0);
p.move(1,1);
Atribuições
p
3
4
q
0
0
Heap
Construtor
move
area
dist
Point p = new Point(2,3);
Point q = new Point(0,0);
p.move(1,1);
q = p;
Herança: exemplo
class Circle extends Point {
class Box extends Point {
protected int r;
protected int w,d;
public Circle (int x, int y, int r) {
public Box (int x, int y, int w, int d) {
this.x = x; this.y = y; this.r = r;
this.x = x; this.y = y;
}
this.d=d; this.w = w;
public int radius() { return this.r; }
}
public double area() {
public int width() { return this.w; }
double pi=3.1416;
public int depth() { return this.d; }
return pi*this.r*this.r;
public double area() {
}
return (double) this.w * this.d;
}
}
}
Alocação de Classes e Objetos
com Herança
p
c
b
Point p = null;
Circle c =
new Circle(0,12,4);
Box b =
new Box(0,4,8,8);
0
12
4
0
4
8
8
Heap
Construtor
move(herdado)
area(sobreposto)
dist(herdado)
radius
Construtor
move(herdado)
area(sobreposto)
dist(herdado)
width
depth
Polimorfismo
p
0
20
32
c
b
a
50.3
p = c;
p.move(20,20);
double a = p.area();
0
4
8
8
Heap
Construtor
move(herdado)
area(sobreposto)
dist(herdado)
radius
Construtor
move(herdado)
area(sobreposto)
dist(herdado)
width
depth
Verificação de Tipos



No exemplo anterior, tentativas de acessar o
atributo p.r devem ser identificadas como erro
de tipo.
Da mesma forma, qualquer tentativa de
invocar o método p.radius() será identificada
pelo Verificador de Tipos como erro de tipo.
Se a Linguagem não for type-safe uma série
de outros erros de tipo poderão ocorrer. Ex:
C++
Considerações




O deslocamento de cada variável de instância em
relação à base de cada objeto é constante
O deslocamento de cada método de instância relativo
à base da do objeto-classe também é constante
Variáveis de classe podem ser tratadas como variáveis
globais, mas devem estar associadas ao objeto-classe
Métodos de classe podem ser tratados como
procedimentos comuns, mas devem estar associados
ao objeto-classe
Garbage Collection: questões




O que é considerado lixo (Garbage) ?
Quais problemas podem acontecer se o
lixo(Garbage) não for eliminado ?
Que problemas podem surgir em decorrência
da desalocação explícita ?
A desalocação automática ou coleta de lixo
(Garbage Collection) pode ser implementada
através de vários algoritmos
Garbage Collection: algoritmo
Mark-sweep



Marque todas as variáveis do Heap como
inacessíveis
Siga todas as cadeias de ponteiros a partir da
pilha, marcando cada variável de Heap
atingida como acessível
Ao final do passo anterior, todas as variáveis
que ainda estiverem marcadas como
inacessíveis devem ser desalocadas
Algoritmo Mark-sweep: um
exemplo
...
...
...
...
...
...
...
...
e
d
c
X e
X d
X c
 e
X d
 c
 e
b
a
X b
X a
X b
 a
 c
 a
Considerações sobre o algoritmo





O algoritmo deve ser capaz de visitar todas as
variáveis de Heap
O algoritmo precisa saber o tamanho de todas
as variáveis de Heap
O algoritmo precisar ter permissão para
marcá-las como inacessíveis ou acessíveis
Possível solução: campos tamanho, link e
acessibilidade escondidos
Ponteiros precisam ser distinguidos de outros
tipos
Download

Compilação de Linguagens OO