|
|
Este trabajo es el resultado de mis actividades como profesor de la Maestría en Ciencias con especialidad en Informática en la Sección de Estudios de Posgrado e Investigación (SEPI) de la Unidad Profesional Interdisciplinaria de Ingeniería y Ciencias Sociales y Administrativas (UPIICSA) del Instituto Politécnico Nacional (IPN). Este reúne la experiencia adquirida en la impartición de las cátedras de Diseño de Compiladores y Lenguajes y Compiladores desde 1995 a 2002 (durante los semestres de Otoño, salvo en 2001) y a partir de la primavera de 2003, respectivamente. El diseño del lenguaje comienza desde ese semestre de Otoño de 1995, a partir de entonces ha pasado por diversas etapas de cambio y maduración.
Al recibir por primera vez la asignación de impartir Diseño de Compiladores mi primer pensamiento giró inmediatamente sobre la selección de un lenguaje al cual enfocarme y sobre el cual los alumnos del curso trabajarían para construir su respectivo compilador. Había dos cosas que también me preocupaban. La primera tenía que ver con la experiencia de diseñar un lenguaje de programación. No es lo mismo tomar un lenguaje existente y trabajar en su respectivo compilador que partir desde el diseño del lenguaje mismo y ver como esto guía el desarrollo de su herramienta de procesamiento. El segundo aspecto que me preocupaba era la disponibilidad y fácil adquisición de muchos compiladores para la mayoría de los lenguajes de programación usados en este tipo de materias. Aun cuando la Internet comenzaba a moldearse en ese entonces, ya era posible hacerse de algún trabajo previo en ésta, de un BBS, de alumnos de cursos anteriores y de los mismos libros sobre el tema. Tomar código y programas completos para desarrollar un compilador era demasiado fácil; trabajar sobre algo ya hecho anularía la experiencia didáctica. La única alternativa era partir de algo no existente y permitir que el alumno experimentara todo el proceso.
¿De dónde partir y tomar ideas? Tuve varias fuentes. Por mi formación académica tenía conocimiento de diversos lenguajes y modelos de programación y había tenido una experiencia muy placentera al diseñar un pequeño pero funcional intérprete de Forth cuando había llevado la materia de Compiladores en la licenciatura de Ciencias de la Informática con la especialidad de Ciencias de la Computación en la misma UPIICSA. Por mi experiencia profesional tenía conocimiento de desarrollo en más de una veintena de lenguajes, desde ambiente PC hasta ambiente mainframe pasando por diversos modelos y plataformas intermedias, lo mismo que en dispositivos portátiles. Por esas fechas también, estaba en pleno auge la divulgación de RPL (Reverse Polish List processing) entre la comunidad de usuarios de las calculadoras HP, resultado del éxito de mercado que fue la HP-48 y el cual resultaba interesante por el poder de cómputo que se podía tener usando algo tan sencillo como lo era una pila. Esto me hizo recordar mi experiencia con Forth, que aunque sabía no era muy conocido, representaba un modelo de procesamiento sencillo, inusual y orientado al procesamiento en pila. Familiarizado con ambos lenguajes y buscando una experiencia diferente sobre la cual basarme en la impartición de la materia opté por diseñar un lenguaje derivado de estos dos.
Adicionalmente, soy un convencido de que los mejores mentores son aquellos que cuentan con la experiencia práctica sobre la materia que imparten y que no sólo se limitan a recitar conocimiento de una experiencia teórica. Parte de la motivación del diseño y desarrollo de este lenguaje ha sido el poder contar con esa experiencia práctica.
Este grupo de páginas no sólo expone la descripción de un lenguaje, su objetivo es mucho más ambicioso. En estas páginas se presenta el proceso seguido en su origen y posterior formación, desde el problema hasta llegar a la especificación de una serie de elementos gramaticales que permiten enunciar una serie de acciones especificas bajo el contexto examinado. Al final se incluye una compilación de todos los elementos descritos y algunos otros tan sólo enunciados. Dicha compilación no puede ser considerada como la "descripción" del lenguaje, son todas éstas páginas la referencia y descripción del lenguaje de programación Stop. Desafortunadamente hay ideas difíciles de describir adecuadamente, para hablar de una descripción completa debo incluir mi exposición sobre el proceso de formulación del lenguaje que expongo en mi cátedra. Páginas y exposición se complementan.
Elementos, operadores, estructuras y delimitadores han aparecido y desaparecido. El lenguaje conserva su estructura y funcionamiento original, pero varios aspectos de éste han cambiado. Desafortunadamente no conservo material de las versiones previas salvo por las que estén disponibles en este sitio, y los únicos testigos del desarrollo de este lenguaje han sido mis alumnos en los diversos cursos impartidos (primera versión, curso de Diseño de Compiladores del semestre de otoño de 1995; segunda versión, semestre de otoño de 1996; tercera versión, semestre de otoño de 1997; cuarta versión, semestres de otoño de 1998, 1999 y 2000; quinta versión, semestre de otoño de 2002; sexta versión, semestre de primavera de 2003, impartiendo por última vez Diseño de Compiladores y por primera vez Lenguajes y Compiladores; séptima version, semestre de otoño de 2003).
El diseño de este lenguaje ha sido un proceso de aprendizaje mutuo entre mis alumnos y yo. Ya sea a través del desarrollo de ejercicios, tareas o su proyecto semestral todos me han enseñado algo; algunos más con sugerencias, quejas o correcciones han llegado a moldear este lenguajes hasta lo que es hoy en día. Todos son parte de Stop y su desarrollo. Especialmente, deseo extender mi agradecimiento a Martín Méndez Madera por su interés en el lenguaje y esta documentación.
M. en C. Eduardo René Rodríguez Ávila
Octubre 2003.
En este punto seguramente es cuando comienzan a surgir las preguntas acerca del nombre del lenguaje. La explicación es muy sencilla. El lenguaje que se describe está completamente orientado al manejo de datos usando una pila, que en el ambiente informático es también conocida por el término en inglés stack. Como se describe más adelante, su objetivo es el control de las acciones y operaciones que se llevan a cabo en la pila, a lo cual podemos hacer referencia- continuando con los términos en inglés -como operations. El nombre entonces se deriva como un acrónimo de estas dos palabras: STack OPerations, Stop.
Ha habido muchos comentarios a este respecto, al bautizar al lenguaje con una palabra sajona y derivada de términos sajones; muchos preguntan porque no use una palabra del español para su nombre y lo mismo para sus elementos. Y, por supuesto, no ha faltado el defensor del idioma español en estos comentarios. Como lo fue el griego en su época, posteriormente el latín, luego el francés y a inicios del pasado siglo el alemán, el mundo ha tenido siempre un lenguaje común o favorito para la ciencia y tecnología. Me ha tocado vivir una época en la que el lenguaje dominante es el inglés; actuo conforme a la época.
La filosofía detrás del diseño de Stop es muy simple. Se trata de un lenguaje orientado al procesamiento de datos a través de la manipulación de elementos mantenidos en una estructura de datos en la que el primer elemento en entrar es el último en salir y que es lo que se conoce popularmente como una pila. La sencillez de la estructura y rigidez en su operación son dos elementos muy importantes en este caso. La primera deja entrever lo que es posible hacer con una estructura de datos como ésta. La segunda impone una limitante, que para efectos del desarrollo del presente lenguaje se ha tenido que sobrepasar aparentándose tomar algunas libertades en el manejo de los elementos.
Principalmente, la modalidad de procesamiento se ha tomado como una guía para la descripción de la disposición y manipulación de los elementos a trabajar. Al final, lo importante a considerar es el orden en que los elementos sean dispuestos para posteriormente ser tomados de la pila por instrucciones y operadores.
Como podrá verse, el acceso a la pila se ha liberado de su enfoque tradicional considerando que la ganancia obtenida en las facilidades de manipulación de datos es más que suficiente para justificar tal libertad. Plantear un diseño estrictamente apegado a la funcionalidad de una pila implicaría una importante reducción en el grupo de operaciones disponibles, lo que traería consigo la reducción del lenguaje a crear. Sin embargo, como podrá apreciarse al final, esta libertad es meramente conceptual, ya que las operaciones que hagan uso de ésta pueden ser descritas por una serie de acciones que impliquen extraer y reinsertar a los elementos en la pila en el orden necesario para obtener el efecto deseado.
En el diseño de Stop se ha tratado de seguir muchos de los principios usados en los modernos lenguajes de programación hasta el punto donde su implementación no sea demasiado complicada para el desarrollo de un proyecto semestral. Principalmente se ha buscado que sea regular, modular y estructurado.
Un aspecto importante, y motivo de muchos debates, es la carencia en la declaración de tipos de datos. Mientras que es cierto que Stop identifica el tipo de dato con el que se está trabajando, también es cierto que no es posible determinar el tipo de dato que una variable u operación puede llegar a recibir para su almacenamiento hasta el momento de su ejecución. Cada celda en la pila es capaz de mantener cualquier tipo de dato, una variable es una extensión en el almacenamiento de datos de la pila.
Finalmente, se trata de un lenguaje de propósito general que cae dentro de un paradigma imperativo-procedimental. Se recalca este hecho ya que por la modalidad de procesamiento a veces resulta difícil o confuso identificar bajo que modelo de programación catalogar a Stop.
El principal objetivo del lenguaje es, por supuesto, servir de apoyo didáctico en una materia de lenguajes de programación, intérpretes y compiladores. Derivado de la persecución de este objetivo surgen varias metas específicas y objetivos particulares:


| Ultima actualización: . |