compilador java 5.0 para gerar executável nativo para plataforma...

40
Compilador Java 5.0 para gerar executável nativo para plataforma Palm OS Júlio Vilmar Gesser Orientado por Joyce Martins

Upload: others

Post on 06-Aug-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Compilador Java 5.0 para gerar executável nativo para plataforma Palm OS

Júlio Vilmar Gesser

Orientado por Joyce Martins

Page 2: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 2

Roteiro da apresentação

� Introdução

� Objetivos

� Fundamentação teórica

� Desenvolvimento

� Conclusão

� Extensões

Page 3: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 3

Introdução

� Desenvolvimento de aplicativos para Palm

OS em C/C++

� Por que não utilizar J2ME?

� Solução proposta

Page 4: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 4

Objetivos

� Executar as análises léxica, sintática e

semântica de programas Java

� Gerar código intermediário C++ e simular o

coletor de lixo do Java

� Implementar em C++ algumas bibliotecas

da API do Java

Page 5: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 5

Fundamentação teórica

� Plataforma Java

� Compiladores

� Plataforma Palm OS

� Trabalhos correlatos

Page 6: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 6

Fundamentação teórica Plataforma Java

� Tecnologias Java se dividem em três

plataformas:

� Java Platform Micro Edition (Java ME)

� Voltado para dispositivos móveis

� Java Platform Standard Edition (Java SE)

� Voltado para aplicações desktop

� Java Platform Enterprise Edition (Java EE)

� Voltado para aplicações corporativas e de grande

porte

Page 7: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 7

Fundamentação teórica Plataforma Java

� Linguagem de programação orientada a

objetos

� Programas interpretados e independentes

de plataforma

� Possui coletor de lixo

� Possui API rica em utilitários e estruturas

de dados

Page 8: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 8

Fundamentação teórica Compiladores

� Transformar um programa escrito em uma

linguagem em um programa equivalente

em outra linguagem

� Informar erros encontrados no programa

fonte

Page 9: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 9

Fundamentação teórica Compiladores

� Divide-se em:

� Front-end

� Análise do programa fonte

� Detecção de erros de compilação

� Back-end

� Síntese da linguagem alvo

� Otimizações de código

Page 10: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 10

Fundamentação teórica Compiladores

Page 11: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 11

Fundamentação teórica Plataforma Palm OS

Page 12: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 12

Fundamentação teórica Plataforma Palm OS

� Projetada para gerenciar informação

� Facilidade de utilização e grande

compatibilidade

� SO com núcleo multitarefas preemptivo,

executa apenas uma aplicação por vez

� Aplicativos não podem ser multithread

Page 13: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 13

Fundamentação teórica Plataforma Palm OS

� Endereçamento de memória 16 bits

� Jumps relativos limitados em 32K

� Ambientes de programação

� Palm OS Developer Suite

� CodeWarrior for Palm OS

� Permite endereçamento 32 bits

Page 14: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 14

Fundamentação teórica Trabalhos correlatos

� Linguagem de programação orientada a

objetos para a plataforma Microsoft .NET

(Leyendecker)

� Processo de desenvolvimento em palm

usando C++ (Hildebrandt)

� Jump (Kleberhoff e Dickerson)

� Java2cpp (Programics.com)

Page 15: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 15

Desenvolvimento

� Levantamento dos requisitos

� Especificação

� Implementação

� Estudo de caso

Page 16: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 16

DesenvolvimentoLevantamento de requisitos

� Requisitos funcionais

� receber como entrada arquivos fonte Java 5.0 e

reportar erros léxicos, sintáticos e semânticos

� gerar código C++ como código intermediário do

processo de compilação

� gerar código para simular o mecanismo de coleta

de lixo do Java para liberar memória não

utilizada pelo programa

Page 17: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 17

DesenvolvimentoLevantamento de requisitos

� Requisitos não-funcionais

� suportar bibliotecas básicas do Java, incluindo

bibliotecas para criação de interfaces gráficas

(java.util, java.awt)

� possuir biblioteca Java para utilização de recursos

específicos do Palm OS

� ser implementado em Java utilizando o ambiente

de programação Eclipse

Page 18: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 18

DesenvolvimentoEspecificação

� Casos de uso

Desenvolvedor

Compilador Java

Compilador C++

Gerar código C++ como código intermediário do processo de compilação

Gerar código para simular o mecanismo de coleta de lixo do Java para l iberar memória não uti l izada pelo programa

Gerar programa executável para Palm OS

Possuir biblioteca Java para uti l ização de recursos específicos do Palm OS

Receber como entrada arquivos fonte Java 5.0 e reportar erros léxicos, sintáticos e semânticos

Ser implementado em Java uti lizando o ambiente de programação Eclipse

Suportar bibliotecas básicas do Java, incluindo bibliotecas para criação de interfaces gráficas (java.util , java.awt)

