Gerando programas nativos Palm OS com Java SE 5.0

Gostou deste artigo? Compartilhe!

CategoriasPalm OS
ComentáriosComentários (11)

Geração de código nativo Palm OS a partir de código J2SE

Introdução

Existem diversas linguagens de programação compatíveis com Palm OS, como C, C++, Pascal, VB, Java, entre outras. Dentre estas linguagens, a linguagem de programação Java pode ser destacada, pois ela é considerada uma linguagem muito poderosa, orientada a objetos, simples, robusta e eficiente, e tem sido cada vez mais utilizada no desenvolvimento de aplicativos comerciais.

Os programas Java são interpretados por uma máquina virtual, a Java Virtual Machine (JVM). A JVM disponível para Palm OS é compatível apenas com o Java 2 Micro Edition (J2ME), uma versão reduzida do Java 2 Standard Edition (J2SE). Atualmente, a maioria dos PDAs possuem muitos recursos, tanto de processamento quanto de memória, e dessa forma, poderiam executar programas escritos para J2SE tranquilamente, se existisse uma virtual machine J2SE compatível com Palm OS.

Assim, no intuito de sanar a falta de uma JVM J2SE para Palm OS, iniciei o desenvolvimento de um compilador J2SE 5.0 que gera executável nativo, ou seja, não é interpretado e não necessita de run-time a partir de código escrito em J2SE. O fato de gerar executável nativo pode ser considerado ao mesmo tempo uma vantagem e uma desvantagem. A vantagem é que os programas podem ser distribuídos sem a necessidade de uma máquina virtual, e são executados com melhor performance. A desvantagem é que os programas deixam de ser portáveis e ficam um pouco maiores. No entanto, a portabilidade pode ser conseguida, e explico detalhes adiante.

Estudo de Caso

Para testar o compilador durante o seu desenvolvimento, implementei um pequeno jogo em Java, conhecido como ColorJunction. O objetivo do jogo é limpar a tela, apagando os blocos que estão unidos a outros de mesma cor.

ColorJunction

Inicialmente, o objetivo do compilador era compilar totalmente este jogo para Palm OS, deixando-o totalmente funcional e com as mesmas características do jogo executado no Windows. O jogo utiliza vários componentes do Java, tais como:

  • Buttons
  • Labels
  • Dialogs
  • Layouts
  • Menus
  • Graphics
  • MouseEvent

O Compilador

O compilador tem como objetivo transformar um programa Java em um programa nativo para Palm OS. Para isto ele tem como entrada, arquivos com código-fonte Java (.java). O processo de compilação pode ser resumido três etapas:

  • a) Compilação: Ler os arquivos fonte Java e verificar se há erros de compilação;
  • b) Geração de código intermediário: Gerar código C++ a partir dos fontes Java;
  • c) Geração de código objeto: Compilar os fontes C++ gerados.

Compilação

Nesta etapa são executados os passos primordiais de um compilador:

  • análise léxica;
  • análise sintática;
  • análise semântica.

Estes passos são responsáveis por ler o programa Java, verificar se há erros de compilação, e realizar alguns pré-processamentos para geração de código na etapa seguinte. Para análise léxica e sintática foi utilizado o gerador de parsers JavaCC, muito conhecido entre os desenvolvedores Java. Os nós da árvore sintática (AST) foram escritos manualmente, e a análise semântica ocorre em cima desta árvore utilizando o pattern visitor e adicionando informações à AST.

Geração de código intermediário

O código intermediário é o que mais se aproxima do programa executável, porém, ele passa por mais etapas até virar o executável final. A geração de código utiliza o pattern visitor, e é feita em cima da AST proveniente da etapa de compilação, e gera código C++ como código intermediário. A justificativa para esta opção é que ambas as linguagens, Java e C++, são orientadas a objetos e as construções de ambas são muito parecidas. Isto facilita a transição de Java para C++ e acelera o desenvolvimento do compilador que estou implementando, pois não há necessidade em se preocupar com endereçamento de memória e instruções de baixo nível.

