Tutorial ANTLR y Python I. Introducción e Instalación

Tutorial ANTLR y Python:

Parte I: Introducción e Instalación.

Parte II: Creacion de una gramática sencilla.

Parte III: Creacion e implementación de un AST.

Dada la poca información que hay respecto al tema en Internet en español, me imagino que quizás por la poca apreciación que tiene la Teoría de Compiladores no sólo en mi país (Guatemala) sino en quiza toda latinoamérica. he decidido hacer un tutorial para intentar llenar ese vacio, y demostrar que existen herramientas más amistosas para generar analizadores léxico y sintácticos que la monolítica combinación FLEX/Bison, y que además, se pueden hacer en otros lenguajes que no sea el legendario C/C++.

Pero antes de esto, una introducción (rapida para no aburrir) a las herramientas.

El lenguaje Python:

Lenguaje dinámico y de scripts completamente orientado a objetos, su simplicidad se basa en las pocas construcciones de lenguaje que posee, y su poder en la capacidad de enlazarse a muchísimas librerías hechas en C, lo cual garantiza la eficiencia, además de tener una sintaxis simple, sensible a las sangrías. . Existen varias implementaciones, aunque las más populares son CPyhton (la version normal) y JPython (la que corre sobre la VM de java).

Se estará utilizando la version 2.5 de python en los ejemplos que se hagan, y para los que no esten familiarizados con el lenguaje se les recomienda el siguiente tutorial (en inglés pero muy bueno)

ANTLR:

Herramienta de generación de compiladores, es multiplataforma por estar desarrollado en Java, y es multilenguaje por tener la capacidad de generar código para la mayoría de lenguajes orientados a objetos populares actualmente, incluyendo, pero no limitándose a Java, C#, C++, Python, Ruby, Javascript, entre otros. Su método de análisis se basa en el LL(k) por lo que soporta el uso de atributos heredados. Otra característica es la facilidad para generar AST, es decir representaciones intermedias que permiten crear compiladores o intérpretes de más de una pasada. y la integración con StringTemplates para transformaciones complejas.

Se estará usando la versión 3 de ANTLR para los ejemplos que se incluyan. para más información visitar la wiki de ANTLR

Dado que este tutorial se enfocará únicamente en la combinación ANTLR/Python, para comprender mejor lo descrito a continuación, el lector deberá tener alguna familiaridad con Teoría de Compiladores (Véase el libro del Dragon), esto incluye Expresiones regulares, métodos de análisis descendente LL(k) y descendente (LA|G|S)?LR(x), también de tener experiencia en alguna otra herramienta de generación de compiladores, como YACC, y, pues un poco de conocimiento en lenguajes como c/c++, y obviamente Python no vendrían nada mal.

I. Instalación:

Prerrequisitos.

– Ubuntu GNU/Linux (en este tutorial se estará utilizando esta versión por simplicidad, aunque si se desea se puede usar cualquier otra distribución), y los repositorios adicionales (universe, multiverse, etc) correctamente configurados en el APT.

1. Instalando Java Runtime Environment 1.5 y Python de un tirón.

En este paso se instalará la plataforma Python (que por default ya viene instalada) y el JRE de Java, ya que para el funcionamiento del IDE ANTLRWorks se requiere la JRE 1.5 o mayor,
por lo que si tenemos bien configurados los repositorios, desde consola (alt+f2 gnome-terminal) escribimos…

$ sudo apt-get install python openjdk-6-jre

fig 1. Instalacoin por APT

fig 1. Instalacoin por APT

…y le decimos que SI cuando nos pregunte si en realidad se desea instalar el paquete.

2. Bajando e instalando ANTLRWorks

ANTLRWorks es un IDE multiplataforma hecho en Java para que desde ahí podamos desarrollar las gramáticas de ANTLR en una interfaz gráfica amistosa, teniendo el típico resaltado de código, visualización de la gramática de manera gráfica, generación de código, e incluso hasta debugging de la gramatica que desarrollamos. No es necesario bajar otra cosa, el ANTLRWorks trae tanto el IDE como el generador ANTLR.

Para descargar ANTLRWorks damos clic en http://www.antlr.org/download/antlrworks-1.2.3.jar. y lo colocamos en cualquier directorio (le llamare DIRECTORIO DEL IDE de aqui en adelante) (en mi caso lo guardaré en mi directorio de inicio “home” [/home/kreig/antlr] ) y ya desde ahi podemos ejecutarlo.

