Gran parte de los contenidos de estas páginas pueden ser interesantes para las personas que estudian esta materia (y en particular, mis alumnos).
Lista de distribución eside-compiladores
Una implementación del algoritmo LR(1) en Java
Especificación de la máquina UDMC02
En este primer apartado se recogen informaciones que pueden ser importantes durante el desarrollo de las asignaturas de Compiladores o, más recientemente, Procesadores de Lenguajes.
[2015-02-15]
Hemos preparado una nueva versión, la 1.3, del intérprete de máquina de pila UDMPs99. Se sigue distribuyendo con la GPL3, desde luego. No hay cambios radicales, así que todos los programas de máquina de pila correctos que funcionasen hasta ahora deberían ejecutarse exactamente igual:
Se han añadido códigos alfabéticos para todas las instrucciones, aunque los códigos no alfabéticos existentes hasta ahora siguen valiendo. Se recomienda a partir de ahora el uso de los primeros sobre los segundos, sobre todo en el contexto de procesamiento de lenguajes.
Se ha mejorado el tratamiento de las opciones del intérprete, y en particular, la generación del archivo de entrada/salida es ahora opcional.
Se han corregido algunas cuestiones en la detección de errores de los programas de máquina de pila, que hacían que se admitieran como válidos programas incorrectos.
Finalmente, se han añadido algunos programas adicionales de prueba.
En la distribución de esta versión, solo se aporta el ejecutable precompilado para GNU/Linux32, pero se supone que puede compilarse para otras plataformas, tanto de 32 como de 64 bits.
Puedes descargar la distribución de la versión 1.3ß 20150215:
que contiene el código fuente, el ejecutable precompilado para GNU/Linux32, ejemplos de prueba, la documentación (referencia de la máquina de pila UDMPs99) y el archivo README, donde aparecen instrucciones adicionales para la reconstrucción en estos u otros sistemas y máquinas.
Como dicen los anteriores documentos, y no es una frase hecha, este trabajo no hubiera sido posible, ni en su momento ni ahora que se ha re-elaborado, sin la ayuda de un numeroso grupo de estudiantes, cuyos nombres incluimos aquí también como sincero agradecimiento: Jesús Redrado, Jorge García, Ana Cabana, Sergio Argüello, David Vázquez, Igor Ruiz, David Ausín, Endika Gutiérrez, Luis Rodríguez. A todos ellos, muchas gracias.
[2011-03-18]
Hemos conseguido preparar algo que ya debimos realizar hace bastantes años, pero lo vas dejando, lo vas dejando... Tenemos una versión de software libre (GPL) del intérprete de máquina de pila UDMPs99 que definimos Andoni Eguíluz y yo hace la friolera de... bueno, ¿para qué entrar en detalles? Aviso de que todavía tiene varios errores constatados, pero en teoría no deberían surgir esos errores con los programas sencillos que hay que probar en las actuales actividades prácticas de Compiladores II. A cambio, creemos que compila (es C++) y funciona perfectamente tanto en GNU/Linux como en versiones modernas de MS-Windows, incluyendo 64 bits.
Puedes descargar la distribución de la versión 1.1ß 20110318:
que contiene el código fuente, ejecutables precompilados para Win32, Win64 y GNU/Linux32, ejemplos de prueba, la documentación (referencia de la máquina de pila UDMPs99) y el archivo README, donde aparecen instrucciones adicionales para la reconstrucción en estos u otros sistemas y máquinas.
Como dicen los anteriores documentos, y no es una frase hecha, este trabajo no hubiera sido posible, ni en su momento ni ahora que se ha re-elaborado, sin la ayuda de un numeroso grupo de estudiantes, cuyos nombres incluimos aquí también como sincero agradecimiento: Jesús Redrado, Jorge García, Ana Cabana, Sergio Argüello, David Vázquez, Igor Ruiz, David Ausín, Endika Gutiérrez, Luis Rodríguez. A todos ellos, muchas gracias.
[2006-02-21]
Se han preparado dos anexos impresos y un gran conjunto de programas en lenguaje C (usando en particular flex) como material adicional al capítulo 2 (generación de código intermedio) de Compiladores II.
Si eres estudiante de esta asignatura, creo que será conveniente que les eches un vistazo, porque aparte del mero hecho de ver en vivo el funcionamiento de un pequeño compilador, este curso 2005-2006 la solución del problema de máquina de pila se hará en lenguaje C (en lugar del tradicional Pascal), siguiendo la estructura marcada por estos programas que proporciono.
Como aperitivo, la versión previa del programa de traducción de expresiones en notación infija a la notación posfija (con análisis sintáctico descendente recursivo); esta versión solamente se necesita para empezar a entender el problema, y enseguida la descartaremos:
Con los motores ya a pleno rendimiento, pasamos a las versiones definitivas del programa anterior, de traducción de infija a posfija, que serán las que proporcionen la estructura final en la que se basa el resto del capítulo:
El paquete anterior contiene dos directorios; el llamado "rec" sigue haciendo análisis sintáctico descendente recursivo, mientras que la novedad es que el directorio "iter" presenta la implementación del análisis sintáctico descendente iterativo. El documento PDF incluido contiene un listado de todos los programas.
Se supone que la tarea del estudiante será rellenar el programa principal con las acciones semánticas necesarias para terminar el proceso de traducción de infija a posfija.
Para acabar, una bomba. Se ha definido un lenguaje de programación (muy sencillo, evidentemente), denominado JKL, y se ha construido, como en los casos anteriores, el esqueleto básico de análisis léxico y sintáctico descendente (esta vez, solo en la implementación iterativa):
Está incluido en el paquete anterior el documento PDF con la referencia del lenguaje JKL, con dos ejemplos y la especificación del análisis sintáctico descendente.
El objetivo es añadir las acciones necesarias para generar código de máquina de pila UDMPs99. El programa que se distribuye ya incluye algunas acciones básicas, que corresponden a la estructura principal de un programa UDMPs99 y que no deberían modificarse. Se supone que los programas generados pueden entonces ejecutarse con el intérprete de UDMPs99 (que de momento no puedo distribuir, tendrás que obtenerlo del repositorio interno de la asignatura).
Los programas se han desarrollado con ayuda de DJGPP, la distribución para Win32 del sistema de desarrollo de GNU (se usan flex y gcc primordialmente). De nuevo, en la página de herramientas tienes indicaciones sobre esta distribución, sobre GNU, etc.
[2003-03-14]
Se han preparado dos anexos como documentación adicional al capítulo 8 (último) de Compiladores II. El primero no tiene mayor relevancia, simplemente muestra la manera en que genera código un conocido entorno de desarrollo de C/C++, lo que permite comprobar las ideas que se ven en clase.
Por contra, el segundo anexo, titulado Especificación de la máquina UDMC02, es muy importante para ese capítulo 8, porque recoge una definición formal del código máquina que hasta ahora se venía usando en clase. Ese código no es el que aparece originalmente en los apuntes, y además, al formalizar su definición en ese documento, se han hecho ligeros cambios a lo que se venía utilizando en la asignatura los últimos años.
Por esa razón, resulta totalmente necesario que dispongas de él, porque será ese código el que se use en clase, y por supuesto, en el ejercicio correspondiente del examen. Si conoces a algún alumno de la asignatura que no acuda habitualmente a clase por ser repetidor u otra razón, le harás un favor si le avisas de este tema.
Los dos anexos se han dejado ya en formato impreso en el Servicio de Fotocopias de la Universidad. En el caso del segundo, por su importancia, he preparado una versión online del mismo:
Especificación de la máquina UDMC02
Atención: he intentado seguir los estándares actuales de marcado y hojas de estilo en la medida de lo posible. La presentación de este documento con el navegador Mozilla 1.3a considero que es buena. Sin embargo, he probado otros navegadores (Explorer 6sp1, Opera no sé que versión), y existen fallos en la presentación, leves algunos, pero bastante graves en otros casos, que pueden llegar a desvirtuar enormemente el contenido. Por lo tanto, te recomiendo encarecidamente que acudas a la versión impresa, y utilices esta como apoyo, en todo caso. Mientras tanto, lo vuelvo a repetir: los navegadores no estándar, a la porra.
[2002-11-15]
La materia de compiladores se divide en dos asignaturas (4,5 créditos cada una) de 4º curso de la Ingeniería Informática, llamadas Compiladores I (página oficial) y Compiladores II (página oficial).
Las herramientas de generación de compiladores son de enorme utilidad, no solo para el desarrollo de compiladores, sino para resolver fácilmente otros problemas. En cualquier caso, son de obligado conocimiento en las asignaturas de compiladores. Se proporcionan en esta otra página.
[1998-12-01]
El día 7 de octubre de 1997 Andoni y yo comenzamos el funcionamiento de una rudimentaria lista de distribución para la asignatura de Compiladores I. En febrero de 1998 se puso a punto el servidor de listas majordomo, con lo que el comportamiento a partir de esa fecha es el habitual para las listas de distribución.
El aspecto más importante a tener presente para empezar a trabajar con el sistema de distribución es la existencia de dos direcciones de correo, que no deben confundirse:
Para la suscripción, envía un mensaje a majordomo@deusto.es, con un asunto cualquiera y el siguiente cuerpo:
subscribe eside-compiladores tu-email -
tu-email será la dirección de correo electrónico donde quieras recibir los mensajes de la lista). Se recomienda no escribir nada más en el cuerpo del mensaje (concretamente evita la firma) para que majordomo no se vuelva loco. Esto se puede conseguir colocando un guión en una línea nueva, como se ve arriba: majordomo no leerá a partir de ahí, haya lo que haya.
Muy poco después deberías recibir algún mensaje (normalmente dos) pidiendo confirmación para la suscripción: sigue atentamente las indicaciones de dichos mensajes. Cuando se haya aceptado la suscripción, te llegarán otros (normalmente dos) mensajes: es conveniente que guardes estos mensajes, pues contienen alguna información sobre el funcionamiento de la lista que puede ser de interés.
Si no te gusta la lista, puedes cancelar la suscripción, enviando un mensaje a majordomo@deusto.es, con asunto cualquiera y el cuerpo:
unsubscribe eside-compiladores -
Recuerda el guión para que no se procese el resto del mensaje. Ten en cuenta que la lista se cerrará automáticamente el 30 de septiembre de cada año (más o menos), por lo que no es estrictamente necesario que canceles la suscripción, salvo si tienes claro durante el curso que no te interesa para nada.
El sistema majordomo acepta una serie de comandos, además de los anteriores, para diversas operaciones; escribe un mensaje como los descritos, con el cuerpo:
help -
para conocerlos (lo cual es muy recomendable).
Se pretende que los mensajes abarquen los siguientes aspectos, siempre con un criterio fundamental, como es que resulten de interés para la asignatura, en particular, y para los compiladores y los lenguajes de programación, en general:
Para participar en la lista, envía tu mensaje a la dirección de la lista: eside-compiladores@deusto.es. No olvides colocar un asunto que sea aclaratorio del contenido. Si respondes a otro mensaje, coloca Re: delante del asunto original, comprueba la dirección a la que mandas la respuesta (la misma que arriba), y procura mantener a la manera habitual la identificación (ver más abajo) y el texto del participante a quien respondes, pero solo la parte estrictamente necesaria para que se comprenda tu respuesta, no todo el mensaje. Procura que el formato de salida de los mensajes sea el más simple posible (o sea, preferiría que no mandases HTML).
Si tienes cualquier problema con la lista, no escribas a la dirección de participación, sino al propietario de la misma (que de momento soy yo, pero algún día puede cambiar), a través de la dirección owner-eside-compiladores@x500.deusto.es. Para cualquier otro asunto, usa mi dirección personal (está al final de la página).
[2002-11-15]
Empecé a dar esta asignatura en enero de 1987. Entonces era una asignatura anual de 3 horas a la semana. Como no se veían antes en la carrera ni autómatas ni gramáticas, la primera parte de la asignatura era esto, y de compiladores propiamente solo se llegaba a ver análisis léxico y sintáctico (además en 5º se acababan las clases un mes antes). Esto duró así unos años, hasta que en 1989 empecé a dar Teoría de autómatas y lenguajes formales en 3º, con lo cual, en el curso 1991-1992, ya se pudo dar la materia de compiladores con un poco más de sentido.
Andoni Eguíluz entró a dar clase de la asignatura en 1994, y desarrolló (basándose en mis notas, pero añadiendo una gran cantidad de nuevo material), los apuntes que todavía se utilizan. Realmente, ese año dio clase solo él, mientras que los dos siguientes dimos juntos. Como fruto de esa colaboración, surgió una herramienta llamada GeLLCo (ver esta otra página), que tenía grandes expectativas, pero no llegó a cuajar.
El último año que se dió clase oficial de la asignatura en esta carrera de licenciado fue 1996-1997, aunque creo recordar que todavía dí clases especiales para repetidores el año siguiente. La asignatura terminó definitivamente de existir el curso 1999-2000.
El curso 1993-1994 empezó en 1º la nueva titulación de ingeniero informático. Era la carrera completa (primer y segundo ciclo), no como ahora. En el curso 1996-1997 llegaron a 4º curso. La materia de compiladores se dividió en dos asignaturas, tal como está ahora. La de Compiladores I la he dado yo desde entonces, mientras que Compiladores II la dio entera Andoni el primer año, la dimos a medias el segundo año (1997-1998), y la ha dado yo solo desde entonces (Andoni siempre se lamenta mucho de haber dejado de dar clase de esta asignatura, por lo mucho que le gustaba).
La materia en sí no cambió nada respecto a lo que se daba en la licenciatura desde que entró Andoni, pero añadimos un montón de experimentos docentes. Por ejemplo, Andoni fue el primero (en 1997) en crear una lista de distribución por correo electrónico para la asignatura, y yo le seguí al año siguiente (y eso sin la ayuda de majordomo, o sea, reenviábamos nosotros mismos los mensajes, imagínate). Hay información sobre la lista actual en este apartado.
Pero la experiencia más importante que ha habido nunca en las asignaturas fueron las prácticas que se hicieron en Compiladores II los cursos 1997-1998 y 1998-1999. La verdad es que si no fuera por la insistencia de Andoni, yo creo que no me hubiera metido en ese berenjenal, pero la experiencia fue, por lo menos para mí, muy positiva, aunque también es verdad que exigió un esfuerzo que, en estos momentos, no creo que vuelva a repetir si no hay antes un cambio en la infraestructura de apoyo. De todas las maneras, puedes consultar información sobre el tema en este apartado.
Aunque estrictamente el plan de estudios no cambiaba, el curso 1999-2000 supuso otra "reforma" en la materia de compiladores, ya que ese año llegaron a 4º los estudiantes que, en lugar de hacer el primer ciclo de la titulación de ingeniero informático, habían cursado ingeniero técnico en informática de gestión. Debido a que (lo que son las cosas) en esta nueva estructura de los estudios, no se enseña la teoría de autómatas y lenguajes formales, ha habido que volver casi a lo que pasaba en la licenciatura, dedicando parte de la asignatura Compiladores I a ver lo mínimo de esa materia. Y ahí andamos.
[1997]
José Luis Díez Fernández, distinguido alumno de la asignatura en el curso 1996-97, ha realizado un programa Java que aplica la técnica LR(1) a una gramática para obtener las tablas del analizador sintáctico ascendente. Puedes usar dicho programa si sigues el enlace de abajo, pero, claro, tu gozo estará en un pozo si tu navegador no tiene Java.
Copyright © 1996-2003 JosuKa Díaz Labrador
Facultad de Ingeniería, Universidad de Deusto, Bilbao, España
Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.
Última modificación: 2003-03-14. Accesos al sitio: 557844