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, incluidos tres pies lineales de impresiones con anotaciones escritas a mano y manuales impresos originales. [3] [4] [5] [6]
MAD/I , una versión "extendida" de MAD para la serie de computadoras IBM System/360 que funcionaban con 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, gradualmente se hizo evidente que MAD/I era un nuevo lenguaje independiente de la versión 7090 original de MAD. [10]
GOM (Good Old MAD), una reimplementación del MAD 7090 original para la serie IBM System/370 de computadoras mainframe que ejecutan el Michigan Terminal System (MTS). GOM fue creado a principios de los años 1980 por Don Boettner en el Centro de Computación de la Universidad de Michigan. [11] [12]
Historia
Si bien MAD estuvo motivado por ALGOL 58 , no se parece a ALGOL 58 de ninguna manera significativa. [13] [14]
Los programas escritos en MAD incluían 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 un diseño para un compilador MAD para Multics , pero nunca se implementó. [18]
La siguiente es una cita interesante de una entrevista con Brian Kernighan [19] cuando le preguntaron "¿Qué fue lo que te enganchó a la programación?":
Creo que lo más divertido que hice programando fue un trabajo de verano en el Proyecto MAC en el MIT en el verano de 1966, donde trabajé en un programa que creaba una cinta de trabajo para el nuevo GE 645 en los primeros días de Multics. Estaba escribiendo en MAD, que era mucho más fácil y más agradable que el FORTRAN y COBOL que había escrito antes, y estaba usando CTSS, el primer sistema de tiempo compartido, que era infinitamente más fácil y más agradable que las tarjetas perforadas.
MAD era bastante rápido en comparación con otros compiladores de su época. Debido a que muchas personas estaban interesadas en utilizar el lenguaje FORTRAN y, sin embargo, 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 de máquina. MADTRAN se distribuyó 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 abrieron camino hacia 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 7090 original. [12]
GOM es esencialmente el lenguaje MAD 7090 modificado y extendido para la arquitectura 360/370 con algunas modificaciones 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 homónima de MAD , cuando un programa 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 título decía: "Vea a este hombre sobre su programa. Puede que quiera publicarlo. Nunca se preocupa, pero por el aspecto de su programa, usted debería hacerlo". [9] Esta característica no se incluyó en la versión oficial final. [20] Sin embargo, se incluyó en la versión de producción para el IBM 7040.
Y Bernie Galler recuerda:
Cuando diseñamos el lenguaje que pensamos que valdría la pena desarrollar y para el cual podríamos crear un compilador, ya no podíamos llamarlo Algol; realmente era diferente. Fue entonces cuando adoptamos el nombre MAD, por Michigan Algorithm Decoder (Descodificador de algoritmos de Michigan). Tuvimos una interacción divertida con la gente de la revista Mad, cuando les pedimos permiso para usar el nombre MAD. En una carta muy divertida, nos dijeron que nos llevarían a los tribunales y todo lo 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 HOLAVALORES DEL VECTOR HELLOW=$13h0Hola, mundo*$FIN DEL PROGRAMA
El primer carácter de la línea se trata como control de carro lógico , en este ejemplo el carácter "0" que hace que se imprima una línea a doble espacio.
Alternativamente, se pueden utilizar contracciones y el compilador las expandirá en el listado:
P'T HOLAV'S HELLOW=$13h0Hola mundo*$Soy yo
Elementos del lenguaje
MAD y GOM, pero no MAD/I, se componen de 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 continuar en varias tarjetas. Las columnas 1 a 10 contienen una etiqueta de instrucción opcional, los comentarios o las observaciones se marcan con la letra "R" en la columna 11 y las columnas 73 a 80 no se utilizan y pueden contener un identificador de secuencia. Los espacios no son significativos en ningún 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, nombres de funciones y etiquetas de instrucciones tienen el mismo formato: una letra seguida de cero a cinco letras o dígitos. Los nombres de funciones terminan con un punto. Todos los nombres pueden tener subíndices (el nombre seguido de paréntesis, con múltiples subíndices separados por comas). En GOM, los nombres pueden tener hasta 24 caracteres y pueden incluir el carácter de guión bajo (_).
Pocas palabras clave del idioma son palabras reservadas, ya que la mayoría tienen más de seis letras o están rodeadas de puntos. Existe un conjunto estándar de abreviaturas que se pueden utilizar para reemplazar las palabras más largas. Estas consisten en la primera y la última letra de las palabras clave con un apóstrofo entre ellas, 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 un factor de escala ( 1, +1, -1, 1K10, 1K ) o como constantes octales (hasta 7777777777777K );
Punto flotante escrito 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 declaració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 ingresar un signo de dólar verdadero ( $$$.56$ es 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 determinado variando primero el subíndice más a la derecha.
Las matrices se pueden referenciar utilizando un subíndice para cada dimensión, NOMBRE(s 1 ,s 2 ,s 3 ), o utilizando un solo subíndice, NOMBRE(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 es una referencia a toda la región de A a B, inclusive. En términos de un vector, A(1)...A(N) sería A(1), A(2), A(3),..., A(N).
Hay funciones que permiten cambiar las dimensiones en tiempo de ejecución, lo que permite 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 permite especificar una asignación de almacenamiento arbitraria.
Lista de operadores, declaraciones y funciones
Operadores
Declaraciones de declaración
Las variables pueden declararse de forma implícita o explícita. De forma predeterminada, se supone que todas las variables declaradas de forma implícita son de punto flotante. La declaración NORMAL MODE IS se puede utilizar para cambiar este valor predeterminado.
Sentencias ejecutables
Declaraciones de entrada y salida
Funciones
Los nombres de 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 una definición de funciones internas en una sola declaración. Se permiten funciones recursivas, aunque la función debe realizar parte del trabajo de guardado y restauración requerido por sí misma.
Definición y redefinición del operador
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 utilizando sentencias de declaración MAD y mnemónicos de lenguaje ensamblador incluidos a continuación de la declaración hasta la pseudoinstrucción END que implementa la operación.
DEFINIR OPERADOR BINARIO opción definida , PRECEDENCIA rango opción existente ESTRUCTURA MODALIDAD opciones de modo
DEFINIR OPERADOR UNARIO opción definida , PRECEDENCIA rango opción existente ESTRUCTURA MODALIDAD opciones de modo
ESTRUCTURA DE MODO modo-no = modo-no operación-existente modo-no
ESTRUCTURA DE MODO modo-no = modo-no existente-op modo-no MISMA SECUENCIA QUE modo-no existente-op modo-no
dónde:
el rango es IGUAL QUE, INFERIOR QUE o SUPERIOR QUE; y
Las opciones de modo son las opciones que aparecen en la declaración MODE STRUCTURE.
Hay tres paquetes de definiciones predefinidos (MATRIX, DOUBLE PRECISION y COMPLEX) disponibles para su inclusión en programas fuente MAD utilizando la declaración INCLUDE.
^ Shrager, Jeff. "ELIZA original de Joseph Weizenbaum".
^ 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 (Michigan Algorithm Decoder) 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 IBM 7090, Digital Computer Laboratory, Graduate College, University of Illinois, 1962, 221 páginas
^ ab El decodificador de algoritmos de Michigan (Manual MAD), Bruce W. Arden, edición revisada de 1966
^ abc George Gray (junio de 2002). «UNIVAC y ALGOL». Boletín de noticias sobre la historia de Unisys . 6 (2). Archivado desde el original el 29 de junio de 2017.
^ ab The MAD/I Manual, Bolas, Springer y Srodawa, CONCOMP Technical Report 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
^ Manual de GOM abcd , Don Boettner, Centro de Computación de la Universidad de Michigan, Ann Arbor, junio de 1989
^ abc Lenguajes informáticos: principios e historia
^ En agosto de 2010, cuando se le preguntó sobre la declaración de Jean Sammet de que "MAD no se parece a ALGOL 58 de ninguna manera significativa", Bruce Arden escribió: "Con respecto a Jean Sammet, es posible que haya combinado las dos versiones de IAL (58 y 60 ). A diferencia de la versión posterior, la versión 58 no decía nada sobre qué palabras (o lenguaje) deberían usarse para identificar declaraciones condicionales y de transferencia, lo que llevó, por razones de análisis, a palabras como WHENEVER. También había algunas características adicionales en MAD que iban más allá de las especificaciones de 58".
^ Documentación y fuentes sobre los primeros sistemas de correo electrónico y mensajería, Tom Van Vleck
^ "... Doug McIlroy y Bob Morris escribieron Multics runoff en BCPL basándose en la versión MAD de Jerry Saltzer de RUNOFF para CTSS.", "Características del software de Multics: Sección 1.7.7", sitio web de Multicans. Consultado el 10 de noviembre de 2018.
^ Compatible Time-Sharing System (1961-1973): Fiftieth Anniversary Commemorative Overview, 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: criando pequeños lenguajes». Comunidad O'Reilly . Archivado desde el original el 30 de junio de 2017. Consultado 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 . ISBN978-0-321-19786-3.
^ Galler, Bernard A.; Galler, Enid H. (enero de 2001). "Una entrevista profesional con Bernie Galler". IEEE Annals of the History of Computing . 23 (1): 22–33. doi :10.1109/85.910847. ISSN 1058-6180.
Referencias
Una descripción abreviada del lenguaje del compilador MAD , Fernando J. Corbató , Jerome H. Saltzer , Neil Barta y Thomas N. Hastings, MIT Computation Center Memorandum CC-213, junio de 1963.
CLSYS, un programa para facilitar el uso del traductor MAD para lotes grandes (de tamaño de clase) , Jerome H. Saltzer, MIT Computation Center Memorandum CC-204. Febrero de 1963.
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)
Una 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, págs. 27-28, Datamation, volumen 7, n.º 12 (diciembre de 1961)
Diagramas de flujo del decodificador de algoritmos de Michigan , por GB Smith, Biblioteca de programas generales SHARE, número de distribución SHARE 1327 PA, 1961
Enlaces externos
Retrocompilador de Eric Raymond para MAD
Un ejemplo trivial de un programa MAD
Soporte IBM 7094 de Dave Pitts: tiene un entorno CTSS que incluye la versión MIT de MAD.