Descarga de ANTLRWorks

Descarga de ANTLRWorks

3. Bajando e instalando el runtime de Python para ANTLR

El runtime de ANTLR es el conjunto de clases necesarias para que nuestro código python generado por ANTLR funcione, y pueda ser incluido dentro de nuestro script.

Para esto, bajamos el Runtime

http://www.antlr.org/download/Python/antlr_python_runtime-3.1.2.tar.gz

y lo colocamos en el DIRECTORIO DEL IDE

Descomprimimos el paquete


$ cd [DIRECTORIO DEL IDE]
$ tar -xvzf antlr_python_runtime-3.1.2.tar.gz

Instalacion de runtime

Desempaquetado del runtime

y ejecutamos el instalador


$ sudo python antlr_python_runtime-3.1.2/setup.py install

Instalación del runtime de ANTLR para python

Instalación del runtime de ANTLR para python

y listo, los runtimes de ANTLR fueron instalados con exito, con estos 3 sencillos pasos tendremos ya instalado nuestro entorno de desarrollo de gramáticas con ANTLR y Python.

(Nota: En caso de que nos de errores de referencia en el codigo de que no se encuentra antlr3, sera necesario copiar el directorio antlr3 del paquete de runtime, hacia el directorio de las librerias de python. en mi caso /usr/lib/python-2.5)

En la siguiente entrega elaboraremos nuestra primer gramática con ANTLR…

Siguiente ->

Anuncios

Mis proyectos de sistemas en la USAC parte V: Compiladores 2…

Y luego de la trabada que fue Compiladores 1, Estructuras de Datos, y Organización Computacional.  se deja venir el 6to semestre con muchas más trabadas, solo que ésta vez exponenciales… y no tanto por los cursos de sistemas, sino tambien por Investigación de Operaciones… un curso en donde el que sepa llevar la subjetividad de Vinicio Monzón, el ingeniero que dá el curso, hasta en su auxiliar se puede convertir (sino vean a Patricio AKA César Rojas), pero bueno, ya mucho hablar de basura, y vamos a lo que me incumbe, publicar los proyectos del que, para muchos, es el curso más difícil de la carrera (aunque a mi me haya costado mas la investigacion de operaciones), no tanto por su contenido teórico, sino por la extensión y dificultad de sus proyectos de programación. Me refiero a Organización de Lenguajes y Compiladores 2.   Se realizaron 2 proyectos en este curso cuando lo lleve ya hace algunos años, los cuales son:

1. VMW:

Un proyecto de supuesta máquina virtual, el nombre haciendo alución al VMWare y a los autos BMW., que consiste en un generador de analizadores léxicos, junto con un generador de analizadores LALR que además debe evaluar código embebido, en un lenguaje parecido a php, el cual a la vez teníamos que interpretar con un parser hecho por nosotros mismos también, todo esto obviamente en el lenguaje JAVA con el cual la escuela de sistemas se matrimonió desde el 2006… la verdad considero que fue el proyecto más trabajoso de la carrera (dado que el que más me costó fue el 2do de estructuras, el de los grafos), y eso que fue trabajado en parejas (con mr. chucho, el cual se dedico solamente al módulo de generación de analizadores léxicos, y la GUI, de los cuales el codigo no esta disponible por sus licencias restrictivas).  Bueno, el proyecto fue publicado previamente en este blog, y está mejor descrito en el siguiente URL, desde donde se puede bajar tambien:

https://objektblog.wordpress.com/2007/07/10/proyecto-generador-de-analizadores-lalr-en-java/

2.  EvilGCC

Supuestamente las siglas significaban Erik’s Visual Intermediate Language Generator and Compiler Collection (todavia me acuerdo), y consistia en un compilador básico de 3 lenguajes de programación (Java, C++, y Pascal) a código de 3 direcciones, aunque en realidad soportaba un subconjunto muy reducido de las construcciones de éstos.  También hecho en Java bajo NetBeans.  De lo que más me acuerdo es lo asustado que estaba respecto a que también debíamos implementar un optimizador del código de 3 direcciones generado, y que al final, era la parte más facil del proyecto, haciendo verdadero el dicho que dice El que se ahueva pierda…  El código esta aquí

