PrologTopRegistos de ActivaçãoLinguagens Orientadas a Objectos

Linguagens Orientadas a Objectos

Linguagens Orientadas a Objectos

Objectivos:

Implementação de Classes

Inicialização e Uso de Classes

Object_Tiger: Um Exemplo

let start := 10
  class Vehicle extends Object {
    var position := start
    method move(int x) =
      (position := position+x)
  }
  class Car extends Vehicle {
    var passengers := 0
    method await(v:Vehicle) =
      if (v.position < position) then
        v.move(position-v.position)
      else self.move(10)
  }
  class Truck extends Vehicle {
    method move(int x) = 
      if x <= 55 then position := position+x
  }

  var t := new Truck
  var c := new Car
  var v : Vehicle := c
in
  c.passengers := 2;
  c.move(60); v.move(70); c.await(t)
end

Herança Simples

Se v fôr um Vehicle tb pode ser Car ou Truck. Onde está o campo position?

Herança Simples: Redefinições

Para executar c.f(), onde f é um método dinâmico, devemos:

  1. encontrar o descriptor da classe d no offset 0 do objecto c;
  2. encontrar o ponteiro para o método p no offset f de d;
  3. chamar endereço p, guardando o endereço de retorno.

Herança Múltipla: Solução Estática

Algumas linguagens permitem a uma classe extender várias outras classes (eg A, B, C).

Tentar analizar todas as classes ao mesmo tempo, e encontrar um offset que possa ser usado por um campo f para qq classe.

Herança Múltipla: Solução Dinâmica

Hashing permite trabalhar com classes novas:

Pertença a Classe

Verificar dinâmicamente se um objecto pertence a uma classe:

Ideias:

Coerção de Tipos

Se c é do tipo C, C amplia B, e b do tipo B, então b <- c é correcto, mas c <- b não!

Campos e Métodos Privados

Ideia: Proteger campos de manipulação directa por métodos de outros objectos:

Linguagens sem Classes

Linguagens como self não têm noção de classe:

Optimização de Linguagens OO

Problema principal é procura de métodos dinâmica
  1. Máquinas modernas mais eficientes quando saltam para endereços fixos (prefetching);
  2. Dificil de gerar código optimizado.

Ideia: determinar onde chamada de método corresponde à mesma instância do método e substituir por chamada estática.

Ponteiros para Trabalho em OO

Algumas referências:


vitor@cos.ufrj.br

PrologTopRegistos de ActivaçãoLinguagens Orientadas a Objectos