GCJ – Conhecendo o compilador Java Livre – Parte I

 

Com a repercussão gerada quando a Sun resolveu disponibilizar o código fonte do Java, resolvi testar o Java Livre. O projeto GCJ da GNU é um compilador Java totalmente livre, onde o desenvolvedor pode gerar bytecode ou código binário nativo. Não sou especialista em Java, mas fiquei surpreso ao executar os testes mencionados neste documento.

 

Introdução e instalação:

 

http://cabelo.linuxdicas.com.br/imagens/gcj.png

 

O projeto GCJ é um compilador Java 100% livre no qual podemos gerar bytecodes ou binários nativos. Baseado em algumas pesquisas, cheguei a conclusão que existe suporte ao kit Java J2SE 1.4.2, mas não na API Swing. Mas acredito que esta não disponibilidade é apenas uma questão de tempo.

 

A Red Hat há algum lançou uma versão do Eclipse que não depende da JVM, compilada com o GCJ, gera programas para execução nativa, como o compilador GCC. O Eclipse é um ambiente de desenvolvimento utilizado por programadores Java, C e C++.

Em aproximadamente em fevereiro de 2006, foi disponibilizada à comunidade a versão 4.1.0 do GCC com diversas mudanças.

 

O GCC possui front-ends para as linguagens C, C++, Objective C, Fortran, Java e Ada e suas respectivas bibliotecas. Sendo assim posso dizer que estamos mais próximo de um compilador livre para Java com capacidade de traduzir bytecodes ou código-fonte em Java para código executável nativo. Imagine a portabilidade do Java junto a performance do compilado C.

 

Instalação dos pacotes necessários:

Em minha distribuição Suse bastou utilizar os pacotes gcc-java, libgcj e libgcj-devel como no exemplo abaixo:

 

fig01gcj.JPG

 

fig02gcj.JPG 

 

Para efeito de informação a libgcj fornece para a aplicação os componentes em tempo de execução que seriam fornecidos pela JVM.

 

Compilando e testando um programa exemplo.

 

Compilando um programa “OLA MUNDO”

Para compilar um programa em java, utilizamos o comando gcj. Abaixo alguns parâmetros utilizados na sintaxe de compilação:

-o : Nome do arquivo binário a ser gerado;-c : Cria apenas o arquivo objeto;

-O : Compila com otimizações;

-g : Gera informações para o debug;

--main=Nome-Classe : Nome da classe utilizada para iniciar o programa.

 

Para iniciar crie um programa “OLA MUNDO” em java para efetuarmos os primeiros testes de compilação. Abaixo o conteúdo do programa BemVindo.java. Para quem preferir o download pode ser efetuado aqui (http://cabelo.linuxdicas.com.br/download/BemVindo.java)

 

// Olá mundo em java.

// Arquivo BemVindo.java.

public class BemVindo {

   public static void main(String[] args) {

      System.out.println("Olá Mundo!");

   }

}

 

Agora compilaremos o nosso primeiro programa informando o nome do arquivo binário (BemVindo), a classe main e no nome do arquivo fonte.

 

Pronto! Após a compilação, basta executar o programa BemVindo como no exemplo abaixo.

 

cabelo@linux:/neti/install/java/artigo> gcj -o BemVindo --main=BemVindo BemVindo.java

cabelo@linux:/neti/install/java/artigo> ./BemVindo

Olá Mundo!

cabelo@linux:/neti/install/java/artigo>


 

Gerando um bytecode com o programa “OLA MUNDO”.

 

Para não gerar um código nativo e sim um bytecode, Basta utilizar o parâmetro -C. O comando gij utiliza a biblioteca libgcj para proporcionar ao sistema uma máquina virtual. Vale a pena ressaltar que a variável ambiental CLASSPATH do java é utilizada gij e gcj.

 

No exemplo abaixo geramos um bytecode e o executamos com o JVM da Sun e com o GIJ! Veja como é simples:

 

cabelo@linux:/neti/install/java/artigo> gcj -C BemVindo.java

cabelo@linux:/neti/install/java/artigo> ls BemVindo.class

BemVindo.class

cabelo@linux:/neti/install/java/artigo> gij BemVindo

Olá Mundo!cabelo@linux:/neti/install/java/artigo>

 

Agora teste o bytecode gerado como JVM do java:

 

cabelo@linux:/neti/install/java/artigo> java BemVindo

Olá Mundo!

cabelo@linux:/neti/install/java/artigo>

 

Outro ponto importantíssimo e que o gcj quanto o gij conseguem utilizar pacotes JAR na compilação e na execução de programa. O GCJ possui um utilitário similar ao jar, o fastjar, escrito inteiramente em C.

 

Para compilar aplicações com várias classes, basta utilizar o parametro -c, logo após cria o binário. Veja no exemplo abaixo:

 

cabelo@linux:/neti/install/java/artigo> gcj -c Classe1.java

cabelo@linux:/neti/install/java/artigo> gcj -c Main.java

cabelo@linux:/neti/install/java/artigo> ls

Classe1.java Classe1.o Main.java Main.o

cabelo@linux:/neti/install/java/artigo> gcj -o programa1 main=Main Classe1.o Main.o

cabelo@linux:/neti/install/java/artigo> ls

programa1 Classe1.java Classe1.o Main.java Main.o

cabelo@linux:/neti/install/java/artigo> ./programa