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:
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