Top Banner
Compilador Java 5.0 para gerar executável nativo para plataforma Palm OS Júlio Vilmar Gesser Orientado por Joyce Martins
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

Aug 06, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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