Requisito funcional

Requisito não funcional

Legenda

«trace»

«trace»

«trace»

«trace»

«trace»

«trace»

«trace»

Page 19: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 19

DesenvolvimentoEspecificação

� Analisadores léxico e sintático

� Gerados com o JavaCC a partir de gramática

obtida no repositório de gramáticas do JavaCC

� Gramática utilizada continha bugs

� Construção da árvore sintática do programa

(AST)

� Árvore sintática especificada manualmente,

composta por 85 classes

Page 20: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 20

DesenvolvimentoEspecificação

� Analisador semântico

� Efetua duas passadas na AST

� Resolução de nomes e tipos

� Verificações semânticas

� Anota a AST com informações contextuais

utilizadas na geração de código

� Utiliza o pattern Visitor para percorrer a AST

Page 21: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 21

DesenvolvimentoEspecificação

� Diagrama de classes – análise semântica

SemanticCheckerVisitor

Exception

SemanticException

TypesAndNamesResolv erVisitor

FileManager

Compiler{leaf}

«interface»

visitor::GenericVisitor

CompilingScope{leaf}

BlockScope{leaf}

Exception

CompilationException

-cs

-compiler-compiler

-compiler

+fi leManager

«trace»

«trace»

«trace»

Page 22: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 22

DesenvolvimentoEspecificação

� Diagrama de classes – resolução de nomesException

AmbiguousMethodException

ClassNameSpace CuNameSpace

«interface»

INameSpace+ resolve(String) : Binding

NamesContext

PackageNameSpace

compiler::CompilingScope

{leaf}

compiler::FileManager

-fi leManager

-parent

-ns

Page 23: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 23

DesenvolvimentoEspecificação

� Diagrama de seqüência – resolução de nomes:NamesContext «interface»

:INameSpace

:TypesAndNamesResolverVisitor

opt

[ret == null && parent != null]

binding= resolve(id) :Binding

ret= ns.resolve(id) :Binding

ret= parent.resolve(id) :Binding

return ret

Page 24: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 24

DesenvolvimentoEspecificação

� Geração de código

� Utiliza o pattern Visitor para percorrer a AST

� Para cada classe Java, inclusive classes internas, é

gerado uma classe C++ dividida em dois arquivos: .h

e .cpp

� Visibilidade dos métodos e atributos é respeitada

� Visibilidade protected para classes que estão no

mesmo pacote é simulada utilizando o recurso friend

class do C++

Page 25: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 25

DesenvolvimentoEspecificação

� Diagrama de classes – geração de código

BodySourceGenerator{leaf}

ClassFileManager{leaf}

CppSourceCodeGeneratorVisitor

CppSourceGenerator

HeaderSourceGenerator{leaf}

MainMethodSourceGenerator

«interface»

SrcGenConsts

SrcGenContext{leaf}

util::SourcePrinter{leaf}

-manager

«trace»«trace»

#printer

Page 26: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 26

DesenvolvimentoEspecificação

� Diagrama de classes – geração de código

Class

Constructor Field

Member

Method

Parameter

+fields

+parameters

+constructors +methods

Page 27: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 27

DesenvolvimentoEspecificação

:Compiler:Main :JavaParser :TypesAndNamesResolverVisitor :SemanticCheckerVisitor :CppSourceCodeGeneratorVisitor

loop

[int i = 0; i < files.length; i++]

Desenvolvedor

compilar arquivos

compile(fi les)

ast= parse(files[i])

resolve(ast)

check(ast)

generateCode(ast)

Page 28: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 28

DesenvolvimentoImplementação

� Implementação orientada ao estudo de

caso

� Análise semântica não foi totalmente

implementada

� Geração de código não foi totalmente

implementada

� Apenas bibliotecas Java necessárias para o

estudo de caso foram implementadas em C++

Page 29: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 29

DesenvolvimentoImplementação

� java.lang.Object� java.lang.Array� java.lang.String� java.lang.StringBuffer� java.lang.System� java.lang.Math� java.lang.Exception� java.util.Random� java.awt.Component� java.awt.Container� java.awt.Window� java.awt.Frame� java.awt.Dialog� java.awt.Panel� java.awt.Button� java.awt.Label� java.awt.List� java.awt.Choice� java.awt.MenuItem� java.awt.MenuBar� java.awt.Menu� java.awt.MenuShortcut

� java.awt.LayoutManager� java.awt.BorderLayout� java.awt.GridLayout� java.awt.FlowLayout� java.awt.Graphics� java.awt.Font� java.awt.Color� java.awt.Insets� java.awt.FontMetrics� java.awt.Dimension� java.awt.event.ComponentListener� java.awt.event.WindowListener� java.awt.event.MouseListener� java.awt.event.ActionListener� java.awt.event.ComponentAdapter� java.awt.event.WindowAdapter� java.awt.event.MouseAdapter� java.awt.event.MouseEvent� java.awt.event.KeyEvent� java.awt.event.WindowEvent� java.awt.event.ActionEvent� java.awt.event.ComponentEvent

