Download Implementación de la GNU
Document related concepts
no text concepts found
Transcript
IMPLMENTACIONES LIBRES DE J2SE: ESTADO ACTUAL A. Otero1, A. Sánchez-Mariscal2 1 Departamento de Ingeniería del Software y del Conocimiento, Universidad San Pablo CEU, España 2 javaHispano, http://javahispano.org, España [email protected] En este trabajo se estudia el estado actual de diferentes proyectos libres que permiten ejecutar aplicaciones Java sin depender de software propietario. Sólo se han tenido en cuenta los proyectos que en la actualidad muestran una actividad alta y han obtenido logros considerables, tomando como baremo de dichos logros las aplicaciones Java que han sido capaces de compilar y/o ejecutar. El trabajo pretende servir de apoyo y guía a aquellas organizaciones o individuos interesados en encontrar soluciones que permitan ejecutar en un entorno completamente libre aplicaciones escritas en lenguaje Java. Introducción Individuos, pequeños grupos de usuarios de Linux, universidades, empresas e incluso instituciones gubernamentales han acudido en alguna ocasión a javaHispano para consultar si "¿Java es libre?". Irónicamente, a ninguno de ellos le interesaba la respuesta a esa pregunta, a la cual se ha tratado de responder en (1). La pregunta que pretendían formular es "¿Existe alguna implementación libre del entorno base de la plataforma Java?". Para entender la diferencia entre ambas preguntas es necesario conocer qué es la plataforma Java. Ésta está formada por un conjunto de especificaciones que definen todas y cada una de sus partes, y una serie de implementaciones de estas especificaciones. El JCP, Java Community Process, es el organismo que dirige, mediante la creación de nuevas especificaciones y el mantenimiento de las ya existentes, la evolución de la plataforma. Este organismo define su propio funcionamiento y las normas por las que se rige; las vigentes actualmente se recogen en (2). El JCP consta de dos Comités Ejecutivos (CE), cada uno de ellos compuesto por 16 miembros, que se encargan de aprobar las modificaciones y extensiones de la plataforma; uno se encarga de las especificaciones relacionadas con J2EE y J2SE (ediciones empresarial y estándar, respectivamente, de la plataforma), y el otro de las relacionadas con J2ME (edición para pequeños dispositivos). Convertirse en miembro del JCP es gratis para empresas licenciatarias de Sun (empresas que implementan especificaciones de la plataforma con ánimo de lucro y pagan por ello a Sun), y para personas que a título individual deseen formar parte del JCP. Las empresas no licenciatarias han de pagar 5000 $ por año. En el caso de organizaciones sin ánimo de lucro e instituciones académicas, un comité decide si pueden formar parte del JCP gratis, o han de pagar 2000 $. Cualquier miembro del JCP (incluso los individuos) es elegible para los CE. Las incorporaciones de nuevas tecnologías a la plataforma Java se realizan a través del JCP, mediante un JSR, Java Specification Request (3), un documento que explica la necesidad de esa nueva tecnología, o de modificación de una tecnología ya existente, y cómo afectará este cambio al resto de la plataforma. Cualquiera, sea o no miembro del JCP, puede proponer nuevos JSR. Uno de los dos CE del JCP, según el nuevo JSR afecte a J2ME, o a J2SE/J2EE, analiza la propuesta y decide si acepta o no la creación del JSR y, posteriormente, si se aprueba o no. Estas decisiones se realizan mediante una votación pública. Para completar un JSR también se debe desarrollar una implementación de referencia de la especificación y una batería de pruebas que permitan verificar si una implementación de un tercero sigue o no la especificación. No hay impedimentos para que terceras partes creen otras implementaciones bajo cualquier licencia y sin pagar royalties. Por tanto, Java más que un software es un estándar (especificación), y preguntarse si Java es libre equivale a preguntarse si Java puede considerarse un estándar libre. Según los propios criterios del mundo del software libre, la respuesta a esta pregunta es afirmativa (1). En ese trabajo se trata de dar respuesta a la pregunta ¿Existe alguna implementación libre del entorno base de la plataforma?. Para ello se analiza de modo breve, pero exhaustivo dentro de las posibilidades de los autores, las implementaciones libres del entorno base de la plataforma Java (J2SE) o de alguna de sus partes principales (compilador, máquina virtual o librerías estándar). Sólo se han estudiado aquellas implementaciones que permiten ejecutar aplicaciones Java de cierta envergadura, por considerar que son las más maduras y útiles. El realizar un estudio que abarque todas las implementaciones existentes desborda los límites de espacio de este trabajo: existen, al menos, unas dos docenas. A continuación se presenta, por este orden, el estado actual de GCJ, Kaffe, IKVM y JNode. Junto con GCJ también se analizará el estado de Classpath, una implementación de las librerías Java que comparten los cuatro proyectos. Finalmente, se discute hasta qué punto es viable ejecutar aplicaciones Java en un entorno completamente libre y se presentan las conclusiones extraídas de este trabajo. GCJ + Classpath La FSF comenzó su implementación del entorno base de la plataforma Java en la segunda mitad de 1998. Esta implementación, con nombre GCJ (4), se integra dentro GCC y su objetivo es proporcionar soporte para Java dentro de la colección de compiladores. GCJ permite compilar código Java a código máquina, bytecode a código máquina y código Java a bytecode. Las aplicaciones compiladas son enlazadas con el entorno de ejecución de GCJ, libgcj (4), que proporciona las librerías estándar Java, un colector de basura y un intérprete de bytecode. libgcj da soporte a una gran parte de las librerías estándar de Java, entre ellas el framework de colecciones, java.net, java.io, java.lang, reflexión, y serialización. En las versiones 3.X existía una gran cantidad de código AWT, sin embargo no era suficiente para aplicaciones reales. En las versiones más recientes, 4.X, el soporte para AWT está prácticamente completo y el soporte para Swing (objetivo del proyecto Free Swing) está muy avanzado, pero aún no es suficiente para aplicaciones reales. Uno de los motivos del éxito de Java son sus extensas y completas librerías; un compilador o un intérprete Java sin una implementación de las librerías base sólo permitirá trabajar con pequeños programas juguete sin ningún interés práctico. Las librerías que incorpora libgcj en la actualidad son una adaptación de GNU Classpath (5). Este proyecto inicialmente fue diseñado para trabajar con la máquina virtual Japhar, una de las primeras máquinas virtuales libres que se desarrollaron que en la actualidad está completamente abandonada y cuyo soporte para Java se encuentra muy desfasado. Classpath constituye el pilar central de cualquier implementación funcional actual del JDK, ya que todas se basan en él. También suele ser el factor limitante en lo relativo a compatibilidad con la especificación de una determinada alternativa. Además de las soluciones que se recogen en este documento, estas librerías son o han sido empleadas por JAmiga, Jaos, JamVM, JC, Jikes, Júpiter, Kissme, SableVM, CACAO y ORP, entre otras. Classpath puede considerarse 100% compatible con las librerías de los JDKs 1.0 y 1.1, versiones que actualmente son demasiado antiguas para resultar de interés en desarrollos reales. El soporte de Swing puede considerarse la única falla en la compatibilidad respecto a los JDKs 1.2 y 1.3, versiones que, aunque un poco desfasadas, sí se emplean todavía en entornos de producción. La compatibilidad con el JDK 1.4, sin considerar Swing, no es completa aunque está bastante cercana. A principios de enero del 2006 la rama de Classpath que incluye soporte para tipos genéricos (la más completa) carecía de 2 paquetes, 54 clases, 85 métodos y 11 constructores de las librerías estándar del JDK 1.4; y contenía 5 clases, 2 campos y 1 constructor implementados de modo incorrecto (6). La compatibilidad con el JDK 1.5, a nivel de librerías, deja bastante que desear: faltan 22 paquetes, 118 clases, 15 interfaces, 8 enumeraciones, 57 campos, 396 métodos y 66 constructores; y 13 clases, 4 campos, 4 métodos y 3 constructores están implementados de modo incorrecto (6). Estos datos fueron obtenidos mediante las herramientas japitools, Java API compatibility testing tools (6). japitools consta de dos herramientas que permiten testar la compatibilidad de las librerías Java contra la implementación de Sun, así como la compatibilidad hacia atrás entre dos versiones cualesquiera de las librerías. Las herramientas son japize y japicompat. Japize es un programa Java que crea un listado a partir de una API Java en un formato no legible por un ser humano. Japicompat toma como entrada dos de estos listados y compara su compatibilidad binaria según lo definido en la especificación del lenguaje Java (7). japitools no está preparada para tener en cuenta aspectos del API que usen las nuevas características de Java 1.5, por lo que realiza la comparación basándose en la semántica de los binarios de Java 1.4. Ambas herramientas se ejecutan diariamente contra el CVS de Classpath. Hasta hace un par de años libgcj proporcionaba informes de su compatibilidad a nivel de librerías con los JDKs de Sun empleando japitools. En la actualidad han cesado de proporcionarlos, pero esta debe ser muy similar a la de Classpath. Sí existe información acerca de la compatibilidad entre libgcj y Classpath, pero el último informe data de diciembre de 2004 y es de esperar que en la actualidad estén mucho más próximos. Respecto al soporte del lenguaje, GCJ no soporta las nuevas características de Java 1.5. Éstas se están desarrollando en GCJX, que se convertirá en el nuevo compilador Java de GCC. Actualmente GCJX es capaz de parsear y analizar código Java 1.4 correctamente, y posee un soporte bastante amplio de las nuevas características de Java 1.5, si bien en este último caso todavía tiene bastantes bugs y el soporte para tipos genéricos no está terminado. Actualmente GCJX es capaz de compilar la versión de Classpath que incluye tipos genéricos con un poco de trabajo manual. GCJ carece de herramientas para la gestión de certificados (keytool), para firmar archivos jar (jarsigner), herramientas de apoyo al desarrollo de aplicaciones RMI (rmic y rmiregistry) y corba, así como herramientas similares a javap, javah, serialver, native2ascii... Algunas de estas herramientas se están desarrollando actualmente bajo el proyecto GNU Classpath::Tools (8), si bien la única de la cual existen archivos liberados es gjdoc, equivalente a la herramienta javadoc del JDK de Sun. GCJ soporta applets mediante un proyecto externo, gcjwebplugin, del cual aún no existe ninguna versión estable. Sin embargo, este proyecto no tiene implementado ningún gestor de seguridad, por lo que los applets y aplicaciones JNLP tienen acceso ilimitado a los recursos de la máquina, y no soporta todos los navegadores web. GCJ da soporte a la depuración de aplicaciones mediante la herramienta gdb, pero no implementa el protocolo JDWP (Java Debug Wire Protocol). El soporte de este protocolo es opcional: una implementación puede ser Java compatible sin soportarlo. Sin embargo, es empleado por la mayor parte de los IDEs y el no implementarlo impide la integración de GCJ con ellos. En el futuro, se pretende añadir soporte para JDWP en Classpath. Respecto a la licencia bajo la cual se distribuye GCJ, como es de esperar, es GPL 2.0, a excepción de libgcj (y Classpath) que se distribuyen bajo la licencia GPL 2.0 con la "excepción libgcc". Esta excepción permite enlazar código con la librería sin que éste quede bajo el efecto de la licencia GPL. Kaffe Kaffe (9) fue uno de los primeros intentos para conseguir un JDK libre. Su desarrollo comenzó en 1996 y fue respaldado por la desaparecida compañía Transvirtual Technologies. El principal producto de esta compañía, donante de una considerable cantidad de código y tiempo de sus desarrolladores para el proyecto, era una máquina virtual comercial propietaria, KaffePro, que compartía código con la libre. En 1998 Kaffe llegó a ganar el premio de JavaWorld a la mejor máquina virtual. Este proyecto sufrió dos golpes bastante duros. Primero su fundador, Tim Wilkinson, dejó de trabajar para Transvirtual y de tener tiempo para Kaffe. El proyecto estuvo casi parado durante un período de dos años comprendido entre 2000 y 2002 en el que no se liberó ningún archivo. En 2002 Jim Pick tomó el relevo a Tim tanto al frente de Kaffe como de KaffePro, siendo el líder actual del proyecto. Ese mismo año quebró Transvirtual Technologies y, por tanto, cesaron las contribuciones de código y desarrolladores a Kaffe. A pesar de estas desventuras y de haber pasado por un tiempo de baja actividad, el proyecto ha logrado remontar vuelo. Actualmente libera revisiones con más frecuencia que GCJ y SouJava cree que Kaffe junto con Classpath constituirán la primera implementación libre del entorno base de la plataforma Java (10); para trabajar en la línea de la obtención de la certificación de esta implementación han creado el proyecto roxo (11). Kaffe es una máquina virtual tradicional basada en intérprete y compilador JIT (Just In Time). Aunque inicialmente contaba con su propia implementación de las librerías estándar, ésta se quedó desfasada y se ha ido fusionando poco a poco con Classpath; en la actualidad el soporte de Kaffe a nivel de librerías puede considerarse idéntico al del proyecto GNU. Existen planes para que en el futuro la máquina virtual funcione directamente sobre Classpath sin necesidad de realizar ninguna adaptación. La principal carencia de este proyecto es la casi total ausencia de documentación. El equipo de desarrolladores parece haberse olvidado completamente de este tema: en su portal ni siquiera proporcionan información sobre qué características del lenguaje soporta y cuál es el estado de desarrollo de las no soportadas. Los comentarios que acompañan a cada nueva versión son breves y parcos en detalles. Las listas de correo públicas y un FAQ bastante desfasado son la única documentación existente. Desgraciadamente, Kaffe constituye un excelente "caso de uso" para una de las críticas más comunes a los proyectos libres: la falta de documentación. Kaffe ha permitido ejecutar Eclipse 3.1 y 3.0, Tomcat 3.X, 4.X y 5.X, JBoss 3.2, Resin, HSQLDB, Berkeley DB, Prevayler, SwingWT, Ant, Rhino, múltiple drivers JDBC y varios de los proyectos de Apache Jakarta. El proyecto también tiene un conjunto de herramientas de apoyo al desarrollo similares a javap, serialver, rmic, rmiregistry, javadoc... aunque, al igual que el resto del proyecto, sin documentar. No soporta JDWP, por lo que no puede ser integrado con IDEs. Su licencia es GPL. IKVM IKVM (12) es una implementación de Java para Microsoft .NET y Mono, implementación libre de la plataforma .NET desarrollada por Miguel de Icaza y apoyada por Novell. Obviamente, para los objetivos de este artículo, nuestro interés se centra en la segunda plataforma. IKVM consta de una máquina virtual Java implementada en .NET, de una implementación de las librerías estándar de Java en .NET y de un conjunto de herramientas para permitir la interoperabilidad entre java y .NET. IKVM permite ejecutar aplicaciones Java de dos modos diferentes. El primero emplea una máquina virtual que interpreta el bytecode y lo transforma a IL (Intermediate Language) de .NET, el cual es a su vez interpretado por el entorno de ejecución de la segunda plataforma. El segundo traduce de modo "estático" el bytecode a IL de .NET, el cual es interpretado directamente por el entorno de ejecución. En ambos casos IKVM parte de bytecode Java, no disponiendo de herramientas que permitan compilar el código fuente. Por tanto, con vistas a conseguir un entorno base completo libre de la plataforma Java, IKVM necesita de un compilador libre. También deja abierto el problema de la depuración del código fuente Java, así como las herramientas de apoyo al desarrollo (javadoc, jarsigner, javap...). Al igual que Kaffe y GCJ, IKVM se basa en Classpath para obtener las librerías estándar, aunque debe añadir a éstas cierto código específico. Parte de este código son los peers de AWT para .NET, desarrollo que actualmente no constituye una prioridad para el proyecto. Por tanto, en lo relativo a soporte de librerías IKVM se encuentra por debajo de los anteriores. En lo referente al lenguaje, IKVM soporta completamente Java 1.4, aunque no 1.5. Este proyecto podría permitir escribir programas con sintaxis Java empleando las librerías de Mono, supliendo así las deficiencias de Classpath. De este modo se podrían construir programas que se ejecutasen en un entorno completamente libre, aunque quedaría por resolver la parte de compilación. Algunas aplicaciones que han sido ejecutadas con éxito con IKVM son Eclipse, Jython y JBoss. La licencia de IKVM es tipo Apache, aunque para funcionar necesita de Classpath, con el que se puede enlazar debido la excepción libgc. JNode JNode, Java New Operating System Design Effort (13), es un proyecto con licencia LGPL cuyo objetivo es construir un sistema operativo fácil de instalar y usar que permita ejecutar de modo seguro cualquier aplicación Java. Los orígenes del proyecto se remontan a 1996. Por aquel entonces Ewout Prangsma, fundador del proyecto, se planteó el reto de construir no sólo una máquina virtual Java, sino un sistema operativo completo. Tras dos intentos fallidos en los que se empleó C y ensamblador nació JNode, programado en Java y con una cantidad mínima de ensamblador. En la actualidad JNode es funcional y soporta una gran parte del hardware más común para PCs. JNode depende de Classpath para obtener las librerías estándar de Java. En lo que destaca el proyecto es en el soporte del lenguaje: en la actualidad soporta todas las nuevas características de Java 1.5. No obstante, debe resaltarse que el objetivo de JNode es sólo proporcionar un entorno de ejecución para aplicaciones Java, por lo que no han tenido que desarrollar un compilador para Java 1.5, sino solamente un intérprete tipo JIT. De modo similar a IKVM, JNode resuelve el problema de ejecutar aplicaciones Java empleando sólo software libre, aunque con un mayor soporte para el lenguaje (soporte que puede considerarse completo) y mejor soporte para las librerías, ya que se encuentra al mismo nivel que Classpath y no por debajo de éste. Nuevamente, queda por resolver la compilación y el proporcionar herramientas de apoyo al desarrollo. Discusión El principal factor limitante en la compatibilidad de todas las implementaciones son las librerías, en especial el soporte de Swing, imprescindible para obtener un JDK 1.2 compatible o superior. En este sentido, cabe destacar el espíritu de cooperación de la comunidad del software libre que, viendo lo ardua que era la tarea, abandonó las múltiples implementaciones paralelas para cerrar filas entorno a Classpath. Quizás alguien podría pensar que, como solución transitoria, podría emplearse un compilador y una máquina virtual libres contra las librerías de Sun. Esto no es posible ni técnica ni legalmente. La imposibilidad legal surge de la licencia bajo la cual se distribuyen dichas librerías. La técnica, es que estas librerías realizan múltiples llamadas a métodos nativos no documentados que implementa la máquina virtual de Sun. Intentar emplear las librerías con otra máquina virtual supondría implementar en ella esos métodos no documentados cuya funcionalidad se conoce. Aunque se han obtenido importantes logros ejecutando aplicaciones de envergadura, sobre todo con Kaffe y GCJ, también hay que reconocer que el ejecutar estas aplicaciones requiere, habitualmente, de bastante trabajo manual y artimañas que se escapan a las capacidades de un usuario medio. Uno de los ejemplos más conocidos es el trabajo realizado por Debian y otras distribuciones para conseguir que funcionase OpenOffice.org 2.0. Hay dos impedimentos principales a la hora de ejecutar un código fuente Java con software libre. El primero, el soporte de Swing. La solución pasa por emplear otras alternativas como AWT o SWT; de todos modos, ha habido ciertos casos de éxito en la compilación de aplicaciones que usan Swing. El segundo impedimento son las dependencias del código fuente con paquetes com.*; estos paquetes pertenecen al JDK de Sun pero no forman parte de las librerías estándar. Es curioso que esta sea una de las causas de los fracasos a la hora de llevar aplicaciones Java a una plataforma libre, sobre todo cuando el propio Sun recomienda no emplear dichos paquetes ya que pueden cambiar en el futuro y emplearlos rompe la portabilidad entre distintas implementaciones del entorno base. Sin embargo, esta es la causa de muchos fracasos de GCJ y Kaffe. versión 2.6 del JCP; esto es, sólo podría certificarse un JDK compatible con Java 1.5. En la actualidad, tanto la implementación de Kaffe como la de GCJ dedican la mayor parte de esfuerzos a desarrollar un entorno de ejecución, que no un JDK completo. Esto viene motivado por conseguir entornos de ejecución completamente libres para poder ejecutar software libre escrito en Java en las distribuciones de Linux. Si bien el fin es loable, no lo es tanto una de sus consecuencias: la falta casi total de herramientas libres para el desarrollo de aplicaciones Java. Si ejecutar aplicaciones Java en un entorno completamente libre es complicado, el desarrollarlas es imposible o extremadamente complejo. El soporte para Java 1.4, excluyendo Swing, es relativamente alto. En el caso de Java 1.5, última versión de la plataforma que ha introducido un número considerable de cambios, deja bastante que desear. En el estudio no se ha incluido Harmony, una implementación desarrollada por Apache Software Foundation, por no disponer en la actualidad de ninguna solución funcional. No obstante, es un proyecto con grandes posibilidades de éxito que no se debe perder de vista. Aunque no podrá reutilizar ningún trabajo de los anteriores, ya que se distribuyen bajo licencias incompatibles con la de Apache (GPL o LGPL), podría completar una implementación de Java 1.5 a medio plazo. Por un lado, el proyecto cuenta con el apoyo de una comunidad tan activa y numerosa como la de Apache. Por otro, la excelente relación que la fundación mantiene con múltiples empresas y el hecho de que el código fuente del proyecto podría utilizarse en productos comerciales augura un notable apoyo empresarial. Hasta la fecha, Intel ya ha contribuido con código para temas relacionados con criptografía y seguridad, e IBM ha donado los paquetes java.lang, java.util, java.io y java.net, así como una interfaz que permitirá emplear las librerías de Harmony con cualquier máquina virtual. Conclusiones Actualmente sólo se podría conseguir una implementación completa del entorno base de la plataforma Java compatible con el JDK 1.1 y, probablemente, esa hipotética implementación todavía requiriese la corrección de abundantes bugs para pasar los test de compatibilidad. En cualquier caso, esto será algo que nunca sabremos, ya que sólo pueden certificarse implementaciones con licencia libre de aquellas versiones de J2SE que se encuentren bajo la No obstante, se ha demostrado que es posible compilar aplicaciones a código nativo (GCJ) y ejecutarlas en una máquina virtual tradicional (Kaffe) empleando única y exclusivamente software libre: Eclipse, OpenOffice.org, JOnAS, JBoss, Tomcat, Resin y Ant han sido los principales logros hasta la fecha. Aun a riesgo de ser tachados de optimistas, creemos que estamos a no mucho más de un par de años de tener una implementación completa funcional de Java 1.5, que podría ser Kaffe + Classpath, GCJ + Classpath o Harmony. Palabras clave: Java, GCJ + Classpath, Kaffe, IKVM. Bibliografía: (1) A Otero, "Estándares libres y Java: ¿Es el JPC un organismo que crea estándares libres?. II Congreso javaHispano, páginas 87-98. Madrid, 2004. (2) JCP v. 2.6. http://jcp.org/aboutJava /communityprocess/first/jsr215/JCP2_6.pdf. (3) Java Specification Request. http://www.jcp.org/ en/jsr/overview. (4) GCJ. Http://gcc.gnu.org/java. (5) Classpath. http://www.classpath.org. (6) Japitools. http://www.kaffe.org/~stuart/japi. (7) J. Gosling, B. Joy, G. Steele, G. Bracha. The Java Language Specification. Addison Wesley, 2003. (8)Classpath::Tools. http://www.gnu.org/software/classpath/cp-tools. (9) Kaffe. http://www.kaffe.org. (10) Certificación de Kaffe + Classpath. http://developer.classpath.org/support. (11) Roxo. https://roxo.dev.java.net. (12) IKVM. http://www.ikvm.net. (13) JNode. http://www.jnode.org.