Veinticinco años del Lenguaje REC Gerardo Cisneros∗ Departamento de Innovación, Dirección de Cómputo para la Investigación, Dirección General de Servicios de Cómputo Académico, Universidad Nacional Autónoma de México, Apartado postal 20-059, 01000 México, D.F., México BITNET: CISNEROS@UNAMVM1† Introducción El lenguaje de programación REC (Compilador de Expresiones Regulares, por las siglas del nombre en inglés, Regular Expression Compiler) es un lenguaje creado por H. V. McIntosh a partir de la idea de “predicados operadores” cuya intención original era la de proporcionar un sustituto estético al program feature introducido por McCarthy en LISP. El lenguaje resultante es un lenguaje extremadamente conciso, y por la simplicidad de su estructura es relativamente fácil construir diferentes versiones según el área de aplicación que se desee abordar. En este artı́culo se describe la historia y la evolución de REC, desde su primer compilador para una computadora DEC PDP-8 hasta la biblioteca configurable actual. Estructura de REC REC es un lenguaje extremadamente conciso, cuya sintaxis se puede describir en sólo dos renglones con la notación extendida de Backus-Naur. En esta notación [Je85], el sı́mbolo “→” significa “se define como”, la barra vertical denota alternativa, los paréntesis redondos agrupan dos o más opciones y los corchetes, aparte de agrupar, denotan que se puede tomar cero o más instancias del objeto encerrado. Con esto, un programa Prog REC y una expresión Expr REC se definen como: Prog → Expr | “{”{Prog ν}Prog “}” Expr → “(”{{Prog | π}(“:”|“;”)}{Prog | π}“)” En esta definición, π es un predicado (un elemento de un conjunto que varı́a según la versión particular de REC), ν es un nombre de subrutina (un solo carácter imprimible ASCII diferente de “}” que se asigna como nombre al programa REC que le precede) y los caracteres entrecomillados son literales. En una versión tı́pica, los predicados π constan de una o dos letras, con excepción de unos pocos predicados con estructura más compleja, p. ej., cadenas entrecomilladas o constantes decimales. Los corchetes, los paréntesis, los dos puntos, el punto y coma y la alteración en el flujo de control que puede inducir un predicado proporcionan a REC toda su estructura de control y lo hacen un lenguaje recursivo y estructurado. REC ya era un lenguaje intrı́nsecamente estructurado desde antes de que se inventara el término programación estructurada. ∗ Investigador Nacional, en licencia de año sabático del Departamento de Aplicación de Microcomputadoras, Instituto de Ciencias, Universidad Autónoma de Puebla, Apartado postal 461, 72000 Puebla, Puebla, durante el año académico 1991-92. † Dirección actual [email protected] 1 El primer compilador: REC en la Universidad Nacional Autónoma de México El primer compilador de REC fué escrito por McIntosh en 1966 como parte de las pruebas de aceptación de la computadora DEC PDP-8 del Centro de Cálculo Electrónico de la UNAM [McI66]. El lenguaje fué construido sobre las idea de predicados operadores implantada en MBLISP [McI63], que planteaba una alternativa al program feature de LISP que preservaba la naturaleza funcional y recursiva del lenguaje, sin apelar a saltos y etiquetas (que eran una caracterı́stica del program feature). En esta versión no habı́a subrutinas y la sintaxis era más sencilla: Expr → “(”{{Expr | π}(“:”|“;” )}{Expr | π}“)” La idea de los predicados operadores era expresar programas en algo semejante a la forma canónica de Shannon (disyunción de conjunciones): cada sucesión de predicados terminada por dos puntos, punto y coma, o el paréntesis derecho se intenta ejecutar en su totalidad; si alguno de los predicados resulta falso, la ejecución se interrumpe y continúa con la siguiente sucesión. La iteración la causa el encuentro del sı́mbolo dos puntos, y la terminación se logra con el punto y coma. Encontrar un paréntesis derecho causa que la expresión sea falsa, con lo cual se permite expresar complementos de predicados. El primer compilador sólo tenı́a cuatro predicados: leer un carácter del teletipo al acumulador, escribir al teletipo el carácter del acumulador, cargar el acumulador con una constante, y probar la igualdad del acumulador con una constante. (Sólo el último predicado podı́a ser falso; los primeros tres siempre eran verdaderos, y por convención a los predicados siempre verdaderos se les llamó operadores.) Este pequeño conjunto de predicados sirvió para mostrar la viabilidad del lenguaje, y el compilador correspondiente es el que se describe en la primera publicación formal sobre el lenguaje, [McI68]. Al poco tiempo se le agregaron predicados que permitı́an realizar operaciones aritméticas y calcular funciones trigonométricas y trascendentales en notación polaca inversa, al actuar éstas sobre números introducidos en una pila. También habı́a predicados para controlar la lectura y escritura de caracteres de un teletipo, el despliegue de resultados en un osciloscopio, y para guardar y recuperar resultados intermedios de un par de localidades auxiliares [Or67]. Un ejemplo de programa en esta versión es el siguiente: ([-2]J,([-2]K, (VV*UU*+PPPP****VV*UU*[-1]*+V*U*[8]*P*[-1]*+ (N".W;" W;),V[.054]+K,!74!:;) "←-W"↓WU[.08]+J,!50!:;);) que graficaba a base de puntos y espacios la región limitada por la función r = 2 sin 4θ. Los sı́mbolos ←- y ↓ representan los caracteres de control para retorno de carro (CR) y avance de renglón (LF), respectivamente. Esta versión, REC-A (REC Aritmético), se utilizó en cursos de análisis numérico en la Escuela Superior de Fı́sica y Matemáticas (ESFM) del IPN. La estructura de REC también fué estudiada desde el punto de vista formal en la ESFM en los cursos de lógica matemática [McI67]. REC en el Instituto Politécnico Nacional Una vez que se introdujo en la enseñanza el REC-A de la DEC PDP-8, el uso de REC se extendió como notación para sistematizar cálculos manuales realizados con una calculadora de escritorio que contaba con una pila: la Friden 132 [Or67, Ci68]. Con la disponibilidad de una computadora IBM 1130 en el Centro Nacional de Cálculo (CeNaC) del IPN, se desarrolló una versión nueva de REC-A en forma de intérprete programado en Fortran [Ci70]. En esta versión se introdujeron subrutinas, pero los programas no eran anidables, y los 2 nombres de las subrutinas se asignaban de los caracteres sobrantes del conjunto de predicados, de modo que no habı́a un predicado que sirviera para llamar a una subrutina, sino que cada subrutina quedaba agregada a REC-A, durante la ejecución, como un predicado nuevo. Esta misma versión fué extendida en la IBM 1130 a REC-M, una versión matricial en la que los operandos que entraban a la pila podı́an ser matrices cuadradas de dimensión hasta de 6×6, vectores hasta de 6×1 o 1×6, o escalares. REC-M fué transportado a versiones con números reales y complejos en la computadora CDC 3150 que se instaló en el CeNaC en 1968 [Ci69]. En estas versiones la dimensión máxima para matrices habı́a subido a 10×10. Estos compiladores fueron utilizados durante varios años en los cursos de análisis numérico de la ESFM, y con ellos se resolvı́an problemas de cuadratura numérica, integración numérica de sistemas de ecuaciones diferenciales, solución de sistemas de ecuaciones lineales y diagonalización de matrices, entre otros; el conjunto de predicados permitı́a incluso obtener resultados graficados en la impresora de lı́neas. Un programa para resolver un sistema de ecuaciones se podı́a escribir como (IOVIO*O;), donde I leı́a un dato y lo colocaba en el tope de la pila, O escribı́a en la impresora el dato del tope, V invertı́a el tope si era una matriz o dejaba su recı́proco si era un escalar, y * multiplicaba el elemento siguiente al tope por el dato del tope, dejando el producto en lugar de ambos. En la misma IBM 1130 y con base en el compilador escrito en Fortran, McIntosh escribió una versión para estudiar numéricamente ecuaciones diferenciales de segundo orden (REC/SECO, utilizada en cursos de análisis numérico y mecánica clásica y cuántica), y una versión simbólica para los cursos de lógica matemática, REC/Markov, con la que se escribió además un editor de texto, aplicación desconocida en aquel entonces en equipos como la IBM 1130. Cuando la ESFM adquirió una computadora DEC PDP-8I, REC volvió a ser implantado en ésta máquina, en la versión REC/Markov. Con la experiencia adquirida al utilizar las versiones de la IBM 1130, la CDC 3150 y la DEC PDP-8, varios estudiantes de la ESFM escribieron sus tesis sobre compiladores de REC desarrollados para otras máquinas u otras aplicaciones: • REC para el despliegue y manipulación visual en una computadora DEC PDP-15, de datos generados por una computadora DEC PDP-10 y transmitidos por un canal de alta velocidad [Ga71]. • REC/Markov en lenguaje ensamblador para la computadora CDC-6400 [Va71]. • REC con un conjunto de predicados para análisis estadı́sticos, en la computadora IBM 1130 [Se75]. • Adaptación del REC de 64 predicados [Ga75] de la computadora DEC PDP-10 a la computadora DEC PDP-8 [Sa78]. • Versión para captura, almacenamiento, procesamiento estadı́stico y representación visual de señales neurofisiológicas, en tiempo real, desarrollada en un sistema DEC PDP-12 (combinación de DEC LINC y DEC PDP-8) [Go83]. La versión matricial para la CDC 3150 fué reimplantada en la computadora Cyber 72 en 1978 [Ci78], y tomando su compilador como base se desarrolló en la Escuela Superior de Ingenierı́a Mecánica y Eléctrica del IPN una versión para análisis y diseño de filtros digitales de respuesta finita al impulso unitario [Ga85]. REC en el Instituto Nacional de Energı́a Nuclear Luego de las versiones arimética y matricial de REC de principios de los años 70, el siguiente avance en REC ocurrió cuando C. Garcı́a-Jurado implantó una versión con 64 predicados en la DEC PDP10 del entonces Instituto Nacional de Energı́a Nuclear (INEN) [Ga75]. Esta versión estaba escrita en ensamblador y podı́a invocarse como subrutina desde programas en Fortran. Contaba con un predicado para compilar y ejecutar otros programas en REC al momento de la ejecución, de modo que, con los predicados de REC/Markov, sirvió para construir programas que validaran datos leı́dos por programas en Fortran, y para ofrecer una interfaz interactiva amigable a los usuarios de programas escritos también en Fortran. Incluso el programa de la nómina del INEN se benefició con estas aplicaciones de REC. 3 El mecanismo para definición de subrutinas cambió; en lugar de ocupar el mismo espacio de nombres que el conjunto base de predicados, como en la IBM 1130, se introdujo un predicado compuesto @ν, que invocaba a la subrutina identificada con el nombre ν. La sintaxis de REC era ahora Prog → {Expr“@”ν} Expr“$” Expr → “(”{{Expr | π}(“:”|“;”)}{Expr | π}“)” donde el programa principal era la expresión terminada con el signo “$”. Otros procesos computacionales cientı́ficos y técnicos en el INEN requerı́an un despliegue gráfico, y la arquitectura de la DEC PDP-10 era tal que el uso de una graficadora directamente conectada deterioraba notablemente la respuesta del sistema. Para resolver este problema, Garcı́a-Jurado escribió una versión con predicados para controlar un despliegue gráfico vectorial conectado a una DEC PDP-15 [Ga71]. Los programas en esta versión podı́an recibir datos de la DEC PDP-10 por un canal de alta velocidad, y luego de desplegarlos, podı́an realizar transformaciones de la imagen, como rotaciones, traslaciones y escalamientos. También en el INEN se construyó una versión de REC para la computadora DEC PDP-11 [Lo75], con un conjunto de predicados semejante al de la computadora DEC PDP-10, que posteriormente sirvió como base para que W. López y S. Bermúdez desarrollaran REC en Industrias Digitales para la microcomputadora IMSAI, basada en el microprocesador 8080, en la época en que las microcomputadoras acababan de aparecer en el mercado (fines de los años 70) y prácticamente no habı́a lenguajes de alto nivel para ellas. Esta versión de REC tuvo al menos una aplicación comercial: con ella se construyó un sistema administrativo para el Jockey Club. REC en la Universidad Autónoma de Puebla Con la experiencia adquirida en el uso de REC en la DEC PDP-10, al poco tiempo de llegar a Puebla, McIntosh escribió un documento de 63 páginas [McI76] en el que definió las bases mı́nimas para REC, tanto en su estructura como en los conjuntos de predicados necesarios para expresar dos modelos de computación (los algoritmos de Markov [Ma54] y los sistemas de Post [Po43, Po46]), y sentó las bases de una versión de REC adecuada para la compilación de Convert (lenguaje originalmente desarrollado como intérprete en LISP [Gu65, Gu66]), lo que guió el desarrollo posterior del lenguaje. El resultado fué que se escribieron compiladores de REC para una variedad de máquinas y microprocesadores: • IBM 1130. Una versión en lenguaje ensamblador, a base de macros que pudieran transportarse a otras máquinas. Con esta versión se escribieron, entre otros programas, ensambladores cruzados para los microprocesadores Motorola 6800 e Intel 8080. • DEC PDP-8. En esta versión se resolvió el problema del lı́mite de una página de memoria que tenı́an los programas de versiones anteriores. También se escribió con este REC un ensamblador cruzado para el microprocesador Intel 8080, y Alberto Licona escribió con el mismo REC un intérprete de LISP con el que se podı́an correr todos los ejemplos de las notas de J. Barberán [Ba63] • Alpha-Micro. Una versión similar en su conjunto de predicados a la de la DEC PDP-10 fué construida y utilizada por A. Licona para desarrollar ROS (REC Operating System), una multitud de programas en REC que incluı́a un intérprete de órdenes y utilerı́as para el uso y administración de computadoras Alpha-Micro, entre otras, editores, ensambladores y compiladores [Li81]. Este sistema se utilizó en apoyo a las actividades de computación administrativa de la Universidad Autónoma de Puebla (UAP). • Intel 8080 y Motorola 6800. Compiladores de REC que reproducı́an en términos generales el conjunto de predicados de la versión para la DEC PDP-10, utilizados en una diversidad de cursos del programa de la Licenciatura en Ciencias de la Computación de la Escuela de Ciencias Fı́sico-Matemáticas (ECFM) de la UAP. 4 Todos estos compiladores seguı́an esencialmente la sintaxis establecida para el REC de la DEC PDP-10 y se desarrollaron en los primeros años de las microcomputadoras. El desarrollo de REC en el microprocesador Intel 8080 con miras a contar con una herramienta capaz de compilar Convert requirió el cambio en la sintaxis que permitió anidar programas con subrutinas, utilizando un mecanismo dinámico para la activación de éstas. REC80, escrito en lenguaje ensamblador para el microprocesador Intel 8080 bajo el sistema operativo CP/M, cuenta con una selección de predicados que operan sobre cuatro estructuras de datos: una pila para números, cadenas y direcciones, un área de trabajo para inserciones, borraduras y búsquedas de texto, un arreglo para definiciones de subrutinas y almacenamiento de direcciones, y el área de compilación [Gi84, McI85]. Este compilador fué extendido para incorporar aritmética de punto flotante y transportado a los microprocesadores de la familia Intel 8086 (bajo CP/M y MS-DOS) y Motorola MC68000 (bajo el sistema operativo UNIX) [Ci86a, Ci86b, McI90]. Además de cumplir su propósito de servir como base para escribir un compilador de Convert [Ci85, McI90], REC80 y sus sucesores, REC86 y REC68 han sido y siguen siendo utilizados en una variedad de cursos de la Licenciatura en Ciencias de la Computación de la ECFM de la UAP. Entre otras aplicaciones, con una combinación de programas de REC y Convert se escribió un paquete para el estudio de autómatas finitos e infinitos [Ci89], utilizado en cursos de lógica matemática de la ECFM. El compilador más reciente de REC [Ci91] no es una versión especı́fica; es una biblioteca de funciones que permite al usuario asignar sus propias definiciones a los predicados que requiera su aplicación. Las funciones más importantes son rec c y rec x. La función rec c tiene como argumentos un programa en REC, un arreglo en el cual se coloca el código generado y una tabla que indica, para cada sı́mbolo imprimible ASCII, el tipo de compilación (operador—predicado siempre verdadero—, predicado, carácter de control, etc.) que le corresponde y la función que realiza la operación asociada. La función rec x ejecuta el programa REC cuyo código se encuentra en el arreglo especificado como argumento. La biblioteca ha sido utilizada para darle una gran flexibilidad a las interfaces de programas para estudios de autómatas celulares lineales [McI91a], de cálculo de trayectorias de una partı́cula cargada en el campo de dos centros cargados eléctrica y magnéticamente [McI91b], y para el control de una tablilla especial para evoluciones de autómatas celulares [McI91c]. La biblioteca funciona bajo los sistemas operativos MS-DOS y UNIX. Conclusión REC ha prestado un servicio útil en las instituciones en donde han existido compiladores. Tal vez no se haya difundido más por lo conciso, casi crı́ptico de su notación. No obstante, es un lenguaje estructurado y fácil de usar, que por lo conciso puede integrarse a otros programas y proporcionarle programabilidad a sus interfaces interactivas. Todos los compiladores recientes (de REC80 en adelante) se pueden obtener del autor en el Departamento de Aplicación de Microcomputadoras del Instituto de Ciencias de la UAP, y, durante el año académico Septiembre de 1991 a Agosto de 1992, en la Dirección General de Servicios de Cómputo Académico de la UNAM; sólo se requiere proporcionar los discos magnéticos suficientes para contener las versiones que se soliciten. Agradecimientos El autor agradece al Dr. Harold V. McIntosh, al M. en C. Carlos Garcı́a-Jurado M. y al Dr. Cristóbal Vargas J. los documentos históricos y los comentarios que le proporcionaron sobre el desarrollo de REC en épocas e instituciones en las que no participó. 5 Referencias [Ba63] [Ci68] [Ci69] [Ci70] [Ci78] [Ci85] [Ci86a] [Ci86b] [Ci89] J. Barberán, “LISP functions to calculate derivatives and Poisson brackets,” Program Note # 3, Quantum Theory Project, University of Florida (Feb 1963) G. Cisneros S., “Programación en REC/F de una calculadora electrónica Friden 132,” Nota de Programa # 7, Escuela Superior de Fı́sica y Matemáticas, Instituto Politécnico Nacional (Ene 1968) G. Cisneros S., “REC CDC-3150,” (listados) Escuela Superior de Fı́sica y Matemáticas, Instituto Politécnico Nacional (Abr 1969, Jul 1970) G. Cisneros, “A FORTRAN coded Regular Expression Compiler for the IBM 1130 Computing System,” Acta Mex. Cienc. Tecnol. 4, 1 (Ene-Abr), 30–86 (1970) G. Cisneros, “Compilador de Expresiones Regulares para el sistema Cyber 72 del IPN,” Sección de Graduados, Escuela Superior de Ingenierı́a Mecánica y Eléctrica, IPN (1978) G. Cisneros y H. V. McIntosh, “Introducción al lenguaje de programación Convert,” Acta Mex. Cienc. Tecnol. 3, 9 (Ene-Mar 1985) 65–74. Se publicó una traducción al inglés en SIGPLAN Notices 21, 4 (April 1986) 48–57. G. Cisneros and H. V. McIntosh, REC and Convert compilers for MS-DOS, PC/Blue library Vols. 211 and 212, New York Amateur Computer Club (1986); también en el disco #MS29 de Micro Cornucopia. G. Cisneros y H. V. McIntosh, “Notas sobre los lenguajes REC y Convert,” Departamento de Aplicación de Microcomputadoras, Instituto de Ciencias, UAP, Puebla (1986) Gerardo Cisneros y Harold V. McIntosh, “REC y Convert en la enseñanza de la Teorı́a de Autómatas,” Memorias de la Quinta Conferencia Internacional Las Computadoras en las Instituciones de Educación y de Investigación (México: Universidad Nacional Autónoma de México y Unisys, 1989) [Ci91] Gerardo Cisneros “Biblioteca de REC para construcción de interfaces interactivas flexibles”, Memorias de la Séptima Conferencia Internacional Las Computadoras en las Instituciones de Educación y de Investigación (México: Universidad Nacional Autónoma de México, INEGI y Unisys, 1991, en prensa) [Ga71] Carlos R. Garcı́a-Jurado M., “Un REC visual para la PDP-15 en comunicación con la PDP-10,” Tesis de Licenciado en Fı́sica y Matemáticas, Instituto Politécnico Nacional (1971) C. R. Garcı́a-Jurado M., “RECSM,” Instituto Nacional de Energı́a Nuclear (1975) [Ga75] [Ga85] [Gi84] [Go83] [Gu65] [Gu66] [Je85] [Lo75] Héctor S. Garcı́a Salas, “Desarrollo de un procesador REC para análisis y diseño de filtros digitales FIR,” Tesis de Maestrı́a en Ciencias con especialidad en Ingenierı́a Electrónica, Instituto Politécnico Nacional, México (1985) Francisco Gil Z. y H. V. McIntosh, “REC,” Departamento de Aplicación de Microcomputadoras, Instituto de Ciencias, UAP, Puebla (1984) J. Germán González Santos, “Diseño y desarrollo de un lenguaje de programación para procesamiento de señales en tiempo real,” Tesis de Licenciado en Fı́sica y Matemáticas, Instituto Politécnico Nacional (1983) A. Guzmán, “CONVERT,” Tesis de Ingeniero en Comunicaciones y Electrónica, Instituto Politécnico Nacional, México (1965) A. Guzmán and H. V. McIntosh, “CONVERT,” Commun. ACM 9, 8 (August 1966) 604– 615. K. Jensen, and N. Wirth, “Pascal User Manual and Report,” 3rd. edition, (New York: Springer-Verlag, 1985) pp. 213–214. W. S. López F. y R. Rojas, “REC/ARITMETICO PDP-10 y PDP-11/45,” Instituto Nacional de Energı́a Nuclear (1975) 6 [Li81] [Ma54] [McI63] [McI66] [McI67] [McI68] [McI76] [McI85] [McI90] A. Licona A., Listados de ROS, Instituto de Ciencias, Universidad Autónoma de Puebla (1981) A. A. Markov, “Theory of Algorithms,” Works of the Mathematical Institute “V. A. Steklov,” Vol. 42, (Moscow: Academy of Sciences of the U.S.S.R., 1954) [Traducción al inglés: The Israel Program for Scientific Translations; U. S. National Technical Information Service document No. TT60-51085] H. V. McIntosh, “Operators for MBLISP,” Quantum Theory Project Program Note #9, University of Florida (Jul 1963) H. V. McIntosh, “Regular Expression Compiler Program Listing,” Centro de Cálculo Electrónico, Universidad Nacional Autónoma de México (Oct 1966) H. V. McIntosh, “Regular Expressions,” Notas para el curso de Lógica Matemática, Escuela Superior de Fı́sica y Matemáticas, Instituto Politécnico Nacional (1967) [Reeditadas como capı́tulo 7 de H. V. McIntosh, “Notes on Mathematical Logic,” con correcciones y adiciones por G. Cisneros, Instituto de Ciencias, Universidad Autónoma de Puebla (1990)] H. V. McIntosh, “A CONVERT compiler of REC for the PDP-8,” Acta Mex. Cienc. Tecnol. 2, 1 (Ene-Abr 1968), 33–43. H. V. McIntosh, “REC” (notas), Universidad Autónoma de Puebla (1976) H. V. McIntosh and G. Cisneros, REC and Convert compilers for CP/M, SIG/M Vols. 213, 214 and 215, Amateur Computer Group of New Jersey (Jan 1985) H. V. McIntosh and G. Cisneros, “The programming languages REC and Convert,” SIGPLAN Notices 25, 7 (July 1990) 81–94. [McI91a] H. V. McIntosh y G. Cisneros, “LCAU41,” Instituto de Ciencias, Universidad Autónoma de Puebla (1991) [McI91b] H. V. McIntosh, “TWOC,” Instituto de Ciencias, Universidad Autónoma de Puebla (1991) [McI91c] H. V. McIntosh, “The CAM/PC exerciser CAMEX,” Instituto de Ciencias, Universidad Autónoma de Puebla (1991) [Or67] [Po43] [Po46] [Sa78] [Se75] [Va71] J. J. Ortiz Amezcua, “El lenguaje REC-A” (notas mimeografiadas), Escuela Superior de Fı́sica y Matemáticas, Instituto Politécnico Nacional (1967) E. L. Post, “Formal reductions of the general combinatorial decision problem,” Amer. J. Math. 65, (1943) 197–268. E. L. Post, “A variant of a recursively unsolvable problem,” Bull. Amer. Math. Soc. 52, (1946) 264–268. H. Saldaña A., “(REC:;) Compilador de Expresiones Regulares y algunas Aplicaciones,” Tesis de Licenciado en Fı́sica y Matemáticas, Instituto Politécnico Nacional (1978) J. M. Sesma, “REC Estadı́stico para la IBM 1130,” Tesis de Licenciado en Fı́sica y Matemáticas, Instituto Politécnico Nacional (1975) José Luis Varas-Araujo, “Compilador REC en lenguaje COMPASS para la computadora CDC 6400,” Tesis de Licenciado en Fı́sica y Matemáticas, Instituto Politécnico Nacional (1971) 7