Compilação de Linguagens OO Marco Simões (macs3) André Santos (alms) Compiladores
Compilação de Linguagens OO Tópicos da Aula Alocação de Objetos e Classes Herança e Polimorfismo Verificação de Tipos Garbage Collection Compiladores
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 Instâncias Heap
Variáveis e Invocação de Métodos Heap p 2 3 Construtor move area dist q Point p = new Point(2,3); Point q = new Point(0,0);
Variáveis e Invocação de Métodos Heap p 3 4 Construtor move area dist q Point p = new Point(2,3); Point q = new Point(0,0); p.move(1,1);
Atribuições p 3 4 Construtor move area q dist Heap p 3 4 q 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 { 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 Heap p 12 4 c b Construtor move(herdado) dist(herdado) area(sobreposto) width depth 4 8 Point p = null; Circle c = new Circle(0,12,4); Box b = new Box(0,4,8,8);
Polimorfismo Construtor move(herdado) area(sobreposto) dist(herdado) radius Heap p c 20 32 b a 50.3 Construtor move(herdado) dist(herdado) area(sobreposto) width depth 4 8 p = c; p.move(20,20); double a = p.area();
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 X ... a c e ... a b c d e ... a b c d e X
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