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 – Variáveis Globais Alocação na Pilha – Variáveis Locais e Passagem de Argumentos Alocação no Heap – Variáveis Dinâmicas
Alocação de Dados numa Linguagem OO Exemplo: class Point { protected int x,y; public Point (int x, int y) { 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; } public float dist(Point that) { int dx= this.x – that.x; int dy= this.y – that.y; return Math.sqrt(dx*dx + dy*dy); }
Alocação das Instâncias Construtor move area dist Objeto de Classe Point x y x y x y InstânciasHeap
Variáveis e Invocação de Métodos Construtor move area dist Heap Point p = new Point(2,3); Point q = new Point(0,0); p q
Variáveis e Invocação de Métodos Construtor move area dist Heap Point p = new Point(2,3); Point q = new Point(0,0); p q p.move(1,1);
Atribuições Construtor move area dist Heap Point p = new Point(2,3); Point q = new Point(0,0); p q p.move(1,1); q = p;
Herança: exemplo class Circle extends Point { protected int r; public Circle (int x, int y, int r) { this.x = x; this.y = y; this.r = r; } public int radius() { return this.r; } public double area() { double pi=3.1416; return pi*this.r*this.r; } class Box extends Point { protected int w,d; public Box (int x, int y, int w, int d) { this.x = x; this.y = y; this.d=d; this.w = w; } public int width() { return this.w; } public int depth() { return this.d; } public double area() { return (double) this.w * this.d; }
Alocação de Classes e Objetos com Herança Construtor move(herdado) area(sobreposto) dist(herdado) radius Construtor move(herdado) dist(herdado) area(sobreposto) width depth Heap Point p = null; Circle c = new Circle(0,12,4); Box b = new Box(0,4,8,8); p c b
Polimorfismo Construtor move(herdado) area(sobreposto) dist(herdado) radius Construtor move(herdado) dist(herdado) area(sobreposto) width depth Heap p = c; p.move(20,20); double a = p.area(); p c b a 50.3
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... a b c d e a b c d e X X X X X a b c d e X X a c e
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