svn checkout http://proyectos-kreig-usac.googlecode.com/svn/trunk/java/COMPI2-PROY2-evilgcc/

Bueno, este fue el curso por los que muchos compañeros se han ido de la carrera, otros han intentado olvidar en el alcohol los traumas psicológicos que le ocasionó tanta gramática…  La verdad el mayor problema que vi yo fue el maldito JLex y Cup… habiendo tantos generadores de analizadores… por qué teniamos que usar lo peor?

PD. Para poder bajarlos, deben instalar el cliente subversion de consola en gnu/linux y ya instalado ejecutar el comando dado en el directorio donde se vaya a bajar. Tambien recomiendo usar el TortoiseSVN si van a bajarlos en Windows

Mis proyectos de sistemas en la USAC parte III: Estructuras de Datos…

Uno de los cursos más difíciles en la vieja escuela, continuación de IPC 2 en un semestre que no tenía nada de trivialidad al llevar cursos de Circuitos Digitales, y Compiladores simultáneamente con éste… y un curso que tuve que repetir en vacaciones con los proyectos ya ganados, (eso era lo bueno), y que, en la actualidad, esta mas orientado a web services y J2EE que a estructuras de datos puras. como cuando la llevé. pero bueno, hace tres años todavía teníamos que hacer Matrices Ortogonales, Árboles AVL, Hash tables, y todo tipo de estructuras desde cero, pues usar librerías como las collection de Java y las STL de C++ era un pecado para los auxiliares. En fin, de éste curso incluiré solamente 1 proyecto, el de un dizque Excel hecho en Java que utilizaria Matrices Ortogonales para manejar las celdas. y 1 práctica ratosa.

1. Proyecto ElectricSheet

Nombre basado en la canción electric Eye de Judas priest,  la verdad se trataba de una aplicación de Hojas electrónicas hechos en Java. que hace uso de la estructura de datos Matriz ortogonal, para representar las celdas del dizque excel.  Programado bajo Netbeans, y que además, ponía en práctica lo que llevaba en compiladores, al tener que implementar un mini parser hecho en JLex y Cup para interpretar las fórmulas, no era algo obligatorio, pero aproveche de una vez para aprenderlo, ya que me iba a servir en compiladores 2.  El código se encuentra hospedado en:

svn checkout http://proyectos-kreig-usac.googlecode.com/svn/trunk/java/EDD-proy1-ElectricSheet/ electricsheet

UPDATE: descargar de aqui usando git clone descrito abajo:

https://github.com/kreigiron/proy-usac/tree/master/java/EDD-proy1-ElectricSheet

2. Practica de Mapeo lexicográfico.

La verdad no es la gran cosa, solo calculaba la posición lineal de un elmento en una matriz de n x m… no me recuerdo como se usa, por lo que dejo el código hecho en C++.

svn checkout http://proyectos-kreig-usac.googlecode.com/svn/trunk/c++/EDD-mapeolex/ mapeolex

UPDATE: descargar de aqui usando git clone descrito abajo:

https://github.com/kreigiron/proy-usac/tree/master/c%2B%2B/EDD-mapeolex

Los Otros proyectos no los incluyo, pues el 2do me quedo bastante feo, y el 3ro, era un website que en realidad no era la gran cosa y dejo de existir para el bien de la humanidad.

PD. Para poder bajarlos, deben instalar el cliente subversion de consola en gnu/linux y ya instalado ejecutar el comando dado en el directorio donde se vaya a bajar. Tambien recomiendo usar el TortoiseSVN si van a bajarlos en Windows

UPDATE: Codigo disponible en github. para descargar utilizar el siguiente comando:

git clone https://github.com/kreigiron/proy-usac.git

 

Y Compiladores, para que p****?…

… Esto es lo que dice mucha gente en informatica, que estudia o estudió Ingeniería en Sistemas o Informática, o Ciencias de la Computacion, o como quiera llamarle, tiene cierto odio/resentimiento/ahuevamiento con ciertos cursos como Estructuras de Datos, Administracion de Archivos, y en general aquellos que están directamente relacionados con la ciencia computacional.

