Transformação em C a partir de código em Java Modelo de dados de suporte a uma linguagem object oriented Centro de Cálculo Instituto Superior de Engenharia de Lisboa João Pedro Patriarca ([email protected]) Hierarquia de classe Java Point # x, y: int + Point() + Point( x,y:int ) + add(p: Point) + print() + equal(p1:Point, p2:Point): boolean <<final>> Color Pixel - c: Color + Pixel( x,y : int, r,g,b : byte ) + print() CCISEL - r,g,b : byte + BLACK : Color + Color( r,g,b : byte ) + print() Programação em Sistemas Computacionais Suporte à criação, iniciação e destruição de objectos • Atributos de instância reunidos numa estrutura • Atributos de tipo (static) definidos como variáveis globais • Construção de um objecto – Alocação de espaço para o objecto independente da inicialização • Como é resolvida a sobrecarga? – Mangling de nomes – O mesmo problema/resolução se coloca na definição de atributos de tipo • Definição de um destrutor – Necessário sempre que existam acções a realizar na fase de destruição do objecto (ex: libertar espaço alocado dinamicamente na construção) CCISEL Programação em Sistemas Computacionais Métodos • Métodos de instância necessitam da adição do parâmetro implícito correspondente à referência para o objecto (this) void point_add( Point * this, const Point * p ); • Métodos estáticos não acedem a estado do objecto logo não precisam da referência para o objecto CCISEL Programação em Sistemas Computacionais Herança • A estrutura que representa o tipo especializado inclui a estrutura do tipo derivado – A definição da estrutura do tipo derivado como primeiro campo facilita a conversão para tipos base e do tipo base para o tipo especializado • Aplica-se o mesmo suporte à criação, iniciação e destruição • A chamada do construtor do tipo base deverá anteceder a iniciação do estado do tipo especializado • A adição de novos métodos de instância não constitui problema. Mas como é resolvida a sobreposição? – Numa linguagem object oriented o método de instância a executar depende do tipo do objecto e não do tipo da variável que guarda a referência para o objecto (polimorfismo) CCISEL Programação em Sistemas Computacionais Polimorfismo • Em tempo de compilação não é possível determinar a função a chamar; a decisão da função a executar terá de ser adiada para tempo de execução – a mesma variável poderá guardar, em momentos diferentes, referências para objectos de tipos diferentes (relação is-a) • O objecto terá que ter associado ao seu estado qual o tipo que representa (e portanto quais as funções/métodos de instância que deverá executar) • Introdução da tabela de métodos virtuais (vtable) – Implementada à custa de um estrutura ou um array de ponteiros para função – Definida ao nível do tipo / cada objecto mantém uma referência para a mesma tabela – Tal como na herança de estado, novas Vtables deverão incluir a Vtable do tipo base • Métodos a incluir na Vtable – Métodos sujeitos a sobreposição (métodos virtuais) – Destrutores cujas acções a realizar dependam do tipo criado e no momento da destruição não se conheça o tipo do objecto • Métodos em Java numa classe base marcados como final não estão sujeitos a sobreposição CCISEL Programação em Sistemas Computacionais