MAD (lenguaje de programación)
MAD (Michigan Algorithm Decoder) es un lenguaje de programación y compilador para IBM 704 y, posteriormente, IBM 709, IBM 7090, IBM 7040, UNIVAC 1107, UNIVAC 1108, Philco 210-211 y, finalmente, las computadoras centrales IBM S/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 enseñar programación en colegios y universidades durante la década de 1960 y desempeñó un papel menor en el desarrollo de los sistemas operativos de computadora CTSS, Multics y Michigan Terminal System. La versión original del chatbot ELIZA fue escrita en MAD-SLIP.
Los archivos de la Biblioteca Histórica de 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.
MAD, MAD/I y GOM
Hay tres compiladores MAD:
- Original MAD, el compilador se desarrolló en 1959 en la Universidad de Michigan para el IBM 704 y más tarde los ordenadores IBM 709 e IBM 7090 mainframe ejecutando la Universidad de Michigan Executive System (UMES) y los sistemas operativos Compatibles Time-Sharing System (CTSS). A mediados de la década de 1960 el MAD fue portado en la Universidad de Maryland a la UNIVAC 1108. También se disponía de versiones de MAD para los Philco 210-211 y UNIVAC 1107.
- MAD/I, una versión "extended" de MAD para la serie IBM System/360 de ordenadores que se ejecutan bajo el sistema terminal de Michigan (MTS). El nuevo compilador comenzó en 1965 como parte del proyecto ARPA patrocinado por CONCOMP en la Universidad de Michigan. A medida que avanzaba el trabajo se hizo evidente gradualmente que MAD/I era un nuevo idioma independiente de la versión original de 7090 de MAD.
- GOM ()GOod Old MAD), una reimplementación del original 7090 MAD para la serie IBM System/370 de ordenadores mainframe que ejecutan el sistema terminal de Michigan (MTS). GOM fue creado a principios de los años 80 por Don Boettner en el Centro de Computación de la Universidad de Michigan.
Historia
Si bien MAD fue motivado por ALGOL 58, no se parece a ALGOL 58 de manera significativa.
Los programas escritos en MAD incluían MAIL, RUNOFF, uno de los primeros sistemas de procesamiento de texto y varias otras utilidades, todas bajo el Sistema de tiempo compartido compatible (CTSS). Se trabajó en un diseño de un compilador MAD para Multics, pero nunca se implementó.
La siguiente es una cita interesante de Una entrevista con Brian Kernighan cuando se le preguntó "¿Qué te enganchó en la programación?":
- Creo que lo más divertido que tuve la programación fue un trabajo de verano en el Proyecto MAC en el MIT en el verano de 1966, donde trabajé en un programa que creó 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 distribución de tiempo, que era infinitamente más fácil y más agradable que las tarjetas de puñetazo.
MAD fue bastante rápido en comparación con algunos de los otros compiladores de su época. Debido a que varias personas estaban interesadas en usar 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.
MAD/I tiene una estructura sintáctica similar a ALGOL 60 junto con características importantes del MAD original y de PL/I. MAD/I fue diseñado como un lenguaje extensible. Estaba disponible para su uso en MTS y proporcionó muchas ideas nuevas que se abrieron paso en otros idiomas, pero las compilaciones de MAD/I eran lentas y MAD/I nunca se extendió a un uso generalizado en comparación con el 7090 MAD original.
GOM es esencialmente el lenguaje 7090 MAD modificado y ampliado para la arquitectura 360/370 con algunas adaptaciones juiciosas para adaptarse mejor a las prácticas y problemas de programación actuales. El sistema de mensajes MTS se escribió en GOM.
MAD, Revista MAD y Alfred E. Neuman
En una versión preliminar del MAD original, como referencia a la revista MAD, homónima de MAD, cuando un programa contenía demasiados errores de tiempo de compilación, el compilador imprimía una imagen de página completa de Alfred E. Neuman usando arte ASCII. El pie de foto decía: 'Consulte a este hombre sobre su programa; es posible que desee publicarlo'. Él nunca se preocupa, pero por el aspecto de su programa, usted debería hacerlo." Esta función no se incluyó en la versión oficial final. Sin embargo, se incluyó en la versión de producción del IBM 7040.
Y Bernie Galler recuerda:
- Para cuando diseñamos el lenguaje que pensamos que valdría la pena hacer y para el cual podríamos hacer un compilador, ya no podíamos llamarlo Algol; realmente era diferente. Ahí es cuando adoptamos el nombre de MAD, para el Algorithm Decoder de Michigan. Tuvimos una interacción divertida con la gente de la revista Mad, cuando pedimos permiso para usar el nombre MAD. En una carta muy divertida, nos dijeron que nos llevarían a la corte y todo lo demás, pero terminó la amenaza con un P.S. en el fondo - "Claro, adelante". Desafortunadamente, esa carta está perdida.
"Hola mundo" ejemplo
El mensaje "hola, mundo" programa de ejemplo imprime la cadena "Hola, mundo" a un terminal o pantalla de visualización.
PRINT FORMAT HELLOW VECTOR VALUES HELLOW=$13h0Hello, world*$ FIN DEL PROGRAMA
El primer carácter de la línea se trata como un control de transporte lógico, en este ejemplo, el carácter "0" lo que hace que se imprima una línea a doble espacio.
Alternativamente, se pueden usar contracciones y el compilador las expandirá en la lista:
P'T HELLOW V'S HELLOW=$13h0Hola, mundo*$ E'M
Elementos del lenguaje
MAD y GOM, pero no MAD/I, se componen de los siguientes elementos:
Formato de entrada
Los programas MAD son una serie de declaraciones escritas en tarjetas perforadas, generalmente una declaración por tarjeta, aunque una declaración puede continuar en varias tarjetas. Las columnas 1-10 contienen una etiqueta de declaración opcional, los comentarios o comentarios se marcan con la letra "R" en la columna 11 y las columnas 73-80 no se usan y podrían contener un identificador de secuencia. Los espacios no son significativos en ningún otro lugar que no sea dentro de las constantes de caracteres. Para GOM, la entrada es de forma libre sin campo de secuencia y las líneas pueden tener hasta 255 caracteres; 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 declaraciones tienen la misma forma, una letra seguida de cero a cinco letras o dígitos. Los nombres de las funciones terminan con un punto. Todos los nombres pueden tener subíndices (el nombre seguido de paréntesis, con varios subíndices separados por comas). Para GOM, los nombres pueden tener hasta 24 caracteres y pueden incluir el carácter de subrayado (_).
Pocas palabras clave en el idioma son palabras reservadas ya que la mayoría tienen más de seis letras o están rodeadas por puntos. Hay un conjunto estándar de abreviaturas que se pueden usar para reemplazar las palabras más largas. Estos consisten en la primera y la última letra de las palabras clave con un apóstrofe entre ellas, como W'R para SIEMPRE y D'N para DIMENSIÓN.
Tipos de datos
MAD utiliza el término "modo" para sus tipos de datos. Se admiten cinco modos básicos:
- Integer escrito con o sin un factor de escala (1, +1, -1, 1K10, 1K) o como constantes octales (a 777777777777777K);
- Punto de flotación escrito con o sin exponente (0, 1,5, -0.05, +100.4, -4.,05E-2, -.05E2, 5E02, 5.E2);
- Boolean (1B para el verdadero y 0B para el falso);
- Declaración Label, y
- Nombre de la función escrito como nombre seguido por un período (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 DE BYTE, ENTERO LARGO, PUNTERO y REGISTRO DINÁMICO.
Las constantes alfabéticas o de caracteres se almacenan como números enteros y se escriben usando el signo de dólar como delimitador ($ABCDEF$) con signos de dólar dobles para ingresar un signo de dólar verdadero ($$$.56$ son 56 centavos). Las cadenas de más de seis caracteres se representan mediante matrices.
Arreglos y matrices
- No hay límite en el número de dimensiones.
- Negativo y cero, así como subscriptos de punto flotante se permiten.
- Las matrices se han visto en lugares de memoria consecutivos en el orden determinado por variar el subscripto más adecuado primero.
- Las matrices pueden ser referenciadas usando un subscript para cada dimensión, NOMBRE(s)1, s2, s3), o usando un solo subscript, NOMBRE(s)1).
- Listas de entrada, declaraciones 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 vector, A(1)...A(N) sería A(1), A(2), A(3),..., A(N).
- Hay instalaciones que permiten cambiar las dimensiones a tiempo de ejecución; permitiendo al programador variar la ubicación del elemento inicial en una matriz dentro del bloque general que se ha reservado para la matriz; y permitir que se especifique una asignación arbitraria de almacenamiento.
Operadores
Operadores Aritméticos
Operadores punteros (sólo GOM)
| Operadores de relaciones
Operadores booleanos
Operadores de bits (sólo GOM)
|
Declaraciones de la Declaración
Las variables pueden declararse implícitamente o explícitamente. Por defecto todas las variables declaradas implícitamente se supone que son punto flotante. La declaración NORMAL MODE IS se puede utilizar para cambiar este defecto.
|
|
Declaraciones ejecutables
|
|
Declaraciones de entrada y productos
|
|
Funciones
Los nombres de funciones terminan con un período. Se apoyan 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 y variables. Se permite una definición de las funciones internas. Se permiten funciones recuperativas, aunque la función debe hacer algunos de los trabajos necesarios de ahorro y restauración.
|
|
Definición y redefinición de operadores
Una de las funciones más interesantes de MAD es la capacidad de ampliar el lenguaje mediante la redefinición de operadores existentes, la definición de nuevos operadores o la definición de nuevos tipos de datos (modos). Las definiciones se realizan utilizando sentencias de declaración MAD y mnemónicos de lenguaje ensamblador incluidos después de la declaración hasta la pseudoinstrucción END que implementa la operación.
- DEFINE BINARY OPERATOR definidas, PRECEDENCIA rango existentes MODE STRUCTURE Opciones
- DEFINE UNARY OPERATOR definidas, PRECEDENCIA rango existentes MODE STRUCTURE Opciones
- MODE STRUCTURE modo-no = modo-no existentes modo-no
- MODE STRUCTURE modo-no = modo-no existentes modo-no SAME SEQUENCE AS modo-no existentes modo-no
donde:
- rango es uno de los mismos ASES, más bajo que, o más alto que; y
- Opciones son las opciones que aparecen en la declaración MODE STRUCTURE.
Tres paquetes predefinidos de definiciones (MATRIX, DOUBLE PRECISION y COMPLEX) están disponibles para su inclusión en los programas fuente de MAD mediante la instrucción INCLUDE.
- INCLUIDO paquete
Contenido relacionado
Transporte en Haití
Bill Schelter
Adobe inc.