Hace ya algún tiempo que le vengo dando vueltas a un proyecto. Se trata de desarrollar un módulo software (J2XMI) en mis ratos libres, como proyecto de investigación open source. La idea está más que trillada, la meta es implementar una librería para hacer ingeniería inversa sobre código Java. Lo nuevo es el resultado que produce la herramienta: ficheros de salida XMI que describen un modelo UML de clases.
¿Por qué XMI? Sus propias siglas lo dicen, se trata de "XML for Metadata Interchange". Un resultado en este formato permitiría intercambiarlo entre diversas herramientas software, tanto CASE como otras librerías.
He decidido emprender este proyecto después de haber comprobado que existen muy pocas herramientas open source y free software que hagan ingeniería inversa útil y fiable. En ocasiones, pecan de simples por omitir detalles del modelo que considero importantes, como la documentación javadoc y los sources originales; en otros casos, cuando pretenden ser rigurosas, generan diagramas erróneos y complejos, que en último caso no permiten volver a pasar del diagrama al código original.
Primero, los beneficios que debe proporcionar. Luego, un pequeño "plan de ataque".
Beneficios
- Ingeniería inversa de código bien hecha (¿es posible?), que incorpore todo el código fuente original, así como la documentación incluida en el código (comentarios Javadoc). El contenido de los XMI generados debe ser una "disección" del código fuente original, de manera que no se pierda información del código sino que se amplíe la existente con información UML.
- El propósito de los XMI generados es doble: por un lado, podrán utilizarse para analizar el código Java existente y por otro servirán como base para portar software Java a otros lenguajes OO. Para generar código fuente esqueleto en otros lenguajes, quizá (?) sería posible utilizar XSLT.
- Integración con IDEs y otras herramientas (Apache ant, p. ej.) mediante una API muy parecida a la de un compilador, esto facilitaría la integración con otras herramientas.
- Posiblemente, sea necesario implementar una API para crear elementos UML (clases, packages, atributos, etc.) y traducirlos a XMI de manera sencilla, en lugar de trabajar directamente con APIs de XML y crear tags y atributos para cada elemento UML. Esta librería se podría utilizar en otros proyectos de SW libre. La librería más parecida que he encontrado está incluida en Eclipse Modeling Framework (EMF), y no parece de uso intuitivo. Se admiten sugerencias respecto a otras librerías ;-)
- En un futuro, generación de información complementaria acerca del código, como dependencias entre métodos. Esta información se podría anotar usando los comentarios incluidos en el código fuente que se está analizando. No tengo claro si sería posible exportar esta información en XMI, esto aún está pendiente de investigar.
- También en un futuro, ingeniería inversa de otros lenguajes OO, como python, ruby o groovy.
Plan de ataque :-)
A continuación, describo los pasos necesarios para realizar ingeniería inversa de código Java:
- El primer paso consiste en diseccionar adecuadamente el código fuente de una unidad de compilación (fichero .java). En concreto, se trata de generar un árbol de sintaxis abstracta (AST), que contiene el código fuente separado en distintos nodos relacionados. Las herramientas que generan ASTs a partir de código fuente se denominan analizadores de código fuente (lexers/parsers) .
Un analizador (o parser) se puede crear utilizando un generador de parsers. El generador que más me ha convencido ha sido ANTLR, una herramienta parecida a Lex/Yacc o Flex/Bison. Como entrada toma un fichero que contiene la gramática EBNF que describe un lenguaje de programación, Java en este caso. Como salida, produce los fuentes de un lexer y un parser del lenguaje descrito en la gramática. Una vez hayamos generado estos fuentes, tan sólo tendremos que compilarlos y ya tendremos el parser listo para usarlo.
Al ejecutar el parser suministrándole un fichero .java, devuelve una estructura en árbol, que es el AST buscado.
Actualmente, existen ficheros de gramáticas Java disponibles. Sería necesario modificar alguno de ellos para que ANTLR generase un parser que no ignorase los comentarios javadoc, guardase las características del lenguaje relacionadas con UML y preservase el resto del .java como nodos del árbol AST.
La dificultad de este paso radica en modificar el fichero de gramática EBNF que utiliza ANTLR ya que, debido a la complejidad del funcionamiento de esta herramienta, los ficheros EBNF son también bastante complicados.
- El segundo paso consiste en transformar el árbol AST en otro árbol con una estructura de nodos equivalente a un documento XMI (árbol XML).
Para llevar a cabo este segundo paso, también puede utilizarse ANTLR de una manera similar a la del paso previo, o bien puede implementarse un módulo que traduzca el árbol de entrada a otro de salida. Este árbol de salida consta de nodos que representan elementos UML: packages, clases, atributos, métodos, notas, etc.
- El tercer y último paso consiste en generar un documento XMI a partir del árbol transformado.
- Una vez obtenidos todos los XMI de los ficheros .java de un package, por ejemplo, podrían mezclarse para obtener un XMI que describa en package entero, en lugar de sólo las unidades de compilación.
Conclusión
El problema que más difícil me parece de resolver es generar un XMI compatible con distintas herramientas SW. En efecto, aunque XMI es un standard, es posible definir extensiones al mismo y, de hecho, esto es lo que hacen las distintas herramientas CASE, de forma que el dialecto XMI generado por alguna de ellas no es importable desde otras. Por tanto, sería necesario que J2XMI generase varios tipos de XMI distintos, según la herramienta desde la que se pretendiese importar el modelo.
sábado 3 de febrero de 2007
J2XMI
Etiquetas:
free software,
ingeniería inversa,
java,
library,
open source,
reverse engineering,
xmi,
xml
jueves 4 de enero de 2007
No somos frikis, somos multitud
Tiene lo suyo lo que ha cambiado la cosa en los últimos años. El friki gafotas de clase, que nadie escogía para jugar en su equipo del colegio, uno entre cuarenta, ahora es veinte de cuarenta. La mitad, señora, ni cuarto kilo ni leches. Vale, me he excedido con el porcentaje. Ponga usted, señor lector, el que más le plazca, siendo honrado al calcularlo a ojo. Dígame ahora, estimado visitante, ¿seguimos siendo cuatro gatos ;-)?
Por desgracia, aunque la cantidad ha aumentado, la calidad de tanta producción en serie ha disminuído: ahora son bastante más surrealistas. Antes, si te quitaban las gafotas y te intentaban mangar los cómics de Spiderman, les partías las pelotas de una patada y a correr tocaban. Ahora, probablemente balbuceen algo acerca de los derechos humanos, talante y tolerancia. Y se queden sin las gafas, los cómics, la PSP y las Adidas. Suerte que a los mangantes no les suelen gustar los calzoncillos de Bart Simpson, que si no...
Con esto no quiero decir que los frikis de hoy en día sean unos blanditos. Me remito al valor necesario para hacer lo que se cuenta a continuación: irse por los locales más frecuentados de la ciudad la noche de más marcha universitaria de la semana, vestidos de vampiros, en grupos de diez o más, a jugar a un juego de rol "sobre el terreno". Para más inri, traficando con bebidas isotónicas, puntos de energía, magia, habilidad para rascarse las gónadas y demás parafernalia rolera. Para hacer eso, de blando nada. Hay que tener el valor de un tripulante de patera y casi las mismas ganas. Si no te caen un par de leches por las pintas, te llevas las ostias por la conversación. Si los posibles ligues no salen corriendo, será porque se descojonan tanto de la risa que no son capaces ni de caminar. Que conste, los respeto hasta el último centímetro de sus capas.
Pero vamos a lo que íbamos, la proliferación de un fenómeno antes escaso. Hace una década o así, éramos los raritos. Ahora ya somos: frikis, nerds, geeks, otakus y muchos más. Eres friki o variante si te gustan alguno o todos los temas que siguen: internet, las nuevas tecnologías (desde el móvil hasta la encriptación cuántica), los juegos de rol, "La Guerra de las Galaxias" (mejor si sabes qué marca de laca usaba Leia), las pelis y series de ciencia-ficción de serie Z,
el anime/manga, las camisetas con mensaje ("NO voy a arreglar tu puto PC" es mi favorita)... total, la mitad de la especie humana. Creo que tenemos que redefinir el concepto de friki: los raritos no somos nosotros, son ellos. Y si no, que me expliquen cómo es posible que lo raro sea lo que hace la mitad de la población.
Podéis creerme, me alegro realmente de que seamos tantos. Se estaba poniendo realmente jodido conseguir el número 1 de Spiderman :-)
Por desgracia, aunque la cantidad ha aumentado, la calidad de tanta producción en serie ha disminuído: ahora son bastante más surrealistas. Antes, si te quitaban las gafotas y te intentaban mangar los cómics de Spiderman, les partías las pelotas de una patada y a correr tocaban. Ahora, probablemente balbuceen algo acerca de los derechos humanos, talante y tolerancia. Y se queden sin las gafas, los cómics, la PSP y las Adidas. Suerte que a los mangantes no les suelen gustar los calzoncillos de Bart Simpson, que si no...
Con esto no quiero decir que los frikis de hoy en día sean unos blanditos. Me remito al valor necesario para hacer lo que se cuenta a continuación: irse por los locales más frecuentados de la ciudad la noche de más marcha universitaria de la semana, vestidos de vampiros, en grupos de diez o más, a jugar a un juego de rol "sobre el terreno". Para más inri, traficando con bebidas isotónicas, puntos de energía, magia, habilidad para rascarse las gónadas y demás parafernalia rolera. Para hacer eso, de blando nada. Hay que tener el valor de un tripulante de patera y casi las mismas ganas. Si no te caen un par de leches por las pintas, te llevas las ostias por la conversación. Si los posibles ligues no salen corriendo, será porque se descojonan tanto de la risa que no son capaces ni de caminar. Que conste, los respeto hasta el último centímetro de sus capas.
Pero vamos a lo que íbamos, la proliferación de un fenómeno antes escaso. Hace una década o así, éramos los raritos. Ahora ya somos: frikis, nerds, geeks, otakus y muchos más. Eres friki o variante si te gustan alguno o todos los temas que siguen: internet, las nuevas tecnologías (desde el móvil hasta la encriptación cuántica), los juegos de rol, "La Guerra de las Galaxias" (mejor si sabes qué marca de laca usaba Leia), las pelis y series de ciencia-ficción de serie Z,
el anime/manga, las camisetas con mensaje ("NO voy a arreglar tu puto PC" es mi favorita)... total, la mitad de la especie humana. Creo que tenemos que redefinir el concepto de friki: los raritos no somos nosotros, son ellos. Y si no, que me expliquen cómo es posible que lo raro sea lo que hace la mitad de la población.
Podéis creerme, me alegro realmente de que seamos tantos. Se estaba poniendo realmente jodido conseguir el número 1 de Spiderman :-)
Ambientador de pino
Era una moda hace algunos años en los coches de familia de clase media. El ambientador de cartón con forma de pino y fragancia de idem. Se colgaba en el retrovisor, donde iba la cruz del rosario, el último regalo para papá de la niña o el minibalón de fútbol.
Me he acordado de este topicazo, casi tan famoso como el muñeco de luneta trasera, cuando recordaba el verano del pasado 2006. Fuego, de norte a sur, en Galicia. Había pinos, muchos, pero ya no olían a verde sino a ceniza.
Cuando uno iba por autopista, de sur a norte (Pontevedra destino Santiago) veía cómo ardía todo. Pero claro, la autopista no te deja ver la cara del vecino, de quien ha perdido su casa y visto quemarse sus tierras. La cosa cambiaba cuando subías en tren, atravesando ciudades, campos y pueblos en la ruta, charlando con los compañeros de vagón. O más bien compartiendo consternación como si fuese algo palpable, divisible en raciones, una por casa a punto de quemarse. "Mira esa casa, a esa familia se le quema antes de que se haga de noche", "parece de noche, joder, son las 5 de la tarde y el sol no se ve por culpa del humo", "te llamo desde el tren, dicen que no saben si tendremos que bajarnos, hay fuego cerca de las vías". Ahí sí les veías las caras a los paisanos. Ahí sí los veías correr, o mirar al cielo negro con la boca abierta.
Y así, una hora y media, como una muy buena película de terror, emocionante de cojones. Lo que más oías era la palabra "noche", cuando hablaban contigo o con sus familias por teléfono. Pero no era noche lo que se veía, más bien recorríamos un ciclo de cielo azul, cielo rojizo, cielo negro, cielo azul...
Las cifras hablan por sí solas de todo lo que se quemó ese verano, no voy a mencionarlas aquí. Pero lo que las cifras no contaron es lo que iba a pasar después, durante el otoño e invierno: riadas, inundaciones, bancos marisqueros arruinados por la ceniza. El monte, que hacía las veces de freno al agua que bajaba de las cumbres, ya no estaba ahí para tamizar las lluvias.
Pero basta ya de recordar. Vamos a hablar del futuro. El futuro de los incendiarios, de los que creen que la cosa les ha salido bien. Mira, amigo pirómano, antes de empezar a quemar quizá deberías haberte acordado de a quién ibas a joder. Porque resulta que eran tus vecinos, eran sus casas las que quemaste, eran sus campos los que ardían, eran sus hijos los que corrían. Gente que te conoce y sabe lo que has hecho. Así que ahora recuerda esto: algunas personas perdonan, pero no olvidan. Cuando sea tu casa la que se queme o inunde, tus campos los que ardan y tus hijos los que corran, pide ayuda a tu vecino. Quizá tengas suerte y sea de los que olvidan. Quizá no la tengas, eso espero.
Me he acordado de este topicazo, casi tan famoso como el muñeco de luneta trasera, cuando recordaba el verano del pasado 2006. Fuego, de norte a sur, en Galicia. Había pinos, muchos, pero ya no olían a verde sino a ceniza.
Cuando uno iba por autopista, de sur a norte (Pontevedra destino Santiago) veía cómo ardía todo. Pero claro, la autopista no te deja ver la cara del vecino, de quien ha perdido su casa y visto quemarse sus tierras. La cosa cambiaba cuando subías en tren, atravesando ciudades, campos y pueblos en la ruta, charlando con los compañeros de vagón. O más bien compartiendo consternación como si fuese algo palpable, divisible en raciones, una por casa a punto de quemarse. "Mira esa casa, a esa familia se le quema antes de que se haga de noche", "parece de noche, joder, son las 5 de la tarde y el sol no se ve por culpa del humo", "te llamo desde el tren, dicen que no saben si tendremos que bajarnos, hay fuego cerca de las vías". Ahí sí les veías las caras a los paisanos. Ahí sí los veías correr, o mirar al cielo negro con la boca abierta.
Y así, una hora y media, como una muy buena película de terror, emocionante de cojones. Lo que más oías era la palabra "noche", cuando hablaban contigo o con sus familias por teléfono. Pero no era noche lo que se veía, más bien recorríamos un ciclo de cielo azul, cielo rojizo, cielo negro, cielo azul...
Las cifras hablan por sí solas de todo lo que se quemó ese verano, no voy a mencionarlas aquí. Pero lo que las cifras no contaron es lo que iba a pasar después, durante el otoño e invierno: riadas, inundaciones, bancos marisqueros arruinados por la ceniza. El monte, que hacía las veces de freno al agua que bajaba de las cumbres, ya no estaba ahí para tamizar las lluvias.
Pero basta ya de recordar. Vamos a hablar del futuro. El futuro de los incendiarios, de los que creen que la cosa les ha salido bien. Mira, amigo pirómano, antes de empezar a quemar quizá deberías haberte acordado de a quién ibas a joder. Porque resulta que eran tus vecinos, eran sus casas las que quemaste, eran sus campos los que ardían, eran sus hijos los que corrían. Gente que te conoce y sabe lo que has hecho. Así que ahora recuerda esto: algunas personas perdonan, pero no olvidan. Cuando sea tu casa la que se queme o inunde, tus campos los que ardan y tus hijos los que corran, pide ayuda a tu vecino. Quizá tengas suerte y sea de los que olvidan. Quizá no la tengas, eso espero.
Etiquetas:
desastre,
ecología,
galicia,
incendios,
medio ambiente
Suscribirse a:
Entradas (Atom)