Entretanto, o Java possui uma biblioteca repleta de componentes e estruturas de dados para acelerar o desenvolvimento de aplicativos (API). Este compilador não impede a utilização destes recursos do Java. Porém, cada Classe da API utilizada no programa a ser compilado terá que ser implementada em C++, pois o código intermediário fará referências a estas classes. Atualmente implementei apenas as Classes da API necessárias para compilar o jogo ColorJunction e dessa forma demonstrar uma "prova de conceito".

Nesta fase, é possível tornar o compilador portável para outras plataformas, para tanto, seria necessário implementar as bibliotecas Java para os dispositivos que queira portar. Por exemplo, para fazer com que este compilador gere executáveis nativos para Windows Mobile, seria necessário apenas implementar em C++ as bibliotecas utilizando os recursos desta plataforma, e utilizar o compilador eMbedded Visual C++, por exemplo. Isto porque a API nativa do Palm OS, utilizada para desenhar um botão por exemplo, não é a mesma do Windows Mobile.

Neste momento, os desenvolvedores experientes devem estar se perguntando: "E o coletor de lixo (GC) do Java?" O Garbage Collector Java não foi esquecido. Para fazer com que os programas Java executem nativamente no Palm OS foi necessário uma implementação para simular em C++ o mesmo comportamento do GC do Java. Esta foi feita utilizando um recurso muito conhecido pelos desenvolvedores C++, denominado "Smart Pointer", que destrói os objetos assim que eles deixam de ser utilizados, ou seja, não há propriamente uma thread monitorando a memória em busca de lixo como no Java, mas consegue-se a mesma funcionalidade.

Geração de código objeto

Esta etapa gera o executável nativo para Palm OS. Para tanto, é necessário compilar os códigos fontes C++ gerados na etapa anterior e as classes da API Java utilizadas. Isto pode ser feito com os compiladores C++ disponíveis para Palm OS, o mais conhecidos são:

O compilador C++ tranforma os fontes C++ em um programa Palm OS nativo (.prc). Este programa pode ser executado em qualquer PDA compatível com Palm OS, sem a necessidade de uma máquina virtual ou runtime.

Resultado

Implementar o jogo ColorJunction em Java necessitou de pouco trabalho e poucas linhas de código fonte, devido as facilidades da linguagem Java, enquanto implementá-lo nativamente em C++ para Palm OS seria muito mais trabalhoso.

As imagens a seguir mostram o resultado obtido da compilação do jogo. A comparação é feita com o jogo executando em um computador com o sistema operacional Windows XP em um Palm T|X com o sistema operacional Palm OS Garnet 5.4.9. O visual ficou muito parecido, e a maior diferença é o tamanho da fonte, que no Palm OS é maior.

As imagens mostram que é totalmente possível executar um programa Java nativamente em Palm OS. O desafio é implementar as bibliotecas Java em C++ para que possam ser utilizadas nos programas. Pretendo implementar as bibliotecas gradativamente, ou seja, conforme minhas necessidades.

ColorJunction no Windows XP e no Palm OS

ColorJunction

ColorJunction

ColorJunction

ColorJunction

Onde posso baixar este compilador?

Por enquanto ele não está disponível, mas em breve disponibilizarei o projeto para que pessoas interessadas possam contribuir na implementação de novas bibliotecas, e também para que possam utilizar em projetos próprios.

Onde posso baixar o jogo ColorJunction?

O jogo compilado (.prc) e o código-fonte em Java estão disponíveis para download no início do artigo.

Importante: A versão para Palm OS foi testada apenas no PDA Palm T|X.

Sobre o Autor

Julio GesserJulio Gesser irá concluir o curso de Ciências da Computação em 2007 pela Fundação Universidade Regional de Blumenau. Atualmente trabalha com Java, compiladores e banco de dados Oracle no desenvolvimento de uma plataforma para implementação de aplicativos J2EE.

