<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>just 4 cool ! &#187; software libre</title>
	<atom:link href="http://just4cool.wordpress.com/tag/software-libre/feed/" rel="self" type="application/rss+xml" />
	<link>http://just4cool.wordpress.com</link>
	<description>Cine, música, software ...</description>
	<lastBuildDate>Thu, 03 Dec 2009 00:44:01 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='just4cool.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/3d4d0e462933cebfe55b6105ea6c28c3?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>just 4 cool ! &#187; software libre</title>
		<link>http://just4cool.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://just4cool.wordpress.com/osd.xml" title="just 4 cool !" />
		<item>
		<title>Eclipse va muy lento</title>
		<link>http://just4cool.wordpress.com/2009/02/21/eclipse-va-muy-lento/</link>
		<comments>http://just4cool.wordpress.com/2009/02/21/eclipse-va-muy-lento/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 12:27:56 +0000</pubDate>
		<dc:creator>elmoesdios</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://just4cool.wordpress.com/?p=246</guid>
		<description><![CDATA[
Una de los mejores entornos de programación para Java, por no decir el mejor, es Eclipse. Está disponible para todas las plataformas habidas y por haber aunque se da el caso de que al bajarlo para Ubuntu por medio del sistema de paquetes su ejecución suele ser demasiado lenta. Esto ocurre a causa de que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=just4cool.wordpress.com&blog=4759922&post=246&subd=just4cool&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;"><img class="aligncenter size-full wp-image-248" title="eclipse_icon" src="http://just4cool.files.wordpress.com/2009/02/eclipse_icon.png?w=107&#038;h=112" alt="eclipse_icon" width="107" height="112" /></p>
<p style="text-align:justify;">Una de los mejores entornos de programación para Java, por no decir el mejor, es <strong><a href="http://www.eclipse.org">Eclipse</a></strong>. Está disponible para todas las plataformas habidas y por haber aunque se da el caso de que al bajarlo para <strong>Ubuntu</strong> por medio del sistema de paquetes su ejecución suele ser <strong>demasiado lenta</strong>. Esto ocurre a causa de que Eclipse está desarrollado en Java y por defecto se va a utilizar para su ejecución la implementación libre de la máquina virtual de Java conocida como <strong>GIJ</strong> (GNU Interpreter for Java).</p>
<p style="text-align:justify;">He tenido la oportunidad de estudiar a fondo esta herramienta y comprobé que es muchísimo <strong>más lenta</strong> que su equivalente privativo por lo que si priorizamos la velocidad de ejecución recomiendo utilizar en nuestro sistema la versión de <strong>Sun</strong>. Eso hará que Eclipse se ejecute con mayor <strong>agilidad</strong>.</p>
<p><span id="more-246"></span></p>
<p style="text-align:justify;">Lo primero que tenemos que hacer es instalar el <strong>Java Development Kit</strong> de Sun por medio del sistema de paquetes que incorpora Ubuntu. Escribiremos para ello:</p>
<pre> $ sudo apt-get install sun-java6-jdk</pre>
<p style="text-align:justify;">Una vez hecho esto vamos a <strong>seleccionar</strong> la ejecución de la máquina virtual de Sun cuando ejecutemos por consola &#8220;java&#8221; lo que haremos por medio del comando:</p>
<pre> $ sudo update-alternatives --config java
Hay 4 alternativas que proveen `java'.

  Selección     Alternativa
-----------------------------------------------
          1    /usr/bin/gij-4.2
          2    /usr/bin/gij-4.3
*+        3    /usr/lib/jvm/java-gcj/jre/bin/java
          4    /usr/lib/jvm/java-6-sun/jre/bin/java

Pulse  para mantener el valor por omisión [*] o pulse un número de selección:</pre>
<p style="text-align:justify;">Tendremos que pulsar, en este caso, 4. A continuación haremos que Eclipse seleccione para <strong>su ejecución</strong> la máquina virtual de Java de Sun. Para ello tenemos que editar el fichero <code>/etc/eclipse/java_home</code> y poner en primera línea la <strong>ruta</strong> a la JVM que vamos a utilizar, es decir, <code>/usr/lib/jvm/java-6-sun</code>. Ahora podremos ejecutar:</p>
<pre> $ eclipse
searching for compatible vm...
  testing /usr/lib/jvm/java-6-sun...found</pre>
<p style="text-align:justify;">Ya hemos conseguido que Eclipse vaya más <strong>rápido</strong>. Por último, si nos interesa <strong>compilar</strong> utilizando el Kit de Sun podemos entrar en Window&gt;Preferences dentro de Eclipse y movernos hasta Java&gt;Instaled JREs.  Una vez ahí pulsaremos Search para añadir el JDK de Sun buscando desde el directorio <code>/usr/lib</code>. Una vez añadidos todos, seleccionaremos el que más nos convenga.</p>
<p style="text-align:justify;">Para comunicar cualquier error o matiz en este tip, deja un comentario.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/just4cool.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/just4cool.wordpress.com/246/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/just4cool.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/just4cool.wordpress.com/246/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/just4cool.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/just4cool.wordpress.com/246/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/just4cool.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/just4cool.wordpress.com/246/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/just4cool.wordpress.com/246/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/just4cool.wordpress.com/246/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=just4cool.wordpress.com&blog=4759922&post=246&subd=just4cool&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://just4cool.wordpress.com/2009/02/21/eclipse-va-muy-lento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b5d4d3bbfd469f36bcae8f8c7210d755?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">elmo</media:title>
		</media:content>

		<media:content url="http://just4cool.files.wordpress.com/2009/02/eclipse_icon.png" medium="image">
			<media:title type="html">eclipse_icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Conociendo el FSTAB y sus opciones</title>
		<link>http://just4cool.wordpress.com/2009/02/19/conociendo-el-fstab-y-sus-opciones/</link>
		<comments>http://just4cool.wordpress.com/2009/02/19/conociendo-el-fstab-y-sus-opciones/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 15:06:21 +0000</pubDate>
		<dc:creator>elmoesdios</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://just4cool.wordpress.com/?p=240</guid>
		<description><![CDATA[
Una de las dudas más comunes que abordan a los usuarios nuevos en el mundo de GNU/Linux trata sobre el montaje automático de las particiones y de sus permisos. Las órdenes de montaje y sus opciones se encuentran alojadas en el fichero /etc/fstab.
Normalmente, al instalar distribuciones como Ubuntu, en el fstab se generan las líneas [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=just4cool.wordpress.com&blog=4759922&post=240&subd=just4cool&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;"><img class="aligncenter" src="http://just4cool.files.wordpress.com/2008/12/drive-harddisk.png?w=127&amp;h=127&#038;h=127" alt="" width="127" height="127" /></p>
<p style="text-align:justify;">Una de las dudas más comunes que abordan a los usuarios nuevos en el mundo de GNU/Linux trata sobre el montaje automático de las <strong>particiones</strong> y de sus <strong>permisos</strong>. Las órdenes de montaje y sus opciones se encuentran alojadas en el fichero <code>/etc/fstab</code>.</p>
<p style="text-align:justify;">Normalmente, al instalar distribuciones como <strong>Ubuntu</strong>, en el <code>fstab</code> se generan las líneas de montaje de nuestras particiones automáticamente pero de un modo <strong>genérico</strong>. Muchos habrán visto que si lo dejamos tal cual, los nombres de los archivos de la partición al hacer un <code>ls</code> aparece en color <strong>verde</strong>. Esto ocurre cuando los ficheros tienen permisos de ejecución. Sin más vamos a entrar en materia.</p>
<p style="text-align:justify;"><span id="more-240"></span></p>
<p style="text-align:justify;">En primer lugar tenemos que <strong>identificar</strong> el dispositivo en el que se aloja la partición. Cuando el disco es SATA, el primer dispositivo se nombra como <code>sda</code>, el segundo será <code>sdb</code>, y así sucesivamente. Las particiones correspondientes al primer disco se nombrarán como <code>sda1</code>, <code>sda2</code>, etc. En caso de tener un disco <strong>IDE</strong> la nomenclatura será <code>hda</code>, <code>hdb</code>, y sus particiones <code>hda1</code>, <code>hda2</code> &#8230; etc. Los descriptores de todos los dispositivos y sus correspondientes particiones están en el directorio <code>/dev</code>. Para identificar cuáles son las particiones que queremos montar podemos utilizar la herramienta <code>fdisk</code>, a la que pasaremos como argumento el disco que queremos examinar. Si queremos ver las <strong>particiones</strong> del disco <code>sda</code> haremos:</p>
<pre style="text-align:justify;">fdisk /dev/sda</pre>
<p style="text-align:justify;">Con <code>fdisk</code> podemos manejar las particiones de modo<strong> flexible y seguro</strong>. Mediante la introducción de <code>p</code> veremos un <strong>listado</strong> de las particiones que tenemos. En mi caso he obtenido:</p>
<pre style="text-align:justify;">Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sda1   *           1        1848    14844028+  83  Linux
/dev/sda2            1849        1941      747022+  82  Linux swap / Solaris
/dev/sda3            1942        5766    30724312+   7  HPFS/NTFS
/dev/sda4   *        5767        7296    12289725    7  HPFS/NTFS</pre>
<p style="text-align:justify;">Una vez identificada la partición que queremos montar podemos empezar a <strong>definir</strong> el <code>fstab</code>. La estructura de este archivo usa una <strong>sintaxis</strong> especial. Cada línea está formada por seis campos, separados por espacios en blanco (espacio, tabuladores o una combinación). Cada campo tiene su propio <strong>significado</strong>:</p>
<ul style="text-align:justify;">
<li>El <strong>primer</strong> campo muestra la partición descrita (la ruta al fichero de dispositivo)</li>
<li>El <strong>segundo</strong> campo muestra el punto de montaje donde la partición debe montarse</li>
<li>El <strong>tercer</strong> campo muestra el sistema de ficheros usado por la partición</li>
<li>El <strong>cuarto</strong> campo muestra las opciones de montaje usadas por mount cuando trata de montar la partición. Como cada sistema de ficheros tiene sus propias opciones de montaje, le animamos a leer la página man de mount (man mount) para un listado completo. Cuando existen múltiples opciones se separan por comas.</li>
<li>El <strong>quinto</strong> campo es usado por dump para determinar si la partición necesita ser volcada o no. En general puede dejar esto como 0 (cero).</li>
<li>El <strong>sexto</strong> campo es usado por fsck para determinar el orden en que los sistemas de ficheros deben ser comprobados si el sistema no se apagó correctamente. La partición raíz debe tener un 1 mientras que el resto puede tener 2 (o 0 en el caso en que la comprobación del sistema de ficheros no sea necesaria).</li>
</ul>
<p style="text-align:justify;">Si queremos montar mi partición de <strong>datos</strong>, cuya ruta al descriptor es <code>/dev/sda3</code>, el primer campo será esta misma <strong>ruta</strong>. El segundo será el <strong>directorio</strong> en el que queremos montar la partición, el cual debe existir. En mi caso lo haré en <code>/media/DATOS</code>. Como ya hemos visto mediante <code>fdisk</code>, el <strong>sistema de ficheros</strong> de esta partición es <code>ntfs</code> por lo tanto esta va a ser la opción a especificar en el tercer campo. En el cuarto campo irán las opciones de montaje. El quinto y sexto campo lo dejaremos a 0. En este caso voy a explicar los que yo he utilizado y que considero más <strong>importantes</strong>; por supuesto, hay muchas otras opciones para las que os remito a las <code>manpages</code>. Veamos cuales son estas <strong>opciones</strong>:</p>
<ul style="text-align:justify;">
<li><code>auto</code>: Si especificamos esta opción, la partición se montará <strong>automáticamente</strong> al iniciar el sistema. La opción contraria es <code>noauto</code>. Lo más interesante es, sin duda, el montaje automático.</li>
<li><code>exec</code>: Esta opción la pondremos si tenemos interés en que podamos <strong>ejecutar</strong> binarios sobre la partición. Si por ejemplo vamos a programar y ejecutar sobre la partición será necesario especificarla. La opción contraria es <code>noexec</code>.</li>
<li><code>rw</code>: Al montar la partición, si especificamos esta opción estaremos <strong>permitiendo</strong> la lectura y escritura. Los permisos también deberán estar en concordancia con esta opción. Si queremos que la partición sea de sólo lectura la opción adecuada es <code>ro</code> (Read Only).</li>
<li><code>uid</code>: Digamos que está opción indicará a qué usuario/os <strong>pertenecen</strong> los <strong>ficheros</strong> de la partición que vamos a montar. Estos usuarios deberán ser indicados a través de su identificación. Podemos revisar qué número corresponde a cada usuario examinando el fichero <code>/etc/passwd</code>. En mi caso, el valor del <code>uid</code> para mi usuario es 1000.</li>
<li><code>gid</code>: Similar a la opción anterior pero referente al <strong>grupo</strong> de usuarios. Podemos ver el <code>gid</code> del grupo al que pertenecemos en el fichero <code>/etc/groups</code>. En mi caso es el mismo que el de usuario, 1000.</li>
<li><code>fmask</code>: Se trata del <strong>umask</strong> para los ficheros de la partición a montar. Así podremos especificar los <strong>permisos</strong> que tendrán estos ficheros. Dado que la partición de datos pertenece a mi usuario, voy a darle los mismos permisos que tendrán los ficheros de mi <code>home</code> por defecto que son lectura y escritura para el propietario (especificado en <code>uid</code>), lectura para usuarios del mismo grupo (especificado en <code>gid</code>) al que pertenece el fichero y  lectura para el resto de usuarios. Estos permisos son rw-r&#8211;r&#8211;, en binario serán 644 y dado que lo que utilizamos con <code>fmask</code> es un <strong>umask</strong> 777-644=133. <strong>El valor será 133</strong>.</li>
<li><code>dmask</code>: Es igual que la opción anterior pero en este caso se refiere a los <strong>directorios</strong>. Para que podamos abrir un directorio es necesario que éste tenga permisos de <strong>ejecución</strong> por lo que los permisos serán los mismos que para ficheros pero añadiendo permisos de ejecución para propietario, grupo propietario y el resto de usuarios. Por tanto los permisos serán rwxr-xr-x que en binario es 755. En <strong>umask</strong> sería 777-755=022.<strong> El valor será 022</strong>.</li>
<li><code>utf8</code>: Lo pondremos si la codificación de los nombres es <code>utf8</code>, si estamos utilizando otra codificación utilizaremos la opción que le corresponda.</li>
</ul>
<p style="text-align:justify;">Después de ver cada una de las opciones la línea será la siguiente:</p>
<pre style="text-align:justify;">/dev/sda3       /media/DATOS    ntfs    auto,exec,rw,uid=1000,gid=1000,dmask=022,fmask=133,utf8 0       0</pre>
<p style="text-align:justify;">Ahora tendremos que comprobar que <strong>funciona</strong>. Para ello utilizaremos la orden <code>mount</code> a la que tendremos que pasar el argumento <code>-a</code> para ejecutar el montaje de lo que se encuentra en el <code>fstab</code>. Eso sí, antes tenemos que desmontar la partición si ya la tenemos activa. Para ello escribiremos:</p>
<pre style="text-align:justify;"> $ sudo umount -a</pre>
<p style="text-align:justify;">Se intentarán desmontar <strong>todas</strong> las particiones del <code>fstab</code> lo que, obviamente, no es posible. En caso de que no podamos desmontar nuestra partición de datos es porque algún proceso la está <strong>utilizando</strong> y se nos mostrará un error que indicará que el dispositivo que queremos desmontar está siendo <strong>usado</strong>. Podemos comprobar qué proceso es el que lo está haciendo con la instrucción <code>fuse</code> y el descriptor de la partición del siguiente modo:</p>
<pre style="text-align:justify;"> $ sudo fuse -m /dev/sda3</pre>
<p style="text-align:justify;">Esta instrucción nos sacará por pantalla el <strong>PID</strong> de los procesos que están ocupando la partición. Suponiendo que el proceso con PID 7418 está utilizando la partición podemos proceder a <strong>matarlo</strong>, desmontar y volver a montar con:</p>
<pre style="text-align:justify;"> $ sudo kill -9 7418
 $ sudo umount -a
 $ sudo mount -a</pre>
<p style="text-align:justify;">Ahora podemos irnos a la partición <strong>montada</strong> y comprobar si los permisos están correctos por medio de un <code>ls</code>. Seguido el proceso tendremos los archivos montados en nuestra partición con los mismos permisos que los del HOME de manera que se integrarán perfectamente.</p>
<p style="text-align:justify;">Si detectas algún <strong>error</strong> en este tutorial, hay algo mal explicado o te ha sido <strong>útil</strong> deja tu <strong>comentario</strong> !</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/just4cool.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/just4cool.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/just4cool.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/just4cool.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/just4cool.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/just4cool.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/just4cool.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/just4cool.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/just4cool.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/just4cool.wordpress.com/240/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=just4cool.wordpress.com&blog=4759922&post=240&subd=just4cool&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://just4cool.wordpress.com/2009/02/19/conociendo-el-fstab-y-sus-opciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b5d4d3bbfd469f36bcae8f8c7210d755?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">elmo</media:title>
		</media:content>

		<media:content url="http://just4cool.files.wordpress.com/2008/12/drive-harddisk.png?w=127&#38;h=127" medium="image" />
	</item>
		<item>
		<title>Makefiles &amp; GNU GCJ</title>
		<link>http://just4cool.wordpress.com/2008/12/06/makefiles-gnu-gcj/</link>
		<comments>http://just4cool.wordpress.com/2008/12/06/makefiles-gnu-gcj/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 16:25:58 +0000</pubDate>
		<dc:creator>elmoesdios</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://just4cool.wordpress.com/?p=123</guid>
		<description><![CDATA[
Como ya conté en anteriores posts, en mi proyecto de fin de carrera tenía que compilar una librería de clases Java bastante extensa con GNU GCJ. Es bastante sencillo compilar una clase simple, incluso compilar varias de ellas a mano, pero en el caso de una colección importante, el compilar y enlazar es una tarea [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=just4cool.wordpress.com&blog=4759922&post=123&subd=just4cool&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;"><img class="aligncenter" src="http://just4cool.files.wordpress.com/2008/11/java.png?w=138&amp;h=138&#038;h=138" alt="" width="138" height="138" /></p>
<p style="text-align:justify;">Como ya conté en <strong>anteriores posts</strong>, en mi proyecto de fin de carrera tenía que compilar una librería de clases Java bastante extensa con <strong>GNU GCJ</strong>. Es bastante sencillo compilar una clase simple, incluso compilar varias de ellas a mano, pero en el caso de una colección importante, el compilar y enlazar es una tarea muy larga y aburrida.</p>
<p style="text-align:justify;">En su momento estuve buscando cómo podía <strong>automatizar</strong> esta tarea de compilación por medio de herramientas diseñadas para esta labor. Lo primero que se me ocurrió fue crear un paquete de instalación por medio de las <strong>GNU Autotools</strong> pero al mirar en la documentación pude comprobar que no había soporte para GCJ por lo que elegí una de las herramientas que se incorporan en este paquete: <strong>GNU Make</strong>.</p>
<p style="text-align:justify;"><span id="more-123"></span></p>
<p style="text-align:justify;">Además de la utilización de las Autotools y Make también pensé en utilizar <strong>Apache Ant</strong> que tiene bastantes características positivas como por ejemplo que no depende de las órdenes del Shell en el que se ejecute el Antfile por lo que la portabilidad está garantizada. A pesar de ésto, y de que Make sí depende del Shell, me decanté por esta última opción al estar más <strong>extendido</strong> y generalizado en el mundo de GNU/Linux su uso.</p>
<p style="text-align:justify;">La primera gran pregunta que me aborda es ¿cómo puedo escribir el Makefile para compilar toda la librería sin alterar la estructura de paquetes que <strong>originalmente</strong> tiene en el modelo tradicional de Java?. Podríamos escribir línea por línea la compilación de cada una de las clases con su ruta y al final enlazarlo todo en una línea enorme. Así se puede hacer pero lo mejor sería encontrar la manera de <strong>automatizar</strong> la lectura de todas las clases para no tener que escribir la ruta a cada una de ellas.</p>
<p style="text-align:justify;">Lo que vamos a hacer es mantener dentro de Makefile varias cadenas que contengan la ruta a todos los ficheros de <strong>código</strong> fuente que queremos compilar y la ruta a todos los <strong>objetos</strong> que se originarán después de la compilación de las fuentes, que además serán enlazados. Para este fin utilizaremos la opción <strong>wildcard</strong> mediante la cual se puede utilizar un comodín tal como lo haríamos con un <code>ls</code> en Bash de manera que se nos devolverá el nombre de todos los ficheros que concuerden con la expresión regular. En primer lugar se obtienen los ficheros de código fuente y luego a partir de ellos cambiaremos <code>.java</code> por <code>.o</code> para tener los objetos.</p>
<p style="text-align:justify;">Después de esto escribiremos las acciones del Makefile del modo lo más genérico posible. Definiremos una acción a partir del nombre de los objetos para compilarlos uno a uno mediante una <strong>expresión regular</strong>. Una vez tengamos todos los objetos simplemente habrá que realizar el enlace señalando cuál es las clase principal del programa. A continuación os dejo un pequeño <strong>ejemplo</strong> <strong>orientativo</strong> donde, en el directorio en el que se encuentra el Makefile ,se han incluido las fuentes en un subdirectorio llamado <code>src</code> y los objetos serán compilados a otro subdirectorio llamado <code>bin</code>:</p>
<pre class="brush: cpp;">

##############################################
#  Makefile para compilación con GCJ
#  Creador por ELMOesDIOS para
#  http://just4cool.wordpress.com
##############################################

## Destino de los objetos y del ejecutable
DEST_DIR = bin

## Nombre del Ejecutable y la librería dinámica
BINARY_NAME := MiPrograma

## Cargamos las fuentes de todas las clases a compilar
JAVA_SOURCES := $(wildcard src/paqueteA/*.java)
JAVA_SOURCES += $(wildcard src/paqueteA/paqueteAA/*.java)
JAVA_SOURCES += $(wildcard src/paqueteA/paqueteAB/*.java)
JAVA_SOURCES += $(wildcard src/paqueteA/paqueteAB/paqueteABC/*.java)

## A partir de la cadena de fuentes obtenemos la de objetos
JAVA_OBJECTS := $(JAVA_SOURCES:src/%.java=$(DEST_DIR)/%.o)

## Macros para la compilación
GCJ := $(GCC_PATH)/usr/bin/$(GCC_TARGET)gcj
GCJ_FLAGS := -O2 -g --classpath=src

## Instrucción general para obtener el ejecutable
all: $(DEST_DIR)/$(BINARY_NAME)

## Compilar las fuentes de nuestro programa
$(JAVA_OBJECTS): $(DEST_DIR)/%.o: src/%.java
	$(GCJ) $(GCJ_FLAGS) -c $&lt; -o $@

## El ejecutable final se obtiene en el enlace
$(DEST_DIR)/$(BINARY_NAME): $(JAVA_OBJECTS)
	$(GCJ) --main=paqueteA.paqueteAB.clasePrincipal $^ -o $(DEST_DIR)/$(BINARY_NAME)

## Habrá que crear los directorios donde se almacenarán los objetos una vez compilados
prepare:
        mkdir bin/paqueteA; mkdir bin/paqueteA/paqueteAA; mkdir bin/paqueteA/paqueteAB; mkdir bin/paqueteA/paqueteAB/paqueteAC;
</pre>
<p style="text-align:justify;">En el ejemplo, antes escribir <code>make</code>, habría que generar la <strong>estructura</strong> de directorios para los objetos tal y como se describe en el ejemplo. Además podemos agregar nuevas opciones de instalación y limpieza para que la instalación de nuestro programa Java compilado con GCJ sea estándar del modo:</p>
<pre> $ make prepare
 $ make
 $ sudo make install</pre>
<p style="text-align:justify;">Para orientaros en lo que respecta a los símbolos utilizados para construir las expresiones regulares, podéis echar un vistazo al <strong>manual</strong> de GNU Make. Esto es para un caso pequeño en el que no se utilizan librerías externas. En caso de que se utilicen bastaría con añadir una nueva macro para almacenar sus fuentes; recordemos que en la Introducción a GNU GCJ ya se explicó que las colecciones de clases <code>.class</code> en <code>.jar</code> se pueden compilar. Luego se obtendría una macro para los objetos y se compilarían igual que en el ejemplo. Además habría que <strong>modificar</strong> el enlace.</p>
<p style="text-align:justify;">Me gustaría indicar también que de esta manera obtendremos únicamente un ejecutable que contiene todo el programa. Es más adecuado compilar utilizando <strong>librerías dinámicas</strong>. El proceso se puede deducir a partir de este mismo ejemplo, aunque si tenéis algún tipo de problema o alguna duda, dejad un <strong>comentario</strong>. Espero que si os ha sido útil también lo hagáis. Proximamente dejaré más posts acerca de GNU GCJ, su rendimiento y otras características.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/just4cool.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/just4cool.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/just4cool.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/just4cool.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/just4cool.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/just4cool.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/just4cool.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/just4cool.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/just4cool.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/just4cool.wordpress.com/123/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=just4cool.wordpress.com&blog=4759922&post=123&subd=just4cool&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://just4cool.wordpress.com/2008/12/06/makefiles-gnu-gcj/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b5d4d3bbfd469f36bcae8f8c7210d755?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">elmo</media:title>
		</media:content>

		<media:content url="http://just4cool.files.wordpress.com/2008/11/java.png?w=138&#38;h=138&#38;h=138" medium="image" />
	</item>
		<item>
		<title>El Classpath de GCJ</title>
		<link>http://just4cool.wordpress.com/2008/12/03/el-classpath-de-gcj/</link>
		<comments>http://just4cool.wordpress.com/2008/12/03/el-classpath-de-gcj/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 23:01:07 +0000</pubDate>
		<dc:creator>elmoesdios</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://just4cool.wordpress.com/?p=83</guid>
		<description><![CDATA[
En esta entrada voy a ir completando lo comentado en la introducción a GCJ. Ya expliqué entonces como podemos compilar una clase sencilla, sin dependencias de otras, de manera que obtendremos un ejecutable de la misma manera que si utilizásemos otros lenguajes como C/C++.
La dependencia entre clases en Java se satisface a través del classpath, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=just4cool.wordpress.com&blog=4759922&post=83&subd=just4cool&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;"><img class="aligncenter" src="http://just4cool.files.wordpress.com/2008/11/java.png?w=138&amp;h=138&#038;h=138" alt="" width="138" height="138" /></p>
<p style="text-align:justify;">En esta entrada voy a ir completando lo comentado en la <strong><a href="http://just4cool.wordpress.com/2008/11/30/introduccion-a-gnu-gcj/">introducción a GCJ</a></strong>. Ya expliqué entonces como podemos compilar una clase sencilla, sin dependencias de otras, de manera que obtendremos un ejecutable de la misma manera que si utilizásemos otros lenguajes como C/C++.</p>
<p style="text-align:justify;">La dependencia entre clases en Java se satisface a través del <strong><a href="http://en.wikipedia.org/wiki/Classpath_(Java)">classpath</a></strong>, una variable de entorno (aunque hay otras formas de especificarlo) en la que se enumeran los directorios en los que se encuentran clases o paquetes utilizados. La comprobación se realiza, en el caso de Java, además de al compilar a <a href="http://en.wikipedia.org/wiki/Bytecode">bytecodes</a>, en tiempo de ejecución de manera que si nos falta una clase, se nos lanzará una excepción del tipo <code>classnotfound</code>; con GCJ esto no es así.</p>
<p><span id="more-83"></span></p>
<p style="text-align:justify;">En el caso de GCJ, la comprobación de las dependencias se hace únicamente durante la <strong>compilación</strong> de las clases mediante una implementación propia del classpath muy similar a la original del Java. Podemos indicarlo de varias maneras:</p>
<ul style="text-align:justify;">
<li>-I<em>dir</em> : Es la opción es la recomendada por los desarrolladores de GCJ, ya que es la que va a permitir diferenciar el classpath para las aplicaciones construidas a partir de este compilador de las que se construyan a partir de otros que también lo implementan.</li>
<li>&#8211;classpath=<em>path</em>: Mediante esta opción se establece el path del modo tradicional, separando los directorios por medio del símbolo &#8216;:&#8217;. Esta opción no sobrescribe el path por defecto para encontrar la librería de clases estándar que implementa GCJ.</li>
<li>&#8211;bootclasspath=<em>path</em>: Sustituye al path generado por defecto en el que se encuentran las clases estándar que componen el API de Java para GCJ.</li>
<li>CLASSPATH: Se trata de una variable de entorno a definir antes de la llamada al compilador y que mantiene una lista de directorios de la manera estándar.</li>
</ul>
<p style="text-align:justify;">Existe una <strong>prioridad</strong> entre cada una de estas posibles implementaciones.  De esta manera, es posible tener una implementación de una determinada clase agregada a la variable de entorno classpath, sin embargo, podremos compilar una aplicación que la utilice especificando una nueva implementación mediante el argumento <code>-I</code>. El orden de prioridades es el siguiente:</p>
<ol style="text-align:justify;">
<li>En primer lugar irán los directorios especificados por medio del argumento <code>-I</code>.</li>
<li>Se añaden los directorios especificados con la opción <code>--classpath</code> en caso de que haya sido definida.</li>
<li>A continuación irán los directorios especificados en la variable de entorno CLASSPATH.</li>
<li>Se añaden los directorios que están en la ubicación desde la que se llama a GCJ, es decir, el directorio &#8216;.&#8217;</li>
<li>Si se ha especificado un valor para la opción <code>--bootclasspath</code> se anexa su valor, en caso contrario se agrega la ubicación por defecto de <code>libgcj.jar</code>.</li>
<li>Si se especificó durante la compilación e instalación de GCJ, la opción <code>--extdirs</code>, se agregan al classpath los directorios que allí aparezcan.</li>
</ol>
<p style="text-align:justify;">Las clases que vayan definidas en los directorios incluidos en el classpath podrán ser <strong>código fuente o clases</strong> <strong>compiladas a bytecodes</strong> de Java. Vamos a ver un ejemplo sencillo de dos clases dependientes. En primer lugar, tenemos una clase <code>Suma.java</code> con un método que se encarga de sumar dos enteros pasados como parámetros:</p>
<pre class="brush: java;">
// Suma.jav -&gt; contiene un método para sumar dos enteros y devuelve el resultado
package ejemplo.blog;

public class Suma {
    public static int sumar (int a, int b) {
        int c = a+b;
        return c;
    }
}
</pre>
<p style="text-align:justify;">A continuación tenemos otra clase que recibe dos cadenas como argumentos para hacerles un cast a enteros y sumarlos llamando al método de la clase Suma anterior.</p>
<pre class="brush: java;">
// MiClase.java -&gt; Suma dos números pasados como argumento
import ejemplo.blog.*;

class MiClase {
    public static void main(String args[]) {
        // Los dos números pasados como argumento los convertimos a enteros
        int a = Integer.parseInt(args[0]);
        int b = Integer.parseInt(args[1]);

        // Sumamos los dos números con la llamada al método Sumar.suma()
        int x = Suma.sumar(a, b);

        // Mostramos el resultado por pantalla
        System.out.println(x);
    }
}
</pre>
<p style="text-align:justify;">La primera clase está ubicada en <code>/home/elmo/miclase</code> y la segunda se encuentra en <code>/home/elmo/ejemplo/blog</code>. Para el caso de la compilación tradicional en Java hemos de indicar la ubicación de las clases dependientes a través de la variable de entorno $CLASSPATH de modo que haremos:</p>
<pre>
$ cd /home/elmo/ejemplo/blog
$ javac Suma.java
$ cd /home/elmo/miclase
$ export CLASSPATH="/home/elmo/"
$ javac MiClase.java
</pre>
<p style="text-align:justify;">Llegados a este punto, tenemos las clases <strong>compiladas</strong> <strong>a bytecodes</strong>. Hay que notar que, dado que en <code>MiClase.java</code> estamos importando las clases del paquete <code>ejemplo.blog</code>, la ruta indicada en el classpath será la que corresponde a la ubicación <strong>del paquete</strong> y no de la clase, es decir <code>/home/elmo</code>. Para ejecutar en Java tendríamos que indicar también en la variable de entorno dónde están todas las clases que vamos a utilizar por lo que haríamos:</p>
<pre>
$ export CLASSPATH=$CLASSPATH":/home/elmo/miclase"
$ java MiClase 5 7
12
</pre>
<p style="text-align:justify;">Una vez visto cómo se hace en Java, vamos a ver como podemos compilar este ejemplo <strong>con GCJ</strong>. Vamos a indicar el classpath con el argumento <code>-I</code> que es la opción que recomiendan los desarrolladores. Por supuesto, la utilización en forma de paquetes es exactamente la misma por lo que las rutas de indicarán de la misma manera que tradicionalmente en Java.</p>
<pre>
$ export CLASSPATH=""
$ cd /home/elmo/ejemplo/blog
$ gcj -c Suma.java -o Suma.o
$ cd /home/elmo/miclase
$ gcj -c -I/home/elmo MiClase.java -o MiClase.o
$ cd /home/elmo
$ gcj --main=MiClase /home/elmo/miclase/MiClase.o /home/elmo/ejemplo/blog/Suma.o -o MiClase.out
$ ./MiClase 5 7
12
</pre>
<p style="text-align:justify;">La primera línea la ejecutamos para borrar el classpath actual, luego compilamos a <strong>objeto</strong> el código fuente de la cada una de las clases. En el caso de <code>MiClase.java</code> indicamos la ruta del paquete que utiliza, <code>ejemplo.blog</code>, mediante el argumento <code>-I/home/elmo</code>. Por último hacemos el <strong>enlace</strong> indicando cual de las clases es la que contiene el método <code>main</code> de nuestro programa, en este caso <code>MiClase</code>. Es <strong>importante</strong> decir también que si hubiéramos hecho que <code>MiClase.java</code> fuera parte del paquete <code>miclase</code>, al indicar el <code>main</code> se haría por medio de <code>--main=miclase.MiClase</code>. En el caso de java tradicional la ejecución habría sido con <code>java miclase.MiClase 5 7</code> y en el CLASSPATH en lugar de poner <code>/home/elmo/miclase</code> habría bastado con <code>/home/elmo</code>.</p>
<p style="text-align:justify;">Espero que todo esto haya sido útil a quién lo lea y que si surge alguna duda o alguna corrección, dejéis un <strong>comentario</strong>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/just4cool.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/just4cool.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/just4cool.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/just4cool.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/just4cool.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/just4cool.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/just4cool.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/just4cool.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/just4cool.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/just4cool.wordpress.com/83/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=just4cool.wordpress.com&blog=4759922&post=83&subd=just4cool&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://just4cool.wordpress.com/2008/12/03/el-classpath-de-gcj/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b5d4d3bbfd469f36bcae8f8c7210d755?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">elmo</media:title>
		</media:content>

		<media:content url="http://just4cool.files.wordpress.com/2008/11/java.png?w=138&#38;h=138" medium="image" />
	</item>
		<item>
		<title>Introducción a GNU GCJ</title>
		<link>http://just4cool.wordpress.com/2008/11/30/introduccion-a-gnu-gcj/</link>
		<comments>http://just4cool.wordpress.com/2008/11/30/introduccion-a-gnu-gcj/#comments</comments>
		<pubDate>Sun, 30 Nov 2008 19:57:02 +0000</pubDate>
		<dc:creator>elmoesdios</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Manuales]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://just4cool.wordpress.com/?p=58</guid>
		<description><![CDATA[
Si algo he aprendido en el desarrollo de mi proyecto de fin de carrera es a utilizar GNU GCJ, cuáles son sus características, qué puede aportar a Java y cómo se utiliza. Cuando empecé a investigar busqué tutoriales sobre cómo compilar con este software y me encontré con apenas un par de ellos medianamente decentes [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=just4cool.wordpress.com&blog=4759922&post=58&subd=just4cool&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;"><a href="http://just4cool.files.wordpress.com/2008/11/java.png"><img class="aligncenter size-full wp-image-59" title="java" src="http://just4cool.files.wordpress.com/2008/11/java.png?w=138&#038;h=138" alt="java" width="138" height="138" /></a></p>
<p style="text-align:justify;">Si algo he aprendido en el desarrollo de mi proyecto de fin de carrera es a utilizar <a href="http://gcc.gnu.org/java/">GNU GCJ</a>, cuáles son sus características, qué puede aportar a <a href="http://www.java.com/es/download/">Java</a> y cómo se utiliza. Cuando empecé a investigar busqué tutoriales sobre cómo compilar con este software y me encontré con apenas un par de ellos medianamente decentes pero insuficientes para mi propósito, que era compilar una librería de clases bastante grande.</p>
<p style="text-align:justify;">Casi todo lo que he aprendido lo he hecho mirando tutoriales en inglés, leyendo la documentación y puede que aparentemente no sea gran cosa pero no fue sencillo. En esta entrada quiero dejar una introducción al uso básico de GCJ y en un futuro ir completando el manual con algunos posts más.</p>
<p><span id="more-58"></span></p>
<p><strong>1 &#8211; ¿Por qué GCJ?</strong></p>
<p style="text-align:justify;">En primer lugar debemos preguntarnos <strong>qué es</strong> GNU GCJ. Este software se desarrolló como alternativa al compilador de Java desarrollado por <a href="http://es.sun.com/">Sun Microsystems</a>. La idea principal era la de no caer en la trampa de Java promulgada por <a href="http://es.wikipedia.org/wiki/Richard_Stallman">Richard Stallman</a> en muchos de sus discursos que consiste en que el API de Java fue liberado pero no podemos utilizar Java libremente porque el <a href="http://es.wikipedia.org/wiki/Java_Runtime_Environment">Java Runtime Enviroment</a> (JRE) no posee las tres libertades básicas.</p>
<p style="text-align:justify;">La problemática de Java es que, según numerosos estudios, es un lenguaje más <strong>lento</strong> que otros como C/<a href="http://es.wikipedia.org/wiki/C%2B%2B">C++</a> lo que se atribuye principalmente al uso de una máquina virtual para ejecutar código. En Java no compilamos a código nativo sino que compilamos a lo que se conoce como bytecodes, la unidad interpretada por la máquina virtual. Ésta, además de intervenir como inconveniente en el rendimiento, otorga la principal ventaja del lenguaje e idea principal de su desarrollo, la <strong>portabilidad</strong>.</p>
<p style="text-align:justify;">Con GCJ rompemos, en cierto modo, la idea con la que se concibió el lenguaje ya que cuando compilamos lo hacemos a <strong>código objeto nativo</strong> en lugar de a bytecodes lo que permite una ejecución directa de las aplicaciones. Aún así, disponemos también de una herramienta libre conocida como <a href="http://en.wikipedia.org/wiki/GNU_Interpreter_for_Java">GIJ</a> (GNU Interpreter for Java) que es otra implementación de la máquina virtual aunque su rendimiento es verdaderamente malo.</p>
<p style="text-align:justify;">Además de estas características, GCJ incorpora una interfaz conocida como <strong><a href="http://gcc.gnu.org/onlinedocs/gcj/About-CNI.html">CNI</a></strong> (Compiled Native Interface) que permite mezclar código escrito en C/C++ con código Java mediante pequeñas modificaciones en la sintaxis del lenguaje de modo que, si lo utilizamos para implementar partes críticas de código, conseguiremos programas mucho más rápidos.</p>
<p style="text-align:justify;">En resumen, con GCJ podemos construir aplicaciones Java <strong>nativas</strong> que, por tanto, no van a necesitar un software adicional para su ejecución. Además, el aspecto más importante es que nuestras aplicaciones serán completamente libres ya que el software ha sido desarrollado bajo licencia GNU <strong><a href="http://es.wikipedia.org/wiki/GNU_General_Public_License">GPL</a></strong>.</p>
<p><strong>2 &#8211; Un ejemplo sencillo</strong></p>
<p style="text-align:justify;">GCJ viene incorporado en la familia de compiladores <strong>GCC</strong> que se puede obtener de la página web oficial. Dado que es un software imprescindible en UNIX, está disponible en los repositorios de cualquier distribución de GNU/Linux. El funcionamiento es similar al resto de compiladores, debemos dar un fichero de entrada y se nos proporcionará uno de salida. El software posee su propia implementación del <a href="http://es.wikipedia.org/wiki/API">API</a> de Java incluida en una librería llamada <code>libgcj</code> que se instala junto con el compilador.</p>
<p style="text-align:justify;">Como ficheros de entrada se permite código fuente <code>.java</code>, clases compiladas a bytecodes <code>.class</code> y colecciones de clases <code>.jar</code> o <code>.zip</code>.</p>
<p style="text-align:justify;">La salida puede ser bien código objeto sin enlazar o un ejecutable ya enlazado. Como primer ejemplo vamos a compilar el clásico hola mundo de Java. Por el momento, el fichero se ubicará en nuestro HOME; la compilación y ejecución también se hará desde nuestro HOME. El código es el siguiente:</p>
<pre class="brush: java;">
// Fichero HolaMundo.java
public class HolaMundo {
        public static void main(String[] args) {
           System.out.println(&quot;¡Hola, mundo!&quot;);
        }
 }
</pre>
<p style="text-align:justify;">Como podemos ver, es el código más simple del mundo, no se utiliza ninguna clase externa, solamente el método <code>System.out.println</code> que es un estándar del API de Java implementado en <code>libgcj</code>. Para compilar y ejecutar la clase tradicionalmente en Java haríamos lo siguiente (previa instalación del JDK de Sun):</p>
<pre> $ javac HolaMundo.java
 $ java HolaMundo
¡Hola, mundo!</pre>
<p style="text-align:justify;">Cada clase que componga una librería Java puede implementar un método <code>main</code> propio. Cuando ejecutamos código con la máquina virtual siempre lo hacemos de una clase en concreto pero cuando lo que tenemos es un ejecutable tiene que haber un método <code>main</code> forzosamente y siempre el mismo. Por este motivo es <strong>necesario</strong> indicar a GCJ qué clase es la que contiene el método principal durante el enlace. Así, la compilación, enlace y ejecución respectivamente sería:</p>
<pre> $ gcj -c HolaMundo.java
 $ gcj --main=HolaMundo HolaMundo.o -c Hola
 $ ./Hola
¡Hola, mundo!</pre>
<p style="text-align:justify;">Hasta ahora hemos aprendido cómo se compila una clase simple. Esto es lo más sencillo y se puede encontrar sin mucha dificultad en Internet. El problema surge cuando lo que tenemos es una colección de clases con dependencias cruzadas, cuando esta colección está estructurada en paquetes, cuando queremos automatizar la compilación porque son muchas clases las que queremos compilar, etc.</p>
<p style="text-align:justify;"><strong>3 &#8211; Próximos posts</strong></p>
<p style="text-align:justify;">Más adelante explicaré cómo es la implementación del CLASSPATH, qué opciones de compilación tenemos disponibles, qué características se comparten con el compilador de C, cómo podemos automatizar la compilación por medio de un Makefile, cómo funcionan las dependencias, etc.</p>
<p><a href="http://just4cool.wordpress.com/2008/12/03/el-classpath-de-gcj/"><strong>Continuación:</strong> El classpath de GCJ.</a></p>
<p>Espero comentarios si os interesa el tema, un saludo.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/just4cool.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/just4cool.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/just4cool.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/just4cool.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/just4cool.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/just4cool.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/just4cool.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/just4cool.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/just4cool.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/just4cool.wordpress.com/58/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=just4cool.wordpress.com&blog=4759922&post=58&subd=just4cool&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://just4cool.wordpress.com/2008/11/30/introduccion-a-gnu-gcj/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b5d4d3bbfd469f36bcae8f8c7210d755?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">elmo</media:title>
		</media:content>

		<media:content url="http://just4cool.files.wordpress.com/2008/11/java.png" medium="image">
			<media:title type="html">java</media:title>
		</media:content>
	</item>
	</channel>
</rss>