GCJ es el compilador GNU de Java, y una de las pocas opciones que tienes si deseas programar en Java, totalmente “libre”. Este lo recomienda Richard Stallman, para no caer en “La trampa de Java”.
Introducción
GCJ trabaja de tres maneras: Primero que todo GCJ puede tomar los archivos fuente *.java como entrada y compilarlos a archivos ejecutables de alguna arquitectura específica. Además, usando la opción -C, GCJ puede tomar los archivos fuente *.java como entrada, y generar archivos *.class. Y por último, GCJ puede tomar los archivos *.class como entrada para crear archivos ejecutables de alguna arquitectura específica.
GCJ ofrece dos soportes de librerias para el runtime, libgcj y libgcjgc. libgcj es simplemente una implementación del núcleo de librerías de Java. libgcjgc es el recolector de basura, que es el responsable de administrar la memoria consumida por un programa. Este recolector está basado sobre el colector Boehm-Weiser, pero escanea específicamente objetos de Java residentes en memoria, además de incluir algunos otros cambios.
Compilando programas en Java
Si estás trabajando con Java, se recomienda usar directamente el GCJ en lugar de usar el GCC.
Extensiones de Archivos
El GCJ maneja las siguientes extensiones de archivos utilizados comunmente por Java, y tu puedes especificar cualquiera de estos tipos de archivos como entrada para el GCJ:
.java
Un código fuente en Java, que consiste en una o más definiciones de clases.
.class
Un archivo binario que contiene las intrucciones bytecodes e información pertinente para una clase. Este puede ser cargado y ejecutado por una máquina virtual de Java (JVM, por sus siglas en inglés). Compilando un archivo fuente de Java (.java) se obtienen uno o más archivos de clase (.class), uno por cada definición de clase dentro del código fuente. Los archivos .class fueron designados como una presentación portable y segura de las clases de Java, pero también existen herramientas para compilar códigos fuentes de otros lenguajes (como Ada, Scheme, o XML) en archivos .class.
.zip
El formato ZIP es un tipo de archivo, muy famoso en el mundo de la computación, en el que se comprimen ficheros dentro de uno solo, con la extensión .zip. En el mundo de Java estos son utilizados principalmente para portar una colección de archivos de clases (.class) en un solo archivo. Cuando especificamos en la linea de comandos del GCJ que la salida va a ser un archivo .zip, el resultado es un archivo ensamblado, archivo objeto, o ejecutable, dependiendo de las opciones que especifiques.
.jar
Un archivo .jar (Java ARchive) no es más que un archivo .zip con la extensión renombrada, pero con algunas convenciones extras (que son obligatorias poner, como por ejemplo un archivo de manifiesto). GCJ actua sobre estos de igual manera que con un archivo ZIP.
Opciones en la linea de comandos del GCJ
Además de las opciones normales del GCC, GCJ reconoce las siguientes opciones:
-C
El/los archivo/s de entrada deben ser archivos fuente .java. Estos son compilados en archivos portables de clase (.class). Y no se genera ningún tipo de código máquina (o archivo ejecutable).
–output-class-dir=OUTPUTDIR
Cuando es usado con -C, especifica en que directorio se deben crear los archivos de clase.
-d OUTPUTDIR
Es un sinónimo o alias para el –output-class-directory, y se utiliza para que exista compatibilidad con el javac de Sun.
–bounds-check
Cuando compila a código máquina, emite instrucciones para verificar que los indices de arrays esten dentro de los límites, y lanza una excepción en caso contrario. Este comando está por defecto.
–no-bounds-check
Cuando compila a código máquina, NO emite instrucciones para verificar que los indices de arrays esten dentro de los límites.
-M
-MM
-MD
-MMD
Estas opciones trabajan como con el compilador de C. Para propósitos del GCJ, un sistema de cabezera es cualquier archivo .zip instalado como parte del sistema de compilación.
–main=CLASSNAME
Cuando se enlaza una aplicación, genera un stub que la aplicación ejecuta al iniciar el programa con el método main de la clase. (Esta opción es ignorada si solamente estás compilando mas no enlazando).
Configurando los Paths
En tiempo de compilación, GCJ utiliza una lista de rutas para buscar clases y paquetes que necesite. Esta lista es llamada el classpath. Cada elemento del classpath puede ser un directorio o el nombre de un archivo .zip o .jar. En el segundo caso, GCJ busca el contenido del archivo para la información requerida. GCJ tiene incluido un classpath (built-in classpath), que incluye el directorio, y el archivo de sistema libgcj.zip, que contiene las clases del estándar de libreriás de Java, tal como java.lang. Estas son varias formas para configurar o aumentar el classpath:
-I directory
Un directorio (o archivo) especificado usando -I es añadido al final del classpath.
–classpath=path
-classpath path
Si especificas la opción –classpath (o la -classpath; son lo mismo) sobrescribres el built-in classpath, y eliminas el reconocimiento de la opción –CLASSPATH y de la variable de entorno CLASSPATH.
–CLASSPATH=path
-CLASSPATH path
Si especificas la opción –CLASSPATH (o la -CLASSPATH; son lo mismo) esta ruta es añadida en el built-in classpath, pero eliminas el reconocimiento la variable de entorno CLASSPATH.
CLASSPATH
La variable de entorno CLASSPATH puede ser configurada a una ruta. Esta ruta es añadida a la ruta del compilador. Estas son listas de nombres de directorios o archivos separadas por comas (en Windows separadas con punto y coma).
Basado en la version original de la página del GCJ: http://gcc.gnu.org/java/compile.html