MAD ( Michigan Algorithm Decoder ) es un lenguaje de programación y compilador para las computadoras centrales IBM 704 y, posteriormente, IBM 709 , IBM 7090 , IBM 7040 , UNIVAC 1107 , UNIVAC 1108 , Philco 210-211 y, finalmente, IBM System/370 . Desarrollado en 1959 en la Universidad de Michigan por Bernard Galler , Bruce Arden y Robert M. Graham , MAD es una variante del lenguaje ALGOL . Fue ampliamente utilizado para la enseñanza de programación en colegios y universidades durante la década de 1960 y desempeñó un papel secundario en el desarrollo de los sistemas operativos Compatible Time-Sharing System (CTSS), Multics y Michigan Terminal System . [ 1 ] La versión original del chatbot ELIZA fue escrita en MAD-SLIP . [ 2 ]
Los archivos de la Biblioteca Histórica Bentley de la Universidad de Michigan contienen materiales de referencia sobre el desarrollo de MAD y MAD/I, incluyendo tres pies lineales de impresiones con anotaciones manuscritas y manuales impresos originales. [ 3 ] [ 4 ] [ 5 ] [ 6 ]
MAD, MAD/I y GOM
Existen tres compiladores MAD:
- MAD original , el compilador desarrollado en 1959 en la Universidad de Michigan para las computadoras centrales IBM 704 y posteriormente IBM 709 e IBM 7090 que ejecutaban los sistemas operativos University of Michigan Executive System (UMES) y Compatible Time-Sharing System (CTSS) . [ 7 ] [ 8 ] A mediados de la década de 1960, MAD fue adaptado en la Universidad de Maryland para la UNIVAC 1108. [ 9 ] También existían versiones de MAD para las Philco 210-211 y UNIVAC 1107. [ 9 ]
- MAD/I , una versión "extendida" de MAD para la serie de computadoras IBM System/360 que se ejecutaban bajo el Sistema de Terminales de Michigan (MTS). El trabajo en el nuevo compilador comenzó en 1965 como parte del proyecto CONCOMP patrocinado por ARPA en la Universidad de Michigan. A medida que avanzaba el trabajo, se hizo gradualmente evidente que MAD/I era un nuevo lenguaje independiente de la versión original de MAD para la 7090. [ 10 ]
- GOM (Good Old MAD), una reimplementación del MAD 7090 original para la serie de computadoras centrales IBM System/370 que ejecutaban el Michigan Terminal System (MTS). GOM fue creado a principios de la década de 1980 por Don Boettner en el Centro de Computación de la Universidad de Michigan. [ 11 ] [ 12 ]
Historia
Aunque MAD se inspiró en ALGOL 58 , no se asemeja a ALGOL 58 de manera significativa. [ 13 ] [ 14 ]
Entre los programas escritos en MAD se encontraban MAIL, [ 15 ] RUNOFF , [ 16 ] uno de los primeros sistemas de procesamiento de texto y varias otras utilidades, todas bajo el Sistema de Tiempo Compartido Compatible (CTSS). [ 17 ] Se trabajó en el diseño de un compilador MAD para Multics , pero nunca se implementó. [ 18 ]
La siguiente es una cita interesante de Una entrevista con Brian Kernighan [ 19 ] cuando se le preguntó "¿Qué te enganchó a la programación?":
- Creo que lo que más disfruté programando fue un trabajo de verano en el Proyecto MAC del MIT en el verano de 1966, donde trabajé en un programa que creaba una cinta de trabajo para la flamante GE 645 en los inicios de Multics. Programaba en MAD, que era mucho más fácil y agradable que FORTRAN y COBOL, lenguajes que había utilizado anteriormente, y usaba CTSS, el primer sistema de tiempo compartido, que era infinitamente más fácil y agradable que las tarjetas perforadas.
MAD era bastante rápido en comparación con otros compiladores de su época. Dado que varias personas estaban interesadas en usar el lenguaje FORTRAN y, al mismo tiempo, querían obtener la velocidad del compilador MAD, se desarrolló un sistema llamado MADTRAN (escrito en MAD). MADTRAN era simplemente un traductor de FORTRAN a MAD, que luego producía código máquina. MADTRAN se distribuía a través de SHARE . [ 13 ]
MAD/I tiene una estructura sintáctica similar a ALGOL 60 junto con características importantes del MAD original y de PL/I . [ 10 ] MAD/I fue diseñado como un lenguaje extensible. Estaba disponible para su uso bajo MTS y proporcionó muchas ideas nuevas que se incorporaron a otros lenguajes, pero las compilaciones de MAD/I eran lentas y MAD/I nunca se extendió a un uso generalizado en comparación con el MAD original 7090. [ 12 ]
GOM es esencialmente el lenguaje MAD del 7090 modificado y extendido para la arquitectura 360/370 con algunas adaptaciones juiciosas para ajustarse mejor a las prácticas y problemas de programación actuales. [ 12 ] El sistema de mensajes MTS fue escrito en GOM.
MAD, la revista Mad y Alfred E. Neuman

