Translate

Pesquisar este blog

quarta-feira, 17 de dezembro de 2014

Compilando Delphi para Java e Android: FPCJVM

Introdução

Na década de 90, tornou-se popular a linguagem Object Pascal, devido à explosão da ferramenta Delphi no mercado.
Toneladas de linhas de código foram feitos desde então nessa ferramenta.
Quando surgiram os dispositivos móveis, eles eram baseados na linguagem Java ao invés, fazendo com que muitos programas em Delphi ficassem obsoletos por não migrarem para a nova plataforma.

Foi criado um compilador de Object Pascal Open Source, chamado FPC, que possui portas para diversas arquiteturas-alvo, inclusive Java.  (FPCJVM)
O FPCJVM é um compilador Pascal que gera código para a máquina virtual Java (JVM). Ao invés de um executável puro ele gera vários arquivos .class para ser executados pela JRE, ou pelo Android.


Criando seu primeiro programa Swing em "Object Pascal".

program testeSw;
{$mode objfpc}
{$namespace teste}
uses jdk15;


 
var
    Fr: jsJFrame;
   
begin
    Fr:=JsJFrame.Create('Teste');
    Fr.setContentPane(jsJLabel.create('Olá Mundo'));
   
    fr.pack;
    fr.setVisible(True);
end.

A linha
{$mode objfpc}
indica para usar o modo de Object Pascal do FPC. Sim, o compilador pode suportar vários dialetos da linguagem Pascal. O objfpc é o default se você usa Lazarus.

A linha
{$namespace teste}
indica em que pacote Java a Unit salvará as classes geradas.

Os pacotes do Java possuem uma nomeclatura diferente no Pascal. Elas possuem um prefixo que é a primeira letra do pacote da classe. Assim o javax.swing.JFrame se transforma em jsJFrame.

Compilar o programa é assim:
ppcjvm.exe -O2 -g testeSw.pas

Executar vai necessitar algumas bibliotecas de Run-Time do FPCJVM.
 java -cp .;..\units\jvm-java\rtl teste.testeSw


Limitações:

O compilador possui várias limitações devido às diferenças entre as linguagens de programação (ex: Java não suporta ponteiros). Eu me lembro de algumas:
  • Não suporta nenhuma unit do Pascal, exceto por jdk15 ou android14.
  • Permite declarar ponteiros, e deferenciá-los diretamente, mas não permite que se faça aritmética com eles.
  • Não é permitido procedures/funções com parâmetros out ou var.
  • Várias funcionalidades do Java, como anotações, interceptadores não são suportados.

Mais info: http://wiki.freepascal.org/FPC_JVM/Language

Nenhum comentário:

Postar um comentário