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

 

Mis proyectos de sistemas en la USAC parte II: Progra 2…

Bueno, luego del exitoso post anterior (de donde jodidos), tambien he publicado los proyectos desarrollados en el curso de Introducción a la Programación 2… en un semestre donde se comenzaban a complicar las cosas pues habia que llevar varios cursos no triviales como Fisica 2 o Lenguajes formales.  La progra 2 de aquellos tiempos era un poco diferente a la de ahora, pues antes se daba solamente temas de persistencia en archivos, OOP,   Memoria dinámica (punteros, listas y todo eso), un poco de análisis y diseño (unico tema que persistió en la progra 2 de ahora), y conceptos básicos de redes… y lo que se programaba se hacia en C ++.

Y aunque seguían con su necedad de obligarnos a programar en el asquerosisimo borland C++, me importó un comino y empecé a hacerlo en un compilador mucho más superior y que cumple estándares… GCC, desarrollandolos dentro de algo que es más que un IDE… EMACS, y sobre un sistema operativo tambien superior, Linux. además que daba primera vez uso de un sistema básico de versionamiento, el CVS.  Y para cuando tenian que calificarmelo en windows que hacia? pues como los proyectos eran básicamente en consola, no me costo mucho portarlos a Windows usando el compilador MingW.  Bueno, a continuación un trio de proyectos inútiles cuya única finalidad era didáctica (bueno, quiza tambien tenia de finalidad trabarnos, pero al menos no lo lograron conmigo):

1. FIRST (FIfa Rating SysTem)

Continúan los nombres estúpidos, para un proyecto tambien estúpido, supuestamente era un calculador de posiciones y punteos para torneos de la FIFA,  lo más difícil era entenderle bien la ambiguedad del enunciado que la mera programación en sí.  Éste proyecto tenía que hacer uso de archivos no recuerdo para qué, pero lo que si recuerdo es que sacaba estadísticas.

svn checkout  http://proyectos-kreig-usac.googlecode.com/svn/trunk/c++/IPC2-proy1/ first

2. MOTHELL:

Este supuestamente era una administración de hoteleria o algo así, en donde se debía poner en práctica los conceptos de OOP que supuestamente habian enseñado.  Tiene estructura parecida al anterior, pues fue hecho por el mismo mortal con las mismas herramientas… ahh, e incluye su Makefile para una facil compilacion.

svn checkout http://proyectos-kreig-usac.googlecode.com/svn/trunk/c++/IPC2-proy2/src/ mothell

3.  Libra:

El último y más trabajoso proyecto (aunque la verdad estaba bastante facil) que consiste en Mantenimientos para libros de una biblioteca, administrando también préstamos y todo es en colas. En éste se tendría que utilizar ya estructuras de memoria dinámicas como pilas, listas y colas, y además, usar full OOP.  Aqui empezaba a meter mano a los TDAs, además de usar la característica de Templates de C++ para no andar reescribiendo un TDA para cada tipo de dato. Compila bajo GCC e incluye makefile tambien.

svn checkout http://proyectos-kreig-usac.googlecode.com/svn/trunk/c++/IPC2-proy3/ libra

Bueno, esto fue IPC2, un curso “comodín” en donde metían cualquier tema que les diera la gana dar.  con proyectos que quizá eran los más fáciles de la carrera media vez se dominara de antemano la OOP (algo dificil para la mayoria, dado que se aprendia en progra 1 en el paradigma top down)…

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

Sin miedo a la libertad…

Esta semana ocurrieron una serie de sucesos interesantes en la universidad, uno de ellos es que despues de una semana de congresos en la que toda el área profesional se vió obligada a no asistir a clases, todo regreso a una supuesta normalidad.

Supuesta, por que a mediado de la semana, ocurren dos de los sucesos que mencionaba arriba, el primero es que por causas “privatizadoras” deciden suspender de nuevo las actividades académicas en toda la universidad, supuestamente reanudandolas el domingo 12… pero, salvo unos pocos individuos, casi nadie estudia el domingo…

El otro evento fue un encuentro que me tomó de sorpresa, pues nunca estoy enterado de las actividades que se realizan en el campus. ésta es el foro social de las américas, en donde toda la gloriosa universidad se convirtió en un desfíle de colores, sirviendo como punto de encuentro entre mucha gente de muchas nacionalidades, a pesar de la suspension de clases.

Estos encuentros siempre son buenos, pues promueven el encuentro de diversas culturas a nivel continental. y por ende, resulta en diversas actividades en donde se realiza intercambio de conocimientos entre los individuos. Uno de éstos, y que tuve oportunidad de asistir, fue el Freedom Not Fear Day, el cual, como su nombre lo indica, se trató de software libre.

panfleto Freedom not Fear

panfleto Freedom not Fear

Lo interesante de este encuentro fue que, aparte de ser personajes de diversas nacionalidades, eran personajes de diversas profesiones, dando diferente enfoque a las tecnologías libres según su ramo.  De lo más interesante que puedo reseñar en ese evento fue que presencié el OLPC que tanto había oido hablar desde hace mucho tiempo. la verdad me parecio un artilugio bastante bueno por sus capacidades y adecuado hacia el público que está enfocado.  Y a la vez, este aparato sirvió como punto de discusión entre Heinz (al cual por su apariencia y filosofía lo apodé Stallman Argentino) y la persona que llevaba a promocionar el OLPC (un gringo del cual no me recuerdo el nombre, pero hablaba bien el español, incluso mejor que yo).

Estuvo bastante bien el evento, sin embargo, como era de esperarse, y por los diferentes profesionales que estaban involucrados (muchos de ellos relacionados con ciencias sociales y políticas), tocaron un punto que prefiero evitar, la mezcla entre software libre y política…. algo que no me parece adecuado, y tuve que largarme del lugar lo antes posible. pero en fin, siempre es enriquecedor escuchar opiniones de gente de otras ramas hablando del modelo que está moviendo masas. el modelo de libertad.

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.