segunda-feira, 8 de setembro de 2008

Usando gij e gcj no lugar do javac

Mostrarei como desenvolver programas java usando as ferramentas do projeto gcc (http://gcc.gnu.org/).

Começamos baixando os pacotes de desenvolvimento e de execução, são o gcj e o gij.

Para o ubuntu use o apt-get para isso:

# apt-get install gcj gij

O gcj é o compilador, e o gij é o interpretador bytecode java.

Veja o exemplo:


Hora.java


class Hora {

    private int hor, min, seg;
    public int getHoras () {return hor;}
    public int getMinutos (){return min;}
    public int getSegundos (){return seg;}
    public void setHoras (int h) {
          if (h >= 0 && h < 24)
                    hor = h;
    }
    public void setMinutos (int m) {
          if (m >= 0 && m < 60)
                    min = m;
    }
    public void setSegundos (int s) {
          if (s >= 0 && s < 60)
                    seg = s;
    }
    public void setHorario (int h, int m, int s) {
          setHoras (h); setMinutos (m); setSegundos (s);
    }
    public String toString () {
          return getHoras() + ":" + getMinutos() + ":" + getSegundos();
    }
}


UsaHora.java



import java.util.Calendar;
public class UsaHora {
   public static void main (String args[]) {
         //declara e instancia um objeto tipo Hora
         Hora hora = new Hora();
         //atribui valores ao objeto com valores válidos
         hora.setHorario (15, 30, 10);
         //exibe hora
         System.out.println ("Hora: " + hora.toString());
         //Pega data atual
         Calendar dataAtual = Calendar.getInstance();
         //declara, instancia e atribui valores a outro objeto do tipo Hora
         Hora outraHora = new Hora();
         int h = dataAtual.get (Calendar.HOUR_OF_DAY);
         int m = dataAtual.get (Calendar.MINUTE);
         int s = dataAtual.get (Calendar.SECOND);
         outraHora.setHorario (h, m, s);
         //exibe hora atual
         System.out.println ("Hora atual: " + outraHora.toString());
   }
}








Copie e cole os programas java acima.

Usando o método tradicional, com o java, você faria assim:

# javac Hora.java
# javac UsaHora.java
# java UsaHora
Hora: 15:30:10
Hora atual: 20:41:45
#

Usando o gij e o gcj, faremos assim:

gcj Hora.java -C
# gcj UsaHora.java -C
# gij UsaHora
Hora: 15:30:10
Hora atual: 20:41:45

Para que server o "-C" ?
Isso é para dizer para o compilador para gerar o código em bytecode java. Isso significa que, com o gcj, você pode gerar o código para a máquina nativa.
Ou seja, com o gcj você pode gerar um executável diretamente para a máquina que executará o programa, para fazer isso use o seguinte comando:

# gcj --main=UsaHora Hora.java UsaHora.java -o UsaHora
# ./UsaHora
Hora: 15:30:10
Hora atual: 20:47:5

Aqui dizemos ao compilador para usar a estrutura da classe UsaHora como main, e para incorporar os arquivos Hora.java e UsaHora.java para compilar de uma vez, gerando um código objeto UsaHora

Aqui, no caso, geramos um código ELF, que é um executável linux. Mas se o gcj for instalado no Windows, basta fazer o mesmo comando, porém colocando um ".exe". assim:

c:\ gcj --main=UsaHora Hora.java UsaHora.java -o UsaHora.exe
c:\UsaHora
Hora: 15:30:10
Hora atual: 20:47:5

Em geral os códigos para máquina virtual são muito rápidos, dando pouca diferênça de performance. Você pode fazer esse teste gerando loops grandes tanto em C como em Java para constatar isso.
Postar um comentário