Sin embargo, de todos estos cursos, los que están a la cabeza son definitavemente los cursos relacionados Teoría de Compiladores, al cual mucha gente califica como  “Inaplicables”, “Inservibles”, “basura”, “m**rda” y va en descenso… Sobre todo en países como los nuestros, con sus problemas económicos, que no  invierten casi nada en Investigación y Desarrollo, haciendo que los cursos de Compiladores queden siempre a la cabeza de los listados de las encuestas de “cursos que se deberían eliminar de la carrera”.

Desafortunadamente, yo soy uno de esos pocos freaks a los que si les gusta esos temas, mi pasíon por ésta teoria de compiladores nació desde que conocí el curso de Lenguajes Formales y Autómatas (en realidad no le pongo el nombre actual que le dan en mi universidad por que suena muy estúpido), el cual se puede decir que es un curso introductorio a compiladores (Compiladores 0 como le suelo decir), y desde ahí me gusto la idea de transformar algo tan natural como el lenguaje humano a una serie de instrucciones capaces de ser interpretadas por el ordenador.

Me pareció bastante interesante,  que en el lugar donde laboro actualmente, se me asignó un proyecto ya hace algunos meses, en donde, se requiere el manejo de ciertas fórmulas para calcular el precio de energía de ciertas cosas segun cierta condicion.  Lo interesante es que estas fórmulas, obviamente, estarán persistidas en una base de datos de dudosa estabilidad (no digo la marca pero ya se imaginarán cual és, y lamentablemente sobre esa trabajamos), en formato varchar, o sea puro texto.

Ahí es donde viene lo bueno, toca crear algún tipo “intérprete” para las mismas, ya que, aunque va a tener un conjunto de sentencias y expresiones bastante sencillas, me niego a hacerlas “a pie” por tres puntos:

  1. Suponiendo que las tenga que hacer a pié, tendría que hacer un analizador tanto léxico como sintáctico “a pié”. algo no factible tanto por cuestion de tiempo como por cuestion de numero de “bugs” lo cual seguramente muchos que estudien en otras universades hubieran hecho “a pie”.
  2. A lo anterior, se agrega que existen muchas herramientas de análisis léxico y sintáctico bastante buenas (no solo la basura de “jlex” y “cup” que tanto alardean actualmente en mi universidad). los cuales con simplemente escribir una gramática y un conjunto de expresiones regulares, así como sus respectivas acciones semánticas para cada una de éstas, se puede desarrollar intérpretes de una manera bastante sencilla y rápida.
  3. Y la mas importante… Si recibí 2 benditos cursos de compiladores en la universidad. por que no poner en práctica lo aprendido?  Seria una gran estupidez no aprovechar la oportunidad de aplicar lo aprendido en los que quizá sean los cursos más dificultosos de la carrera (aunque desde mi punto de vista hay otros cursos peores, pero por culpa de la falta de profesionalismo de quienes las imparten).