Page 30: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 30

DesenvolvimentoImplementação

� Coletor de lixo

� Smart pointer

� Reference counting

� Ciclos

...class java_awt_Color : public java_lang_Object {

...};typedef gc::ptr<java_awt_Color> java_awt_ColorPtr;...

Page 31: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 31

DesenvolvimentoImplementação

//HelloWorld.java

public class HelloWorld {public static void main(String[] args ) {

HelloWorld helloWorld = new HelloWorld( "Hello World!" );System. out.println(helloWorld.getStr());

}

private final String str ;

public HelloWorld(String str ) {this. str = str ;

}

public String getStr() {return str ;

}}

Page 32: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 32

DesenvolvimentoImplementação

//HelloWorld.java

public class HelloWorld {public static void main(String[] args ) {

HelloWorld helloWorld = new HelloWorld( "HelloWorld!" );

System. out.println(helloWorld.getStr());}

private final String str ;

public HelloWorld(String str ) {this. str = str ;

}

public String getStr() {return str ;

}}

//HelloWorld.h

#ifndef HELLOWORLD_H_#define HELLOWORLD_H_#include "java.lang.Array.h"#include "java.lang.String.h"#include "java.lang.System.h"#include "japa.lang.GC.h"class HelloWorld {

public: HelloWorld(java_lang_StringPtr str);static void main(java_lang_ArrayPtr<

java_lang_StringPtr > args);virtual java_lang_StringPtr getStr();

private: const java_lang_StringPtr str;

};

typedef gc::ptr<HelloWorld> HelloWorldPtr;

#endif //HELLOWORLD_H_

Page 33: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 33

DesenvolvimentoImplementação

//HelloWorld.java

public class HelloWorld {public static void main(String[] args ) {

HelloWorld helloWorld = new HelloWorld( "HelloWorld!" );

System. out.println(helloWorld.getStr());}

private final String str ;

public HelloWorld(String str ) {this. str = str ;

}

public String getStr() {return str ;

}}

//HelloWorld.cpp

#include "HelloWorld.h“

HelloWorld::HelloWorld(java_lang_StringPtr str):str(str) {

}

void HelloWorld::main(java_lang_ArrayPtr< java_lang_StringPtr > args) {

HelloWorldPtr helloWorld = HelloWorldPtr( new

HelloWorld(java_lang_StringPtr( "Hello World!" )));java_lang_System::out->println(helloWorld-

>getStr());}

java_lang_StringPtr HelloWorld::getStr() {return str;

}

Page 34: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 34

DesenvolvimentoEstudo de caso

� Jogo ColorJunction

Page 35: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 35

Resultados e discussão

� Desenvolver aplicativos em Java é mais

produtivo do que desenvolver em C++ nativo

para Palm OS

� O coletor de lixo do Java facilita o

desenvolvimento de programas e evita erros

� As bibliotecas Java implementadas em C++

conseguiram reproduzir o comportamento dos

originais em Java

Page 36: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 36

Conclusão

� Principais objetivos foram alcançados

� Técnicas utilizadas para simular o coletor de lixo se

mostraram eficientes

� Gerador de código C++ obteve êxito em gerar

código funcionalmente equivalente ao código Java

� Bibliotecas Java implementadas em C++ permitiram

a execução de interfaces gráficas do AWT sem

perder características em relação ao Java

Page 37: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 37

Conclusão

� Compilar programas Java para executar

nativamente em Palm OS é totalmente viável,

facilitando o desenvolvimento de aplicativos para

Palm OS

Page 38: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 38

Extensões

� Concluir o analisador semântico e o gerador de

código, dando suporte a todas as construções do

Java 5.0

� Transcrever os comentários das classes Java para

as classes C++ geradas, permitindo uma melhor

leitura dos fontes gerados

� Implementar em C++ o restante das classes da

biblioteca AWT, possibilitando a compilação de

programas mais complexos

Page 39: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 39

Extensões

� Codificar outras classes da API do Java em C++,

tais como: Collections, Sockets, Remote Method

Invocation (RMI), JDBC, Swing, entre outras

� Melhorar o GC desenvolvido para que detecte e

colete ciclos

� Escrever as classes da API do Java para outras

plataformas, permitindo que o compilador

desenvolvido gere executável nativo para outras

plataformas

Page 40: Compilador Java 5.0 para gerar executável nativo para plataforma …campeche.inf.furb.br/tccs/2007-I/2007-1juliovilmargesse... · 2007-11-29 · Desenvolvimento de aplicativos para

Julho/2007 40

Demonstração da implementação