En una versión preliminar del MAD original, como referencia a la revista Mad , que le daba nombre al programa, cuando este contenía demasiados errores de compilación, el compilador imprimía una imagen a página completa de Alfred E. Neuman usando arte ASCII . El pie de foto decía: «Consulta con este hombre sobre tu programa; tal vez quiera publicarlo. Nunca se preocupa, pero a juzgar por tu programa, deberías hacerlo». [ 9 ] Esta característica no se incluyó en la versión oficial final. [ 20 ] Sin embargo, sí se incluyó en la versión de producción para el IBM 7040.
Y Bernie Galler recuerda:
- Para cuando diseñamos el lenguaje que creíamos que valía la pena desarrollar y para el cual podíamos crear un compilador, ya no podíamos llamarlo Algol; era realmente diferente. Fue entonces cuando adoptamos el nombre MAD, por Michigan Algorithm Decoder (Decodificador de Algoritmos de Michigan). Tuvimos un encuentro curioso con la gente de la revista Mad cuando les pedimos permiso para usar el nombre. En una carta muy graciosa, nos dijeron que nos llevarían a juicio y demás, pero terminaron la amenaza con una posdata al final: "Claro, adelante". Desafortunadamente, esa carta se perdió. [ 21 ]
Ejemplo de "Hola, mundo"
El programa de ejemplo " hola, mundo " imprime la cadena "Hola, mundo" en una terminal o pantalla.
FORMATO DE IMPRESIÓN HOLA VALORES DEL VECTOR HOLA=$13h0Hola, mundo*$ FIN DEL PROGRAMA
El primer carácter de la línea se trata como control lógico del carro ; en este ejemplo, el carácter "0" hace que se imprima una línea con doble espacio.
Alternativamente, se pueden usar contracciones, y el compilador las expandirá en el listado:
P'T HOLA V'S HELLOW=$13h0Hola mundo*$ E'M
Elementos del lenguaje
MAD y GOM, pero no MAD/I, están compuestos por los siguientes elementos: [ 8 ] [ 12 ] [ 13 ]
Formato de entrada
Los programas MAD son una serie de instrucciones escritas en tarjetas perforadas, generalmente una instrucción por tarjeta, aunque una instrucción puede extenderse a varias tarjetas. Las columnas 1 a 10 contienen una etiqueta de instrucción opcional; los comentarios u observaciones se marcan con la letra "R" en la columna 11, y las columnas 73 a 80 no se utilizan y podrían contener un identificador de secuencia. Los espacios no tienen significado en ningún otro lugar que no sea dentro de las constantes de caracteres. Para GOM, la entrada es de formato libre sin campo de secuencia y las líneas pueden tener hasta 255 caracteres de longitud; las líneas que comienzan con un asterisco (*) son comentarios; y las líneas que comienzan con un signo más (+) son líneas de continuación.
Nombres
Los nombres de variables, funciones y etiquetas de sentencias tienen el mismo formato: una letra seguida de entre cero y cinco letras o dígitos. Los nombres de funciones terminan con un punto. Todos los nombres pueden ir precedidos de subíndices (el nombre seguido de paréntesis, con varios subíndices separados por comas). En GOM, los nombres pueden tener hasta 24 caracteres y pueden incluir el guion bajo (_).
Pocas palabras clave en este idioma son palabras reservadas, ya que la mayoría tienen más de seis letras o están entre puntos. Existe un conjunto estándar de abreviaturas que se pueden usar para reemplazar las palabras más largas. Estas consisten en la primera y la última letra de las palabras clave separadas por un apóstrofo, como W'R para WHENEVER y D'N para DIMENSION.
Tipos de datos
MAD utiliza el término "modo" para sus tipos de datos. Se admiten cinco modos básicos:
- Entero escrito con o sin factor de escala ( 1, +1, -1, 1K10, 1K ) o como constantes octales (hasta 7777777777777K );
- Números de punto flotante escritos con o sin exponente ( 0., 1.5, -0.05, +100.4, -4., .05E-2, -.05E2, 5E02, 5.E2 );
- Booleano ( 1B para verdadero y 0B para falso);
- Etiqueta de declaración y
- Nombre de la función escrito como un nombre seguido de un punto ( SQRT. ).
El modo de una constante se puede redefinir agregando el carácter M seguido de un solo dígito al final de la constante, donde 0 indica punto flotante, 1 entero, 2 booleano, 3 nombre de función y 4 etiqueta de instrucción.
Para GOM se agregan seis modos adicionales: CARÁCTER, ENTERO CORTO, ENTERO BYTE, ENTERO LARGO, PUNTERO y REGISTRO DINÁMICO .
Las constantes alfabéticas o de caracteres se almacenan como números enteros y se escriben utilizando el signo de dólar como delimitador ( $ABCDEF$ ), y se utilizan signos de dólar dobles para introducir un verdadero signo de dólar ( $$$.56$ son 56 centavos). Las cadenas de más de seis caracteres se representan mediante matrices.
Matrices y arreglos
- No hay límite en el número de dimensiones.
- Se permiten subíndices negativos, cero y de punto flotante.
- Las matrices se almacenan en ubicaciones de memoria consecutivas en el orden que se determina variando primero el subíndice situado más a la derecha.
- Las matrices pueden referenciarse utilizando un subíndice para cada dimensión, NAME(s 1 ,s 2 ,s 3 ), o utilizando un único subíndice, NAME(s 1 ).
- Las listas de entrada/salida, las instrucciones VECTOR VALUES y algunas subrutinas permiten el uso de la notación de bloques, que tiene la forma A,...,B o A...B, que hace referencia a toda la región desde A hasta B inclusive. En términos de un vector, A(1)...A(N) sería A(1), A(2), A(3), ..., A(N).
- Existen funciones que permiten cambiar las dimensiones en tiempo de ejecución; que permiten al programador variar la ubicación del elemento inicial en una matriz dentro del bloque general que se ha reservado para la matriz; y que permiten especificar una asignación de almacenamiento arbitraria.
Operadores
Declaraciones de declaración
Las variables pueden declararse implícita o explícitamente. Por defecto, se asume que todas las variables declaradas implícitamente son de punto flotante. La instrucción NORMAL MODE IS permite modificar este comportamiento predeterminado.
Sentencias ejecutables
Declaraciones de entrada y salida
Funciones
Los nombres de las funciones terminan con un punto. Se admiten funciones internas y externas. Las funciones internas se compilan como parte del programa en el que se utilizan y comparten declaraciones y variables con el programa principal. Las funciones externas se compilan por separado y no comparten declaraciones ni variables. Se permite la definición de funciones internas en una sola instrucción. Se permiten funciones recursivas, aunque la función debe realizar parte del trabajo de guardado y restauración por sí misma.
Definición y redefinición de operadores
Una de las características más interesantes de MAD es la capacidad de extender el lenguaje redefiniendo operadores existentes, definiendo nuevos operadores o definiendo nuevos tipos de datos (modos). Las definiciones se realizan mediante declaraciones MAD y mnemónicos en lenguaje ensamblador que se incluyen después de la declaración, hasta la pseudo-instrucción END que implementa la operación.
- DEFINIR OPERADOR BINARIO defined-op , PRECEDENCIA rango existing-op MODO ESTRUCTURA opciones-modo
- DEFINIR OPERADOR UNARIO defined-op , PRECEDENCIA rango existing-op MODO ESTRUCTURA opciones-modo
- ESTRUCTURA DEL MODO modo-no = modo-no operación-existente modo-no
- ESTRUCTURA DEL MODO modo-no = modo-no operación-existente modo-no MISMA SECUENCIA QUE modo-no operación-existente modo-no
dónde:
- El rango es uno de IGUAL QUE, INFERIOR QUE o SUPERIOR QUE; y
- Las opciones de modo son las opciones que aparecen en la instrucción MODE STRUCTURE.
Existen tres paquetes de definiciones predefinidas (MATRIX, DOUBLE PRECISION y COMPLEX) que pueden incluirse en los programas fuente de MAD mediante la instrucción INCLUDE.
- INCLUYE paquete
Véase también
Notas
- ↑ Alt, Franz (1967). Avances en informática . Academic Press . pág. 143. ISBN 0-12-012104-2.
- ↑ Shrager, Jeff. "El ELIZA original de Joseph Weizenbaum" . Archivado del original el 13 de agosto de 2021. Recuperado el 12 de enero de 2023 .
- ↑ Memorandos técnicos , publicaciones del Centro de Computación de la Universidad de Michigan, 1965-1999
- ↑ Informes técnicos , publicaciones del Centro de Computación de la Universidad de Michigan, 1965-1999
- ↑ Archivo temático 1960-1986 , registros del Centro de Computación de la Universidad de Michigan, 1952-1996
- ↑ MAD (Decodificador de Algoritmos de Michigan) 1960-1979 , registros del Centro de Computación de la Universidad de Michigan, 1952-1996
- ↑ Manual de referencia del usuario para el decodificador de algoritmos de Michigan (MAD) para el IBM 7090 , Laboratorio de Computación Digital, Facultad de Posgrado, Universidad de Illinois, 1962, 221 páginas
- 1 2 El decodificador de algoritmos de Michigan (El manual MAD) , Bruce W. Arden, edición revisada de 1966
- 1 2 3 George Gray (junio de 2002). "UNIVAC y ALGOL" . Boletín de historia de Unisys . 6 (2). Archivado del original el 29 de junio de 2017.
- 1 2 El manual MAD/I , Bolas, Springer y Srodawa, Informe técnico CONCOMP 32, 1970, Universidad de Michigan, Ann Arbor, 194 páginas
- ↑ MTS Volumen 2: Descripciones de archivos públicos , Centro de Computación de la Universidad de Michigan, 1990, pág. 14
- 1 2 3 4 Manual GOM , Don Boettner, Centro de Computación de la Universidad de Michigan, Ann Arbor, junio de 1989
- 1 2 3 Lenguajes de programación: principios e historia
- ↑ En agosto de 2010, al ser consultado sobre la declaración de Jean Sammet de que "MAD no se parece a ALGOL 58 de manera significativa", Bruce Arden escribió: "Respecto a Jean Sammet, es posible que haya confundido las dos versiones de IAL (58 y 60 ). A diferencia de la versión posterior, la versión 58 no especificaba qué palabras (o lenguaje) debían usarse para identificar sentencias condicionales y de transferencia, lo que, por razones de análisis sintáctico, llevó al uso de palabras como WHENEVER. Además, MAD incluía algunas características adicionales que iban más allá de las especificaciones de la versión 58."
- ↑ Documentación y fuentes para los primeros correos electrónicos y mensajería , Tom Van Vleck
- ↑ "... Doug McIlroy y Bob Morris escribieron Multics runoff en BCPL basado en la versión MAD de RUNOFF de Jerry Saltzer para CTSS.", "Características del software Multics: Sección 1.7.7" , sitio web de Multics. Consultado el 10 de noviembre de 2018.
- ↑ Sistema de tiempo compartido compatible (1961-1973): Reseña conmemorativa del quincuagésimo aniversario , David Walden y Tom Van Vleck (eds.), 2011, IEEE Computer Society. Consultado el 10 de noviembre de 2018.
- ↑ "Glosario de acrónimos y términos de Multics" , Tom Van Vleck, sitio web de Multicans.
- ↑ Noren, Allen (10 de abril de 2009). "Una entrevista con Brian Kernighan: Cultivando pequeños lenguajes" . O'Reilly Community . Archivado del original el 30 de junio de 2017. Recuperado el 28 de julio de 2023 .
- ↑ Shneiderman, Ben; Plaisant, Catherine (7 de mayo de 2004). Diseño de la interfaz de usuario (4.ª ed.). Addison Wesley . ISBN 978-0-321-19786-3.
- ↑ Galler, Bernard A.; Galler, Enid H. (enero de 2001). "Una entrevista sobre la trayectoria profesional de Bernie Galler". IEEE Annals of the History of Computing . 23 (1): 22– 33. doi : 10.1109/85.910847 . ISSN 1058-6180 .
Referencias
- Descripción abreviada del lenguaje del compilador MAD , Fernando J. Corbató , Jerome H. Saltzer , Neil Barta y Thomas N. Hastings, Memorando CC-213 del Centro de Computación del MIT, junio de 1963.
- CLSYS, un programa para facilitar el uso del traductor MAD para lotes grandes (del tamaño de una clase) , Jerome H. Saltzer, Memorando CC-204 del Centro de Computación del MIT. Febrero de 1963.
- Un manual básico de informática para el lenguaje Mad , Elliott Irving Organick , 1961.
- Organización interna del traductor MAD , Arden, BW, Galler, BA y Graham, RM, págs. 28–31, CACM Volumen 4 N.° 1 (enero de 1961)
- Introducción a los métodos algorítmicos utilizando el lenguaje MAD , Alan B. Marcovitz y Earl J. Schweppe, Macmillan, 1966.
- Introducción a las computadoras digitales y al lenguaje MAD , Brice Carnahan, Universidad de Michigan.
- El lenguaje de las computadoras , Bernard A. Galler, Universidad de Michigan, McGraw-Hill, 1962.
- MAD en Michigan: su función y características , Arden, BW, Galler, BA y Graham, RM, pp. 27-28, Datamation, Volumen 7, n.° 12 (dic. 1961)
- Diagramas de flujo del decodificador de algoritmos de Michigan , por GB Smith, Biblioteca de programas generales de SHARE, número de distribución SHARE 1327 PA, 1961.
Enlaces externos
- El retrocompilador de Eric Raymond para MAD
- Un ejemplo trivial de un programa MAD.
- El soporte de Dave Pitts para el IBM 7094 cuenta con un entorno CTSS que incluye la versión MIT de MAD.
- ALGOL 58 dialect
- Lenguajes de programación procedimental
- Lenguajes de programación creados en 1959