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.

Computación Cuántica: Un nuevo reto para Sistemas en la USAC y demas paises en vias de desarrollo…

Sabemos muy bien lo que es la computación digital, nos hemos aprovechado de sus virtudes, así como tambien nos hemos quejado de sus deficiencias. Nos ha permitido por mucho tiempo cumplir con una gran parte de los sueños de la humanidad que jamás nos imaginábamos resolver, ha creado soluciones, así como problemas (mas soluciones que problemas diría yo), así como tambien nos ha servido para distanciarnos cada vez mas del mundo real, y modelarlo y abstraerlo a un sistema computacional lo mas preciso posible. Sin embargo todavía falta mucho por abstraer y más precisión por dar para este mundo caótico en el que vivimos, muchos problemas no han podido ser resueltos por los sistemas computacionales actuales, así como muchos sistemas naturales y sociales no han podido ser modelados correctamente en éstos sistemas digitales para su posterior simulacion. Sabemos muy bien que hasta que no se construya una máquina completa en Turing, no se podrán resolver…

Sin embargo nos encontramos en una etapa muy cercana actualmente, con el desarrollo de la Computación Cuántica, el cual es un conjunto de teorías revolucionarias basadas en la física cuántica y en el análisis de probabilidades, que permitirá construir lo más cercano a una máquina de Turing; Una emulación de una maquina de Turing probabilística, para poder resolver muchos problemas de índole probabilístico y contínuo, que no se pueden resuelven o tomaría bastantes años de cálculo con la computación digital actual , estrictamente discreta que se limita a darnos un 0 o un 1. lo que provoca la alta complejidad temporal de algoritmos para su implementacion en sistemas digitales actuales.

Todo esto me vino a la mente, debido a que hace poco estuve leyendo el libro “Introduction to Quantum Computing” (Phillip Kaye et al,2007), y se necesita tener claro una la gran cantidad de conceptos matemáticos y físicos como producto de tensores, descomposición de Schmidt, teletransportacion cuántica etc, que se necesita para poder entender a fondo los principios fundamentales de la computación cuántica. Sin embargo no debemos olvidar algo… somos ingenieros y no científicos, pero para poder darle aplicación a lo que los científicos generan, necesitamos al menos las bases más fundamentales de la ciencia (Aquí una de las razones de por que llevamos mas de 9 cursos de matemática en la carrera).

El problema que veo ahora es… ¿qué tanto estamos preparados nosotros los futuros ingenieros en CIENCIAS y sistemas de la USAC como los ya graduados, para este gran cambio de paradigma? ¿Que tan preparados académicamente están los docentes de las diferentes áreas para impartir las bases para los anteriores conceptos científicos? ¿será que nos están preparando adecuadamente, o tan siquiera avisando en los cursos tanto de Ciencia Básico como los de Ciencia computacional para poder acoplarnos al cambio? Obviamente, hemos aprendido a ser bastante autodidactas durante toda la carrera, sin embargo, ¿Consideramos estaremos listos para cambiar el enfoque?(el cual podría incluso requerir entrarle a la mecánica cuantica, etc) He aquí uno de los razones por lo que estoy de acuerdo en el refuerzo a la enseñanza en la ciencias básicas y computacionales en la USAC, pues las fuertes bases científicas permiten una transición mas sencilla hacia las nuevas tendencias. Así que, estemos al tanto de las posibles corrientes futuras, por que camarón que se duerme… se cambia a Ingeniería Industrial!

para mas información acerca de Computación Cuántica: http://en.wikipedia.org/wiki/Quantum_Computing