La tarea no iba a ser facil, pues la plataforma sobre la que debería correr era .NET, y aunque existen diversas opciones para generación de compiladores bajo esta plataforma, en mi evaluación me dí cuenta que ninguna se ajustaba mejor que ANTLR.  Por qué tome esta decisión?

  1. Es software libre, con lo cual estoy seguro, que gracias a su licencia, lo generado lo voy a poder redistribuir en la implementación de mi intérprete para el producto que se va a vender.
  2. Es portable, el generador está desarrollado en Java, por lo cual se puede generar código desde cualquier plataforma compatible con la JVM.
  3. Es multilenguaje y orientado a objetos. Es decir, puede generar código para una gran cantidad de lenguajes orientados a objetos (Java, Python, Ruby, C++, C#, etc) y como la plataforma “destino” iba a ser .net, era necesario una herramienta que respetase este paradigma.
  4. es sencillo. Pues en el mismo archivo se define tanto el lexer como el parser, enlazándolos de una manera transparente. Eliminando aquella necesidad que con herramientas como Yacc y Lex de tener que interfazar ambos analizadores.
  5. Es eficiente. Gracias a que las gramáticas que escribimos en éste deben ser LLk compatibles, permite generar codigo bastante eficiente por su naturaleza descendente.
  6. Incluye un IDE para el desarrollo de gramáticas bastante bueno.
  7. Y algo mas avanzado, Genera Arboles de Sintaxis Abstracta (AST por sus siglas en ingles) on the fly.

En conclusión este post es para demostrar que, quien haya pensado que toda la teoría de compiladores que le fue impartida en la Universidad no iba a tener aplicación, esta equivocado, eventualmente pueden venir proyectos en donde se requiera el uso de lo aprendido en éstos. Esto es uno de los detalles que nos aventajan de los demás.

Que seria de este mundo si… Microsoft no existiera?

Bueno, con este post doy inicio a una serie de post llamados “Que seria de este mundo si…” en donde trataré de exponer un mundo ficticio en donde cierto tópico, cierto concepto, existente e importante en el mundo actual, no existiese, tanto desde un punto de vista global como personal. Doy inicio con algo que muchos de nosotros desearíamos desde dentro, que Microsoft nunca hubiese existido.

Y por qué me planteo esta pregunta? pues simplemente se me ocurrio en mis horas felices en el baño, al reflexionar sobre unos bugs tan oscuros que me esta dando el contubernio infernal “.NET/SQLServer 2005” en el trabajo, donde pude constatar la mierda de producto que es, sin embargo, en este post trataré de ser mas objetivo, y trataré de mostrar que aunque el mundo no es el mejor con microsoft a la cabeza, quiza sin este, seria mucho peor…

Echemos a volar la imaginacion… Iniciemos con un evento ficticio, La madre de Bill Gates decide abortar… Bueno, todavia tenemos a Ballmer y Wozniak, aunque estos deciden tomar un rumbo diferente, quiza dedicarse a zapateros. Con esto, nos situamos temporalmente en los años ochenta, Sin Microsoft, IBM nunca compra el DOS para su IBM-PC, con esto tenemos ya el primer cambio. Las IBM-PC compatibles jamás estarían atadas a los sistemas operativos Microsoft… Como sería el avance de la informática sin ese factor? Analicemos… por lo tanto puedo decir Adios MS-DOS

Por su parte IBM, decide entonces comprar algun otro sistema operativo, quiza adaptar algun Unix a su plataforma, sin embargo, las IBM-PC, que han sido “intel inside” desde un principio… con estos cambios, quiza en ese universo paralelo habría existido alguna posibilidad de que tambien se rompiera ese contubernio “x86-ibm-pc-compatible” con la sola inexistencia de microsoft? (en Ensambladores hubiera aprendido otro dialecto diferente al x86 que actualmente se da) con esto se rompe el dominio de Intel. el duo WinTel no se hubiera dado Adios Core 2!

Llendo por otro lado en este universo alterno, el competidor directo. Apple, tendría los mayores beneficios, contando de que poseería el sistema operativo más adecuado y amigable para el usuario final, pues aunque los Unix son muy buenos, en esas epocas no habian sido lo bastante amigables para el usuario común, un mercado a las que las IBM-PC estaban enfocadas desde sus inicios. Dominando de esta manera Apple el mercado Desktop desde ese momento, no sólo con su SOFWARE PROPIETARIO como tambien con su HARDWARE PROPIETARIO, y a precios bastante elevados… lo cual quizá estaría peor a que en la realidad sucede, quizá, como Compaq en las IBM-PC, alguien se hubiera animado a hacer clones MAC, pero seguro, hubieran sido muy costosas…. Adios Hardware compatible y Clones!

Mencionando Windows, pieza clave para Microsoft, En esa realidad alterna nunca hubiera existido, y como dije antes, la interfaz de las Desktop estarian dominados por las MAC. Y que de las workstation?, pues, mas de alguien se le hubiera ocurrido diseñar algun GUI para (X consortium?). Eso si basándose más directamente en elementos de GUI MAC que en las Windows (Adios elementos como, Menu Inicio, Taskbar, etc), pero bueno, seguro alguien se hubiera inventado alguna alternativa mejor para todos estos elementos.

Además, Quizá MAC nunca hubiera dado el paso a fundar el kernel de MacOSX sobre un BSD, ni mucho menos cambiar de arquitectura PowerPC a x86 simplemente por que no se vería en la necesidad competitiva de hacerlo. Adios MacOSX.

pero… Y que cambiaria en la Web? Desde un inicio, la web fue desarrollada por un grupo independiente, iniciando por la infraestructura de redes, Microsoft en realidad ni siquiera quería adoptar el modelo TCP/IP, por lo que muchos estándares impulsados por organizaciones independientes como la WWW consortium y la IEEE, seguirían su rumbo, desarrollandose la web de una manera natural. Igual, Mosaic hubiera sido desplazado por Netscape, y pues Netscape… sin Internet Explorer, dominaría el mercado, FIREFOX NO EXISTIRIA, pues, es bien sabido que la fundación Mozilla nació cuando Netscape vio la batalla perdida ante Internet Explorer, pues sin la existencia de Microsoft, seguro Netscape jamas hubiera liberado el código de su navegador. Adios Firefox.

Y hablando de internet.. conoceríamos los virus sin microsoft? de seguro, la diferencia es los sistemas Unix y Mac serían más propensos a estos ataques.

Continuando con los temas de Internet… Teniendo Netscape dominando el mercado, y siendo ellos los impulsores del Ecmascript (actualmente Javascript), seguro Javascript existiría, pero que hay de AJAX? quiza no… al menos en la manera en que lo conocemos… por que? Hay dos grandes razones para eso… una es XML, y dos, la funcion clave de AJAX para obtener un request XML asincrono. La primer razon, es porque el XML en sus inicios fue un estándar impulsado por las megacorporaciones de informática, entre ellas, nada mas y nada menos que Microsoft, por allá al finales de los 90s.

Ahora, sobre si la funcion de request asíncrono, ésta, nació a partir de un control ActiveX, para Internet Explorer usando JScript. Sin ésta, seguro javascript hubiera adoptado un modelo diferente. Sin ajax a la vista, quizá el mundo estaría (aún mas) dominado por otros estándares de facto para la interactividad web, como Flash, Adios XML, Webservices, AJAX, Web 2.0, y adios.. todo lo relacionado con XML (al menos en la forma actual).

Y ya que hablamos de desarrollo de software, Seguramente, sin .NET, Java dominaría el mercado aún mas, y, al igual que Microsoft, Sun Microsystem sería también un monopolio, Muchas de las mejoras hechas actualmente a los APIs de Java no existirían (como JFS, o JavaFX, la cual su desarrollo fue claramente impulsado por la sencilles que representaba programar en asp.NET y WPF respectivamente), así como la liberación de fuentes de Java tampoco.

Y bueno un tema que tenia que tocar… Qué seria de Linux* sin esto? Sabemos que lo que (a todos) impulsó a que el movimiento del software Libre creciera en los años 90s y 20xx, aparte de la curiosidad de ver como funcionan las cosas, fue la necesidad de liberarse de los estúpidos bugs de los sistemas Microsoft, y los riesgos de seguridad que estos conllevan. Hubiera Linux* tenido el mismo impulso, siendo mas específicos… hubiera existido grandes proyectos como KDE o Gnome como las intefaces más amigables en los sistemas GNU/Unix en general?

Seguramente los cambios no serían hasta ahi, sino también en toda la infraestructura multimedia, quizá SDL + OpenGL tendría el espacio que ocupa actualmente DirectX en APIS para desarrollo de juegos comerciales. haciéndolos más portables que usando las APIs propietarias de Microsoft. Esto si sería una mejora.

Otra cosa, muchos de nosotros, por más FOSSeros que seamos, nuestros inicios se remontan a sistemas Microsoft, tal es mi caso, ya que mi primer plataforma de programación fue Windows ejecutando mis primeros algoritmos Javascript sobre Internet Explorer 3. Quizá mis primeros contactos con la programación de sofware hubiera sido de una manera diferente, o talvez, hasta hubiera elegido otra carrera (historia quizá?), de tal manera que ni este blog fuera lo mismo.ya que seguramente tendria post relacionados con la Conquista, o la civilización Maya, en vez de hablar de Software.

Y pues estos son algunas cuestiones que se me ocurrieron en este mundo alterno sin microsoft. Estamos mejor o estamos peor?

* Cuando digo Linux no incluyo el sistema GNU, pues estoy seguro que GNU hubiera seguido su curso por aparte,

Entonces… qué ha hecho el software libre por nosotros?

ya sea por conveniencia o por ignorancia, ésta es una pregunta que quizá se haya hecho mucha gente que ve atemorizada cómo este modo de desarrollo de software ha crecido exponencialmente en los últimos años gracias a su naturaleza colaborativa, intentando atacar y defender a su software propietario simplemente por que no saben usarlo. Pues para todos aquellos que están renuentes a reconocer los grandes cambios que el software libre ha hecho en el mundo, aquí presento una lista de razones por qué el mundo es diferente desde la existencia de esta ideología.

Basta con ver que la gran parte de software “significativo” de software, proyectos importantes de tiempo real, sistemas operativos, y la mayoria del software que mantienen vivo el mundo, e incluso juegos de video, está compilado usando GCC y enlazados al conjunto de librerías GLIBC, convirtiéndolo en quiza el compilador más usado del planeta, no solo por su gran eficiencia o su arquitectura, sino también por su flexibilidad entre plataformas, permitiendo la interoperabilidad entre diferentes plataformas con leves cambios de código, usando el mismo lenguaje. Ésto señores si es multiplataforma.

Este compilador es la base para que grandes proyectos como el Kernel de LINUX, se volvieran una realidad, y se materializara uno de los cambios más importantes dentro del movimiento libre… darle un Kernel al conjunto de utilidades y librerías GNU, convirtiéndose más tarde en lo que conocemos como GNU/Linux y toda la revolución estuviera por iniciar… hasta la actualidad, donde el superordenador más poderoso del mundo, el BlueGene de IBM, de cientos de teraflops, se ejecuta nada mas y nada menos que en el sistema operativo libre de preferencia, apto para mantener vivo este supercluster. Incluso Motivando a empresas manufacturadoras de Sistemas Operativos Propietarios a cambiar la arquitectura de sus kernels para sus versiones recien cocinadas del 2008 para poder hacerle frente a la estabilidad y escalabilidad que GNU/Linux y los diferentes BSD han dado durante años.

Incluso no hay que ir tan lejos, basta con recordar también el Kernel del sistema operativo más usable y amigable. MacOS X, el cual, con su apariencia reluciente, no es nada más que un shell gráfico sentado sobre una plataforma estable llamada Darwin, y como no es de extrañarse por las descripciones anteriores, es software libre compilado con software libre. Y yendo un poco más abajo… vemos ademas a Motorola más frecuentemente produciendo teléfonos de calidad, y reduciendo costos de desarrollo, y por ende bajando precios al consumidor, al utilizar un sistema operativo muy famoso que tiene de mascota a un pingüino.

Google no hubiera sido tan exitosa (y quizá no existiera) sin software libre, así como el internet actual no sería lo mismo sin Google, quienes supieron sacarle el jugo a las capacidades de “crecimiento horizontal” que el software libre permite hacer al crear superclusters y lograr reducir los costos de procesamiento para una exitosa implementación de sus algoritmos de búsqueda distribuida.

Incluso, otro proyecto clave para el crecimiento de Internet ha sido LAMP, en donde un gran porcentaje de software “Web 2.0” se ejecutan en este tipo de herramientas, el cual, también estoy seguro que el internet no sería el mismo sin LAMP así como este mundo actual no sería el mismo sin internet… o será en vano que Sun Microsystems recientemente adquiriera MySQL para mejorar su interoperabilidad con Java, tambien recientemente liberado?

Con estos pocos ejemplos vemos que el software libre no son solamente ideales, es mejora continua para producir software de calidad… y continua en crecimiento.

JAVAizando sistemas de la USAC.

Una de las cosas por las que la gloriosa y tricentenaria Universidad de San Carlos de Guatemala se ha dado a conocer a nivel nacional, por ser una de las universidades en donde ganar los cursos es un sacrificio sinigual, Decir que alguien se graduó de la USAC muchas veces significa que es una persona que ha superado etapas de burocracia, catedráticos trabadores, y sobre todo, muchos desvelos. Y qué decir del prestigio de salir de Ing. en Ciencias y Sistemas, una de las carreras que por mucho tiempo fue considerada como la más desafiante dentro de la USAC. Ahh un gran sacrificio, mas por los 80s; sin Internet, ni wikipedia, ni Sourceforge, sin Amarok o Winamp y obvio sin mp3 de Kreator que escuchar para una mayor iluminación de algoritmos, etc…, y con una gran carga algorítmica dada en los cursos científicos computacionales y que había que desarrollar e investigar en bibliotecas convencionales.

Sin embargo todo esto ha ido cambiando, y desde el 2005, desde que entro el dizque decano Paiz, y su equipo de trabajo, específicamenteel Ing. Mazariegos, ex director de la Escuela de Sistemas, quien propuso al inicio de su gestión, “cambios” que supuestamente beneficiarían al estudiantado. Estos cambios fueron fundamentados en la necesidad de renovación de enseñanza en la carrera, que según él, eran más aplicables, llevaron a convertir esta carrera de alta demanda en Guatemala, en algo asi como una carrera enfocada más en tecnologías cortoplazistas y triviales, removiendo todo rastro de ciencia que tenía la carrera, y convirtiéndolo en J2EE, etc, una tecnología que si bien los conocimientos de ésta tienen alta demanda en el mercado, todos sabemos muy bien que el mundo tecnológico cambia a un ritmo acelerado, y lo que hoy es tecnología de punta, mañana es tecnología inservible, e inútil. y Java no va a ser la excepción.

Hasta donde yo se el nombre de la carrera es “Ingeniería en Ciencias y Sistemas”, mas no “Ingeniería en Java y Paradigmas Tecnológicos Actuales de Sistemas”, ya que pareciese que se removió cualquier rastro de ciencia que quedaban en cursos de 3er semestre al 6to, Convirtiendo los contenidos de cursos tan importantes como Estructuras de Datos, de Arboles B a Web Services e i18n en Java, y a la masterización de herramientas como NetBeans y JDeveloper…

El problema ha llegado a tal extremo que la pobre generación que comenzó Programación 1 en el 2do semestre de 2005 no sabe ni siquiera el concepto de puntero en C/C++, mucho menos van a saber la implementación óptima de un arbol B en C/C++, o de un Arbol de Sintaxis Abstracta, muy útil para los cursos de Compiladores, que afortunadamente siguen sin cambio en sus temas titulares y el contenido se sigue basando en el Libro del Dragon sin embargo…

A esto viene la siguiente pregunta: Cuando se ha visto que un compilador este hecho en una plataforma tan ineficiente sobre Java??? pues señoras y señores, esto es lo que se está haciendo en los laboratorios de Compiladores 1 y 2, imponer el uso de herramientas tan ineficientes como JLex y Cup y crear un intérprete o compilador en lenguaje Java que se ejecute ineficientemente sobre la JVM…

Para muestra un boton, el proyecto publicado en este blog esta hecho en Java, con una ineficiencia enorme, y no tanto por culpa del programador(o sea yo ;-)), sino de la plataforma Java y su JVM, Esa ineficiencia se hubiera minimizado si se hubiese hecho en un lenguaje igual de portable, e incluso soportando más plataformas de hardware/software que el mismo Java como C/C++ bajo GCC usando Flex y Bison o ANTLR(y si no me creen lo de la portabilidad, dos preguntas sencillas… Con que lenguaje está hecho y bajo que esta compilado el kernel de Linux?? en C bajo GCC obviamente, y en cuantas plataformas de Hardware se ejecuta?? Muchísimas, incluyendo teléfonos móviles…), por lo que la excusa de la portabilidad era el motivo para el uso excesivo de Java en los cursos de programación en la Escuela, con el anterior argumento se acabó.

Y no es que esté en contra de tecnologías y paradigmas como J2EE, .NET, , ni de lenguajes como Java o C# o tendencias como Web Services o i18n, Se que con ellas se pueden realizar muy buenas aplicaciones con el mínimo de esfuerzo, y reconozco que estas tecnologías se tienen que seguir impartiendo, sin embargo como temas de laboratorio, no de la clase titular. De lo que sí estoy en contra es de la sustitución de la base científica fundamental por éstas, que bien se sabe que lo que es ciencia, perdura por los siglos de los siglos.

Afortunadamente yo todavía tuve la oportunidad de ser la última generación en aprender lo que quedaba de Ciencia de la computación… ya que gracias a este background científico, aprender nuevas tendencias como Ajax, Ruby on Rails, J2EE, se hace mucho mas sencillo, y el cambio de paradigma menos costoso y doloroso… a que si le ponen a un alumno carnet 2005 a que les desarrolle un sistema de archivos para una base de datos usando Árboles B+ bajo C++. Que las cosas buenas continúen, y la ciencia computacional regrese a donde debe estar, he dicho.