Possui experiência em Java, C++, Delphi, Oracle, Palm OS, e é detentor das seguintes certificações:

  • SCJP - Sun Certified Programmer for Java 2 Plataform, Standard Edition 5.0;

Veja o todos os artigos publicados por Julio Gesser no PDAExpert.

Artigos Relacionados

11 Comentários »

Comentários via RSS TrackBack URI

  1. Arthur em 03/05/2007 22:30

    Se os caras da IBM nem sonharam com uma parada desta, vc ta de parabéns!!!!!!!!

  2. Saulo Nardin Rocha em 13/05/2007 11:48

    Cara, você pretende liberar este refactor sobre qual licença??
    Se for GPL, gostaria de contribuir para com o projeto!
    São iniciativas assim que estão nos faltando ultimamente.

    Parabéns Cara…

  3. Júlio Gesser em 13/05/2007 12:34

    Saulo, legal seu interesse. Não sei qual licença ainda. Como este projeto é um trabalho de conclusão de curso universitário, sou obrigado a liberar os fontes do projeto. Mas como atualmente estou trabalhando na monografia, não tive tempo ainda de pensar nisso. É muito provável que o projeto fique hospedado no Java.net ou no Sourceforge. Assim poderei recrutar desenvolvedores interessados em ajudar.

  4. Saulo Nardin Rocha em 16/05/2007 08:41

    Júlio, Caso seja de seu interesse então, me coloco à disposição quando for liberar o aplicativo.

  5. dprogrammer em 06/06/2007 18:59

    E para PocketPC ?

    É possível fazer esse mesmo procedimento ?

    E parabéns pela iniciativa.

  6. Júlio Gesser em 06/06/2007 20:52

    Olá dprogrammer,

    é possível sim, e o mais bacana é que não é muito complicado. Teria apenas que implementar em C++ para PocketPC as classes das bibliotecas Java, por exemplo Frame, Button, Graphics, etc. As classes utilizadas no jogo ColorJunction foram implementadas para Palm OS por mim, e não foi muito difícil, precisa apenas conhecer bem a API da plataforma.
    Tenho planos futuros de dar suporte a outras plataformas, e PocketPC é uma delas.

  7. Frederico Lellis em 21/06/2007 10:48

    Nossa muito legal seu projeto, espero as novidades.
    Parabéns.

  8. Luiz em 26/06/2007 08:04

    Ola Julio,

    Parabens, se possivel envie email quando tiver novidades

    Grato

  9. Ranieri em 04/07/2007 23:12

    Parabéns pelo projeto. Quanto a implementação das classes Java em C++, por que não seria possível aproveitar os esforços do GNU Compiler for Java ( http://gcc.gnu.org/java/ ) ?

  10. Andre Carvalho em 25/09/2007 11:14

    É exatamente isto que eu estou procurando, uma maneira de escrever um só codigo e rodar tanto em Palm OS como em Windows Mobile, e pelo que vi todo o programa é escrito em Java com uma tradução para C++, e neste momento direcionado para Palm ou Windows Mobile.
    Quero que vc me corrija caso eu esteja errado na minha analise.

  11. Júlio Gesser em 25/09/2007 11:49

    olá André,

    exatamente isto. Seria possível gerar código nativo tanto para Windows Mobile quanto para Palm OS. Porém implementei suporte apenas para Palm OS, e apenas algumas bibliotecas do Java são suportadas. O projeto está parado atualmente, não tenho tido muito tempo para dar continuidade. Mas em breve trarei novidades…

Envie seu comentário

ATENÇÃO: A área de comentários deve ser utilizada apenas para dúvidas sobre este artigo. Para dúvidas não relacionadas a este artigo, utilize o Fórum PDAExpert.net.

Nome

E-mail

URL

Comentário

XHTML: São permitidas as seguintes tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

campos obrigatórios