- Download do ColorJunction (executável .prc) - 50 Kb
- Download código-fonte do ColorJunction em Java - 23 Kb
- Download código-fonte do ColorJunction em C++ gerado pelo compilador - 22 Kb

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.

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.





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 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
16 Comentários »
Comentários via RSS TrackBack URI
-
Arthur em 03/05/2007 22:30
Se os caras da IBM nem sonharam com uma parada desta, vc ta de parabéns!!!!!!!!
-
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…
-
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.
-
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.
-
dprogrammer em 06/06/2007 18:59
E para PocketPC ?
É possível fazer esse mesmo procedimento ?
E parabéns pela iniciativa.
-
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. -
Frederico Lellis em 21/06/2007 10:48
Nossa muito legal seu projeto, espero as novidades.
Parabéns. -
Luiz em 26/06/2007 08:04
Ola Julio,
Parabens, se possivel envie email quando tiver novidades
Grato
-
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/ ) ?
-
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. -
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…
-
Edson em 25/08/2008 10:57
E aí, Júlio.
Tava lendo o seu artigo e achei mto interessante, estou começanado a programar para Pocket PC. Só que não consigo executar o meu .jar no Pocket, vc sabe como posso fazer isso, sendo que ja tenho a JVM instalada no pocket ?
Obrigado! -
Júlio Gesser em 25/08/2008 16:12
Olá Edson,
ainda não tive a oportunidade de mecher com dispositivos Pocket PC. Então não tenho como responder a sua pergunta com certeza. Possuir a JVM instalada é o requisito mínimo (vc já tem), mas tem que tomar cuidado com os pré-requisitos do j2me que o aplicativo que vc pretende executar exigem (CLDC 1.1/1.2 MDPI…) e quais os requisitos que a JVM instalada atendem…
um abraço!
-
Fabrício em 18/09/2008 13:33
Olá Júlio,
estou iniciando o desenvolvimento de aplicações Palm com o SuperWaba e fiquei muito interessado no seu artigo. Esse lance de aplicações ” Java -> C++ -> PalmOs ” parece ser o “pulo do gato” para desenvolvedores Java escreverem aplicações para PalmOS, Windows CE e até mesmo o Android da Google. Para continuar ou não meus estudos gostaria de saber quando será disponibilizado essas ferramentas e como vão ser as licenças? Já que ainda estou no início. Sabemos que da existência de vários bancos de dados( oracle, SQL Server, DB2…) para essas plataformas, mas todas escritas para o C/C++. Como ficaria essa compatibilidade também?
Agradeço desde já a atenção.
Fabrício. -
Júlio Gesser em 18/09/2008 20:48
Olá Fabrício,
a alguns meses dividi este projeto em dois:
- o primeiro deles contempla o parser Java, a base do compilador. Este projeto está publicado no Google Code sob a licença LGPL em . Este projeto estou mantendo atualizado e estou trabalhando nele sempre que sobra algum tempo.
- o segundo é o gerador de código C++ e as bibliotecas Java implementadas para Palm OS. Este projeto não tive mais muito tempo para atualizar ou dar continuidade e ainda não o publiquei. Este projeto contempla apenas algumas classes Java e apenas para Palm OS. O ideal seria eu dividir este projeto em outros dois: um para o gerador de código C++ e outro para as bibliotecas Java implementadas para Palm OS. E então assim seria possível criar um terceiro projeto que implemente as bibliotecas Java para Windows CE e ou Windows Mobile.
Gostaria de ter mais tempo livre ou algum patrocínio para poder tocar adiante este segundo projeto, mas realmente não estou com muito tempo para isto.
abraço
Júlio Gesser
-
Júlio Gesser em 18/09/2008 20:51
O link para o projeto no Google code não ficou disponível, então segue o link em cima do meu nome neste comentário.
http: // code.google.com/p/javaparser/


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.