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