El Burroughs Large Systems Group produjo una familia de grandes mainframes de 48 bits que utilizaban conjuntos de instrucciones de máquina de pila con sílabas densas . [ NB 1 ] La primera máquina de la familia fue la B5000 en 1961, que se optimizó para compilar programas ALGOL 60 de manera extremadamente eficiente, utilizando compiladores de una sola pasada. La B5000 evolucionó a la B5500 (disco en lugar de tambor) y la B5700 (hasta cuatro sistemas funcionando como un clúster). Los rediseños importantes posteriores incluyen la línea B6500/B6700 y sus sucesores, así como la línea B8500 independiente.
En la década de 1970, Burroughs Corporation se organizó en tres divisiones con arquitecturas de línea de productos muy diferentes para sistemas informáticos empresariales de gama alta, media y básica. La línea de productos de cada división surgió de un concepto distinto sobre cómo optimizar el conjunto de instrucciones de un ordenador para lenguajes de programación específicos. El término "Burroughs Large Systems" englobaba todas estas líneas de productos de sistemas de gran tamaño, en contraste con los sistemas medianos optimizados para COBOL (B2000, B3000 y B4000) o los sistemas pequeños de arquitectura flexible (B1000).
Fondo
Fundada en la década de 1880, Burroughs fue la empresa de informática más antigua en funcionamiento continuo ( Elliott Brothers se fundó antes que Burroughs, pero no fabricaba dispositivos informáticos en el siglo XIX). A finales de la década de 1950, su equipo informático aún se limitaba a máquinas de contabilidad electromecánicas como la Sensimatic . No tenía con qué competir con sus rivales tradicionales, IBM y NCR , que habían comenzado a producir ordenadores de mayor tamaño, ni con la recién fundada Univac . En 1956, compraron ElectroData Corporation y renombraron su diseño como B205.
La primera máquina desarrollada internamente por Burroughs, la B5000, fue diseñada en 1961 y Burroughs buscó abordar su tardía entrada al mercado con la estrategia de un diseño completamente diferente basado en las ideas de computación más avanzadas disponibles en ese momento. Si bien la arquitectura B5000 está descatalogada, inspiró la B6500 (y las posteriores B6700 y B7700). Las computadoras que utilizaban esa arquitectura todavía se producían como los servidores Unisys ClearPath Libra, que ejecutan una versión evolucionada pero compatible del sistema operativo MCP introducido por primera vez con la B6700. La tercera y más grande línea, la B8500, [ 1 ] [ 2 ] no tuvo éxito comercial. Además de un diseño de procesador CMOS propietario , Unisys también utiliza procesadores Intel Xeon y ejecuta los sistemas operativos MCP , Microsoft Windows y Linux en sus servidores Libra; el uso de chips personalizados se eliminó gradualmente, y para 2018 los servidores Libra habían sido exclusivamente Intel estándar durante algunos años.
B5000, B5500 y B5700
El primer miembro de la primera serie, el B5000, [ 3 ] fue diseñado a partir de 1961 por un equipo bajo el liderazgo de Robert (Bob) Barton . Tenía una arquitectura inusual. El científico informático John Mashey lo ha catalogado como una de las arquitecturas que más admira. "Siempre pensé que era uno de los ejemplos más innovadores de diseño combinado de hardware/software que he visto, y muy adelantado a su tiempo." [ 4 ] El B5000 fue sucedido por el B5500, [ 5 ] que usaba discos en lugar de almacenamiento de tambor, y el B5700, que permitía agrupar múltiples CPU alrededor de un disco compartido. Si bien no hubo un sucesor para el B5700, la línea B5000 influyó mucho en el diseño del B6500, y Burroughs portó el Programa de Control Maestro ( MCP ) a esa máquina.
Características
- El hardware fue diseñado para dar soporte a los requisitos del software.
- Hardware diseñado para soportar exclusivamente lenguajes de programación de alto nivel.
- Conjunto de instrucciones simplificado
- No se utiliza lenguaje ensamblador ni ensamblador; todo el software del sistema está escrito en una variante extendida de ALGOL 60 denominada ESPOL . Sin embargo, ESPOL contiene instrucciones para cada una de las sílabas de la arquitectura.
- Diseño parcialmente basado en datos, etiquetado y descriptor.
- Pocos registros accesibles para el programador
- Máquina de pila donde todas las operaciones utilizan la pila en lugar de operandos explícitos. Este enfoque ha caído en desuso.
- Todas las interrupciones y llamadas a procedimientos utilizan la pila.
- Compatibilidad con otros lenguajes como COBOL.
- Manipulación de cuerdas potente
- Todo el código es automáticamente reentrante : los programadores no tienen que hacer nada más para que cualquier código en cualquier lenguaje se distribuya entre procesadores que usar solo las dos primitivas simples que se muestran.
- Soporte para un sistema operativo (MCP, Programa de Control Maestro )
- Compatibilidad con multiprocesamiento asimétrico (maestro/esclavo)
- Un intento de arquitectura segura que prohíba el acceso no autorizado a los datos o las interrupciones de las operaciones [ NB 2 ]
- Detección temprana de errores que facilita el desarrollo y las pruebas de software.
- Una implementación comercial de memoria virtual, precedida únicamente por el Ferranti Atlas .
- Primer modelo de memoria segmentada
Diseño del sistema
El B5000 fue inusual para su época, ya que su arquitectura y conjunto de instrucciones se diseñaron teniendo en cuenta las necesidades del software. Esto representó un gran cambio con respecto al diseño de sistemas informáticos de la época, donde se diseñaba un procesador y su conjunto de instrucciones para luego entregarlos a los desarrolladores de software.
Los B5000, B5500 y B5700 en modo palabra tienen dos modos de direccionamiento diferentes, dependiendo de si están ejecutando un programa principal (SALF desactivado) o una subrutina (SALF activado). Para un programa principal, el campo T de una sílaba de llamada de operando o de llamada de descriptor es relativo a la tabla de referencia de programa (PRT). Para las subrutinas, el tipo de direccionamiento depende de los tres bits superiores de T y del flip-flop de pila de marca (MSFF), como se muestra en Direccionamiento relativo del B5x00 .
Soporte de idiomas
El B5000 fue diseñado para soportar exclusivamente lenguajes de alto nivel. Esto ocurrió en una época en la que dichos lenguajes comenzaban a ganar popularidad con FORTRAN y posteriormente COBOL . Algunos consideraban que FORTRAN y COBOL eran lenguajes menos robustos en comparación con las técnicas de software modernas, por lo que se adoptó un lenguaje más reciente y prácticamente sin probar: ALGOL-60 . El dialecto de ALGOL elegido para el B5000 fue Elliott ALGOL , diseñado e implementado por primera vez por CAR Hoare en un Elliott 503. Esta fue una extensión práctica de ALGOL con instrucciones de E/S (que ALGOL había ignorado) y potentes instrucciones de procesamiento de cadenas. La famosa conferencia de Hoare al recibir el Premio Turing versó sobre este tema.
Así pues, la B5000 se basaba en un lenguaje muy potente. Donald Knuth había implementado previamente ALGOL 58 en una máquina Burroughs anterior durante los tres meses de sus vacaciones de verano, y participó indirectamente en el diseño de la B5000 como consultor. Muchos descartaron ALGOL, creyendo erróneamente que los lenguajes de alto nivel no podían tener la misma potencia que el ensamblador, y por lo tanto no comprendieron el potencial de ALGOL como lenguaje de programación de sistemas .
El compilador ALGOL de Burroughs era muy rápido , lo que impresionó al científico holandés Edsger Dijkstra cuando presentó un programa para ser compilado en la planta B5000 de Pasadena. Su mazo de cartas se compiló casi de inmediato y enseguida quiso varias máquinas para su universidad, la Universidad Tecnológica de Eindhoven en los Países Bajos. El compilador era rápido por varias razones, pero la principal era que era un compilador de una sola pasada . Los primeros ordenadores no tenían suficiente memoria para almacenar el código fuente, por lo que los compiladores (e incluso los ensambladores) solían necesitar leer el código fuente más de una vez. La sintaxis ALGOL de Burroughs, a diferencia del lenguaje oficial, requiere que cada variable (u otro objeto) se declare antes de su uso, por lo que es factible escribir un compilador ALGOL que lea los datos solo una vez. Este concepto tiene profundas implicaciones teóricas, pero también permite una compilación muy rápida. Los grandes sistemas de Burroughs podían compilar tan rápido como leían el código fuente de las tarjetas perforadas , y contaban con los lectores de tarjetas más rápidos del sector.
El potente compilador COBOL de Burroughs también era de una sola pasada e igual de rápido. Un programa COBOL para 4000 tarjetas se compilaba tan rápido como los lectores, con una capacidad de 1000 tarjetas por minuto, podían leer el código. El programa estaba listo para usarse en cuanto las tarjetas pasaban por el lector.

B6500, B6700/B7700 y sus sucesores
Los B6500 [ 7 ] (entrega en 1969 [ 8 ] [ 9 ] ) y B7500 fueron los primeros ordenadores de la única línea de sistemas Burroughs que ha sobrevivido hasta nuestros días. Si bien se inspiraron en el B5000, tenían una arquitectura totalmente nueva. Entre las diferencias más importantes se encontraban:
- El B6500 tenía instrucciones de longitud variable con una sílaba de 8 bits en lugar de instrucciones de longitud fija con una sílaba de 12 bits .
- El B6500 tenía una palabra de 51 bits [ NB 3 ] en lugar de una palabra de 48 bits, y usaba 3 bits como etiqueta [ 10 ].
- El B6500 tenía procesamiento multiproceso simétrico (SMP).
- El B6500 tenía una chimenea Saguaro.
- El B6500 tenía matrices paginadas.
- El B6500 disponía de registros de visualización, del D1 al D32, para permitir que las subrutinas anidadas accedieran a variables en bloques externos.
- El B6500 utilizaba circuitos integrados monolíticos con memoria magnética de película delgada . [ 8 ]
Entre otros clientes de los B6700 y B7700 se encontraban las cinco universidades de Nueva Zelanda en 1971. [ 11 ]
La supercomputadora ILLIAC IV utilizaba una B6500 como su "computadora de control de E/S", realizando funciones de supervisión para la ILLIAC IV y configurando e iniciando operaciones de E/S hacia y desde la memoria de la ILLIAC IV. [ 12 ]
B8500
La línea B8500 [ 1 ] [ 2 ] deriva de la D825, [ 13 ] una computadora militar que se inspiró en la B5000.
El B8500 fue diseñado en la década de 1960 como un intento de fusionar los diseños del B5500 y el D825. El sistema utilizaba circuitos integrados monolíticos con memoria magnética de película delgada . La arquitectura empleaba una palabra de 48 bits, pila y descriptores como el B5500, pero no se publicitó como compatible con versiones anteriores. [ 1 ] Nunca se logró que el B8500 funcionara de manera confiable, y el proyecto fue cancelado después de 1970, sin haber entregado nunca un sistema completo. [ 2 ]
Historia
El concepto central de memoria virtual apareció en los diseños del Atlas de Ferranti y la computadora del Instituto Rice , y los conceptos centrales de descriptores y arquitectura etiquetada aparecieron en el diseño de la computadora del Instituto Rice [ 14 ] a finales de la década de 1950. Sin embargo, aunque esos diseños influyeron directamente en Burroughs, las arquitecturas de las B5000, B6500 y B8500 eran muy diferentes de las del Atlas y la máquina Rice; también son muy diferentes entre sí.
El primero de los grandes sistemas de Burroughs fue el B5000. Diseñado en 1961, fue un ordenador de segunda generación que utilizaba lógica de transistores discretos y memoria de núcleo magnético , seguido por el B5500 y el B5700. Las primeras máquinas que reemplazaron la arquitectura del B5000 fueron el B6500 y el B7500. Las máquinas sucesoras del B6500 y el B7500 siguieron las tendencias de desarrollo de hardware para reimplementar las arquitecturas en nueva lógica durante los siguientes 25 años, con el B6500, B7500, B6700, B7700, B6800, B7800, B5900, [ NB 4 ] B7900 y finalmente la serie Burroughs A. Después de una fusión en la que Burroughs adquirió Sperry Corporation y cambió su nombre a Unisys , la compañía continuó desarrollando nuevas máquinas basadas en el ASIC CMOS MCP . Estas máquinas fueron desde la Libra 100 hasta la Libra 500, y la Libra 590 se anunció en 2005. Las Libra posteriores, incluida la 590, también incorporan procesadores Intel Xeon y pueden ejecutar la arquitectura de sistemas grandes de Burroughs mediante emulación, así como en los procesadores CMOS MCP. No está claro si Unisys continuará desarrollando nuevos ASIC CMOS MCP.
Líneas principales de hardware
El diseño, desarrollo y fabricación de hardware y software se dividían entre dos ubicaciones principales: en el condado de Orange, California , y en las afueras de Filadelfia . La planta inicial de grandes sistemas, que desarrolló los modelos B5000 y B5500, estaba ubicada en Pasadena, California , pero se trasladó a City of Industry, California , donde desarrolló el B6500. La planta del condado de Orange, ubicada en Mission Viejo, California, pero que en ocasiones incluía instalaciones en las cercanas Irvine y Lake Forest , era responsable de la línea B6x00, de menor tamaño, mientras que las operaciones de la costa este, con sede en Tredyffrin, Pensilvania , gestionaban la línea B7x00, de mayor tamaño. Todas las máquinas de ambas líneas eran totalmente compatibles a nivel de objetos, lo que significa que un programa compilado en una podía ejecutarse en otra. Los modelos más nuevos y grandes tenían instrucciones que no eran compatibles con los modelos más antiguos y lentos, pero el hardware, al encontrar una instrucción no reconocida, invocaba una función del sistema operativo que la interpretaba. Otras diferencias incluyen la forma en que se gestionaban el cambio de proceso y la E/S, así como la funcionalidad de mantenimiento y arranque en frío. Los sistemas más grandes incluían programación de procesos por hardware, módulos de entrada/salida más potentes y procesadores de mantenimiento más funcionales. Cuando los modelos Bxx00 fueron reemplazados por los modelos de la Serie A, se mantuvieron las diferencias, pero ya no eran fácilmente identificables por el número de modelo.
ALGOL
Los grandes sistemas de Burroughs implementan arquitecturas de pila derivadas de ALGOL . El B5000 fue el primer sistema basado en pila.
Si bien B5000 fue diseñado específicamente para admitir ALGOL, esto fue solo un punto de partida. Otros lenguajes orientados a los negocios, como COBOL, también contaban con un buen soporte, sobre todo gracias a los potentes operadores de cadena que se incluyeron para el desarrollo de compiladores rápidos.
El ALGOL utilizado en el B5000 es un subconjunto extendido de ALGOL. Incluye potentes instrucciones para la manipulación de cadenas, pero excluye ciertas construcciones de ALGOL, en particular los parámetros formales no especificados. Un mecanismo DEFINE cumple una función similar a la de las directivas #define en C, pero está completamente integrado en el lenguaje en lugar de ser un preprocesador. El tipo de datos EVENT facilita la coordinación entre procesos, y los bloques ON FAULT permiten gestionar los fallos del programa.
El nivel de usuario de ALGOL no incluye muchas de las construcciones inseguras necesarias para el sistema operativo y otros programas del sistema. Dos niveles de extensiones del lenguaje proporcionan las construcciones adicionales: ESPOL y NEWP para escribir MCP y software relacionado, y DCALGOL y DMALGOL para proporcionar extensiones más específicas para tipos específicos de software del sistema.
ESPOL y NEWP
Originalmente, el sistema operativo B5000 MCP fue escrito en una extensión de ALGOL extendida llamada ESPOL ( Executive Systems Programming Oriented Language ). Este superconjunto de ALGOL 60 proporcionó capacidades de lo que más tarde se denominaría un lenguaje de programación de sistemas [ 24 ] o lenguaje de alto orden orientado a la máquina (mohol), como la interrupción de un procesador en un sistema multiprocesador (los grandes sistemas de Burroughs eran sistemas multiprocesador). ESPOL se utilizó para escribir el Programa de Control Maestro (MCP) en los sistemas informáticos de Burroughs desde el B5000 hasta el B6700. [ 25 ] [ 26 ] [ 27 ] El compilador de una sola pasada para ESPOL podía compilar más de 250 líneas por segundo.
Esto fue reemplazado a mediados o finales de los 70 por un lenguaje llamado NEWP. Aunque NEWP probablemente significaba simplemente "Nuevo lenguaje de programación", existen leyendas en torno al nombre. Una historia común (quizás apócrifa) dentro de Burroughs en ese momento sugería que provenía de " No Executive Washroom Privileges " (Sin privilegios de baño ejecutivo). Otra historia cuenta que, alrededor de 1976, John McClintock de Burroughs (el ingeniero de software que desarrollaba NEWP) nombró al lenguaje "NEWP" después de que le preguntaran, una vez más, "¿ya tiene nombre?": respondiendo "nyoooop", lo adoptó como nombre. NEWP también era una extensión de ALGOL, pero era más seguro que ESPOL y eliminaba algunas complejidades poco utilizadas de ALGOL. De hecho, el compilador de NEWP rechaza todas las construcciones inseguras a menos que un bloque esté marcado específicamente para permitir esas instrucciones. Dicha marcación de bloques proporciona un mecanismo de protección multinivel.
Los programas NEWP que contienen construcciones inseguras no son ejecutables inicialmente. El administrador de seguridad del sistema puede autorizar la ejecución de dichos programas, pero los usuarios normales no pueden hacerlo. (Incluso los usuarios con privilegios, que normalmente tienen privilegios de administrador, podrían no poder hacerlo dependiendo de la configuración del sitio). Si bien NEWP se puede usar para escribir programas generales y cuenta con varias funciones diseñadas para grandes proyectos de software, no es compatible con todas las funcionalidades de ALGOL.
NEWP cuenta con diversas herramientas para facilitar proyectos de software a gran escala, como el sistema operativo, incluyendo interfaces con nombre (funciones y datos), grupos de interfaces, módulos y supermódulos. Los módulos agrupan datos y funciones, permitiendo un acceso sencillo a los datos de forma global dentro del módulo. Las interfaces permiten importar y exportar funciones y datos dentro de un módulo. Los supermódulos permiten agrupar módulos.
DCALGOL y Sistemas de Control de Mensajes (MCS)
En la implementación original, el sistema utilizaba un procesador de comunicaciones de datos (DCP) especializado para gestionar la entrada y salida de mensajes desde y hacia dispositivos remotos. Se trataba de un miniordenador de 24 bits con una arquitectura de registro convencional y capacidad de E/S de hardware para gestionar miles de terminales remotos. El DCP y el B6500 se comunicaban mediante mensajes en memoria, esencialmente paquetes en términos actuales, y el MCS se encargaba del procesamiento de esos mensajes en el lado del B6500. En sus inicios, el DCP contaba con un ensamblador (Dacoma), un programa de aplicación llamado DCPProgen escrito en ALGOL del B6500. Posteriormente, el compilador NDL (Network Definition Language) generaba el código DCP y el archivo de definición de red (NDF). Finalmente, una actualización posterior dio lugar al desarrollo del lenguaje y compilador NDLII, que se utilizaron junto con los DCP de los modelos 4 y 5. Existía una función ALGOL para cada tipo de instrucción DCP, y al llamar a dicha función, los bits de instrucción DCP correspondientes se emitían a la salida. Un programa DCP era un programa ALGOL que consistía únicamente en una larga lista de llamadas a estas funciones, una por cada instrucción en lenguaje ensamblador. En esencia, ALGOL actuaba como la fase de macros de un ensamblador de macros. La primera fase era el compilador ALGOL; la segunda fase consistía en ejecutar el programa resultante (en el B6500), que luego generaba el binario para el DCP.
A principios de la década de 1980, la tecnología DCP fue reemplazada por el ICP (Procesador de Comunicaciones Integrado), que proporcionaba conectividad LAN para el sistema mainframe. Los dispositivos remotos, así como los servidores/mainframes remotos, se conectaban a la red mediante dispositivos independientes denominados CP2000. Los CP2000 fueron diseñados para brindar soporte a los nodos de red en una red distribuida, donde los nodos se conectaban mediante la tecnología de red BNAV2 (Arquitectura de Red Burroughs Versión 2). BNAV2 era el equivalente funcional de Burroughs al producto IBM SNA y admitía la interoperabilidad con entornos IBM en los modos de transporte PUT2 y PUT5. El cambio en el hardware externo de comunicaciones de datos no requirió ninguna modificación del software MCS (Sistema de Control de Mensajes, que se describe más adelante).
Al recibir mensajes, estos se transmitían desde el DCP a través de un bus interno a la pila de procesos DCP del MCP Datacom Control (DCC). Se iniciaba un proceso DCC por cada DCP configurado en el sistema. La pila de procesos DCP se encargaba de que el mensaje entrante se pusiera en cola para su entrega al MCS designado para gestionar el tráfico del dispositivo de origen y devolviera cualquier respuesta al DCP para su entrega al dispositivo de destino. Desde el punto de vista del procesamiento, no se requerían cambios en el software del MCS para gestionar los diferentes tipos de hardware de puerta de enlace, ya fueran los 5 estilos de DCP, el ICP o las combinaciones ICP/CP2000.
Además de ser un servicio de entrega de mensajes, un MCS constituye un nivel intermedio de seguridad entre el código del sistema operativo (en NEWP) y los programas de usuario (en ALGOL u otros lenguajes de aplicación, como COBOL, FORTRAN y, posteriormente, JAVA). Un MCS puede considerarse un programa de middleware y está escrito en DCALGOL (Data Communications ALGOL). Como se mencionó anteriormente, el MCS recibía mensajes de las colas gestionadas por la Datacom Control Stack (DCC) y los reenviaba a la aplicación o función correspondiente para su procesamiento. Uno de los primeros MCS fue CANDE (Command AND Edit), desarrollado como entorno de desarrollo de programas en línea. La Universidad de Otago en Nueva Zelanda desarrolló un entorno de desarrollo de programas similar a CANDE, denominado SCREAM/6700, al mismo tiempo que IBM ofrecía un servicio remoto de tiempo compartido y desarrollo de programas conocido como CALL/360, que se ejecutaba en sistemas IBM serie 360. Otro MCS, llamado COMS, se introdujo alrededor de 1984 y se desarrolló como un sistema de control de procesamiento de transacciones de alto rendimiento . Existían entornos de procesamiento de transacciones predecesores, como GEMCOS (Sistema de Control de Mensajes Generalizado), y una filial australiana de Burroughs desarrolló un sistema de control de transacciones llamado TPMCS (Sistema de Control de Transacciones). Estos sistemas de control de transacciones permitían la entrega de datos de aplicaciones a entornos de producción en línea y el envío de respuestas a usuarios, dispositivos y sistemas remotos.
Los MCS son componentes de software dignos de mención: controlan las sesiones de usuario y permiten realizar un seguimiento del estado del usuario sin necesidad de ejecutar procesos individuales, ya que una única pila MCS puede ser compartida por varios usuarios. El balanceo de carga también se puede lograr a nivel de MCS. Por ejemplo, si se desea gestionar 30 usuarios por pila, se necesitarán dos pilas para entre 31 y 60 usuarios, tres pilas para entre 61 y 90 usuarios, etc. Esto proporciona a las máquinas B5000 una gran ventaja de rendimiento en un servidor, ya que no es necesario iniciar un nuevo proceso de usuario ni crear una nueva pila cada vez que un usuario se conecta al sistema. De esta forma, se puede brindar un servicio eficiente a los usuarios (independientemente de si requieren o no información de estado) con los MCS. Los MCS también constituyen la base del procesamiento de transacciones a gran escala.
Hacia 1988, se desarrolló una implementación de TCP/IP principalmente para un cliente del gobierno estadounidense, utilizando el procesador de comunicaciones distribuidas CP2000 como host del protocolo. Dos o tres años después, la implementación de TCP/IP se reescribió para basarse en la arquitectura host/servidor, con mejoras significativas en rendimiento y funcionalidad. En ese mismo período, se implementó la pila de protocolos OSI, principalmente en el CP2000, pero se implementó una amplia infraestructura de soporte en el sistema principal. Se implementaron todas las aplicaciones definidas por el estándar OSI, incluyendo el alojamiento de correo X.400 y los servicios de directorio X.500.
DMALGOL y bases de datos
Otra variante de ALGOL es DMALGOL (Data Management ALGOL). DMALGOL es una extensión de ALGOL para compilar el software de base de datos DMSII a partir de archivos de descripción de base de datos creados por el compilador DASDL (Data Access and Structure Definition Language). Los diseñadores y administradores de bases de datos compilan las descripciones de la base de datos para generar código DMALGOL adaptado a las tablas e índices especificados. Los administradores no necesitan escribir código DMALGOL. Los programas de usuario normales acceden a la base de datos mediante código escrito en lenguajes de aplicación, principalmente ALGOL y COBOL, extendido con instrucciones de base de datos y directivas de procesamiento de transacciones. La característica más destacada de DMALGOL son sus mecanismos de preprocesamiento para generar código para el manejo de tablas e índices.
El preprocesamiento de DMALGOL incluye variables y bucles, y puede generar nombres basados en variables de tiempo de compilación. Esto permite una personalización mucho mayor que la que ofrecen las herramientas de preprocesamiento que carecen de bucles.
DMALGOL se utiliza para proporcionar rutinas de acceso personalizadas para bases de datos DMSII . Una vez definida la base de datos mediante el Lenguaje de Definición de Estructura y Acceso a Datos (DASDL), el preprocesador traduce el esquema a rutinas de acceso DMALGOL personalizadas y, posteriormente, lo compila. Esto significa que, a diferencia de otras implementaciones de sistemas de gestión de bases de datos (DBMS), a menudo no es necesario código condicional (if/then/else) específico de la base de datos en tiempo de ejecución. En la década de 1970, esta "personalización" se utilizó ampliamente para reducir el tamaño del código y el tiempo de ejecución. Su uso disminuyó considerablemente en años posteriores, en parte porque la optimización de bajo nivel para la memoria y la velocidad se volvió menos crítica, y en parte porque la eliminación del preprocesamiento simplificó la codificación y, por lo tanto, permitió optimizaciones más importantes.
Una versión de ALGOL para aplicaciones, que permite el acceso a bases de datos desde programas de aplicación, se denomina BDMSALGOL e incluye verbos como "FIND", "LOCK", "STORE", "GET" y "PUT" para el acceso a bases de datos y la manipulación de registros. Además, se implementaron los verbos "BEGINTRANSACTION" y "ENDTRANSACTION" para resolver la situación de interbloqueo que se produce cuando varios procesos acceden y actualizan las mismas estructuras.
Roy Guck, de Burroughs, fue uno de los principales desarrolladores de DMSII .
En años posteriores, al reducirse el tamaño del código del compilador, la mayoría de las construcciones de preprocesamiento se pusieron a disposición del usuario de ALGOL. Solo las construcciones no seguras y el procesamiento directo del archivo de descripción de la base de datos siguen restringidos a DMALGOL.
Arquitectura de pila
En muchos sistemas y lenguajes antiguos, a los programadores se les solía recomendar no crear rutinas demasiado pequeñas. Las llamadas y devoluciones de procedimientos eran costosas, ya que se requerían varias operaciones para mantener la pila. El B5000 fue diseñado como una máquina de pila: todos los datos del programa, excepto los arreglos (que incluyen cadenas y objetos), se almacenaban en la pila. Esto significaba que las operaciones de pila estaban optimizadas para la eficiencia. Al ser una máquina orientada a la pila, no dispone de registros direccionables por el programador.
La multitarea también es muy eficiente en las líneas B5000 y B6500. Existen instrucciones específicas para realizar cambios de proceso:
- B5000, B5500, B5700
- Iniciar P1 (IP1) e Iniciar P2 (IP2) [ 5 ] : 6–30
- B6500, B7500 y sus sucesores
- MVST (mover pila). [ 7 ] : 8–19 [ 28 ]
Cada pila y la tabla de referencia de programa (PRT) asociada [ NB 5 ] representa un proceso (tarea o hilo) y las tareas pueden quedar bloqueadas esperando solicitudes de recursos (lo que incluye esperar a que un procesador se ejecute si la tarea ha sido interrumpida debido a la multitarea preventiva). Los programas de usuario no pueden emitir un IP1, [ NB 5 ] IP2 [ NB 5 ] o MVST, [ NB 6 ] y solo hay un lugar en el sistema operativo donde esto se hace.
Un cambio de proceso se desarrolla de la siguiente manera: un proceso solicita un recurso que no está disponible de inmediato, como la lectura de un registro de un archivo en un bloque que no se encuentra en memoria, o bien, el temporizador del sistema ha generado una interrupción. El código del sistema operativo se ejecuta sobre la pila de usuario y desactiva los temporizadores de los procesos de usuario. El proceso actual se coloca en la cola correspondiente al recurso solicitado, o en la cola de procesos listos que espera al procesador si se trata de un cambio de contexto preventivo. El sistema operativo determina el primer proceso en la cola de procesos listos e invoca la instrucción move_stack, que activa el proceso que se encuentra al inicio de la cola.
Velocidad y rendimiento de la pila
El rendimiento de la pila se consideraba lento en comparación con las arquitecturas basadas en registros; por ejemplo, dicha arquitectura se había considerado y descartado para el System/360 . [ 29 ] Una forma de aumentar la velocidad del sistema es mantener los datos lo más cerca posible del procesador. En la pila del B5000, esto se logró asignando las dos posiciones superiores de la pila a dos registros, A y B. La mayoría de las operaciones se realizan en esas dos posiciones superiores de la pila. En máquinas más rápidas posteriores al B5000, se puede mantener una mayor parte de la pila en registros o caché cerca del procesador.
De este modo, los diseñadores de los sucesores actuales de los sistemas B5000 pueden optimizar su código con la técnica más reciente, y los programadores no tienen que modificarlo para que funcione más rápido; ni siquiera necesitan recompilarlo, protegiendo así la inversión en software. Se sabe que algunos programas han funcionado durante años tras numerosas actualizaciones de procesador. Esta aceleración es limitada en las máquinas basadas en registros.
Otro argumento a favor de la velocidad, promovido por los diseñadores de RISC, era que el procesador era considerablemente más rápido si todo estaba integrado en un solo chip. Esto era cierto en la década de 1970, cuando arquitecturas más complejas como la B5000 requerían demasiados transistores para caber en un solo chip. Sin embargo, hoy en día esto no es así, y todos los procesadores sucesores de la B5000 ahora caben en un solo chip, al igual que las técnicas de soporte de rendimiento como las cachés y las tuberías de instrucciones.
De hecho, la línea de sucesores de la serie A del B5000 incluía el primer ordenador central de un solo chip, el Micro-A de finales de la década de 1980. Este chip "computadora central" (denominado SCAMP, por Single-Chip A-series Mainframe Processor) se montaba en una placa de circuito impreso enchufable basada en Intel.
Cómo se asignan los programas a la pila
Aquí hay un ejemplo de cómo los programas se asignan a la estructura de la pila.
comenzar — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Este es el nivel léxico 2 (el nivel cero está reservado para el sistema operativo y el nivel 1 para los segmentos de código). — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — En el nivel 2 colocamos variables globales para nuestro programa. entero i , j , k ; real f , g ; matriz a [0:9]; procedimiento p ( real p1 , p2 ); valor p1 ; — p1 se pasa por valor, p2 se pasa implícitamente por referencia. inicio — — — — — — — — — — — — — — — — — — — Este bloque está en el nivel léxico 3 — — — — — — — — — — — — — — — — — — real r1 , r2 ; r2 := p1 * 5 ; p2 := r2 ; — Esto establece g al valor de r2 p1 := r2 ; — Esto establece p1 a r2 , pero no f — Dado que esto sobrescribe el valor original de f en p1, podría ser un — error de codificación. Por lo tanto, algunos de los sucesores de ALGOL insisten en que — Los parámetros de valor deberían ser de solo lectura, pero la mayoría no lo son. Si r2 > 10 , entonces comienza. — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Una variable declarada aquí hace que este nivel léxico sea 4. — — — — — — — — — — — — — — — — — — — — — — — — — — — — entero n ; — La declaración de una variable convierte esto en un bloque, que invocará alguna — código de construcción de pila. Normalmente no declararás variables aquí, en el que — este sería un enunciado compuesto, no un bloque. ... <== La pila de muestra se está ejecutando en algún lugar aquí. fin ; fin ; ..... p ( f , g ); fin .
Cada marco de pila corresponde a un nivel léxico en el entorno de ejecución actual. Como se puede observar, el nivel léxico se refiere al anidamiento textual estático de un programa, no al anidamiento dinámico de llamadas. Las reglas de visibilidad de ALGOL, un lenguaje diseñado para compiladores de una sola pasada, implican que solo las variables declaradas antes de la posición actual son visibles en esa parte del código, de ahí la necesidad de declaraciones anticipadas. Todas las variables declaradas en los bloques que las contienen son visibles. Otro caso es que variables con el mismo nombre pueden declararse en bloques internos, lo que oculta efectivamente las variables externas, que se vuelven inaccesibles.
El anidamiento léxico es estático, independiente del anidamiento de ejecución con recursión, etc., por lo que es muy raro encontrar un procedimiento anidado a más de cinco niveles de profundidad, y podría argumentarse que tales programas estarían mal estructurados. Las máquinas B5000 permiten un anidamiento de hasta 32 niveles. Esto podría causar dificultades en algunos sistemas que generan código fuente Algol como salida (adaptado para resolver algún problema específico) si el método de generación anida frecuentemente un procedimiento dentro de otro.
Procedimientos
Los procedimientos pueden invocarse de cuatro maneras: normal, llamada, proceso y ejecución.
La invocación normal invoca un procedimiento de la forma habitual en que cualquier lenguaje invoca una rutina, suspendiendo la rutina que realiza la llamada hasta que el procedimiento invocado finalice.
El mecanismo de llamada invoca un procedimiento como una corrutina. Las corrutinas son tareas asociadas que se establecen como entidades síncronas que operan en su propia pila al mismo nivel léxico que el proceso que las inicia. El control se transfiere explícitamente entre el proceso que inicia y la corrutina mediante una instrucción CONTINUE .
El mecanismo de procesos invoca un procedimiento como una tarea asíncrona con una pila independiente que se configura a partir del nivel léxico del procedimiento procesado. Al ser una tarea asíncrona, no hay control sobre el momento exacto en que se transferirá el control entre las tareas, a diferencia de las corrutinas. El procedimiento procesado aún tiene acceso al entorno que lo contiene, lo que constituye un mecanismo de comunicación entre procesos (IPC) muy eficiente. Dado que dos o más tareas ahora tienen acceso a variables comunes, deben sincronizarse para evitar condiciones de carrera, lo cual se gestiona mediante el tipo de datos EVENT, donde los procesos pueden ESPERAR a uno o más eventos hasta que sean provocados por otro proceso cooperativo. Los EVENT también permiten la sincronización por exclusión mutua a través de las funciones PROCURE y LIBERATE. Si por alguna razón la tarea hija termina, la tarea que la invocó puede continuar; sin embargo, si el proceso padre termina, todos los procesos hijos se terminan automáticamente. En una máquina con más de un procesador, los procesos pueden ejecutarse simultáneamente. Este mecanismo EVENT es un habilitador básico para el multiprocesamiento, además de la multitarea.
Tipo de invocación de ejecución
El último tipo de invocación es `run` . Este ejecuta un procedimiento como una tarea independiente que puede continuar después de que finalice el proceso que lo originó. Por esta razón, el proceso hijo no puede acceder a las variables del entorno del proceso padre, y todos los parámetros que se pasan al procedimiento invocado deben recibirse por valor.
De este modo, Burroughs Extended ALGOL incorporaba algunas de las características de multiprocesamiento y sincronización de lenguajes posteriores como Ada . Aprovechaba la compatibilidad con procesos asíncronos integrada en el hardware.
Procedimientos en línea
Una última posibilidad es que en NEWP un procedimiento se declare como INLINE ; es decir, cuando el compilador encuentra una referencia al mismo, el código del procedimiento se genera en línea para ahorrar la sobrecarga de una llamada a procedimiento. Esto se recomienda para fragmentos de código pequeños. Las funciones en línea son similares a las macros parametrizadas, como las #define de C , con la diferencia de que no presentan los problemas con los parámetros que sí pueden ocurrir con las macros.
llamadas asíncronas
En el programa de ejemplo, solo se utilizan llamadas normales, por lo que toda la información se encuentra en una única pila. Para las llamadas asíncronas, se inicia una pila independiente para cada proceso asíncrono, de modo que los procesos comparten datos pero se ejecutan de forma asíncrona.
Registros de visualización
Una optimización de hardware de pila consiste en la provisión de registros D (o de visualización). Los registros D corresponden al ámbito en los programas fuente, es decir, al anidamiento en el código fuente. Estos registros apuntan al inicio de cada marco de pila llamado. Se actualizan automáticamente al entrar y salir de los procedimientos y no son accesibles por ningún software que no sea el MCP. Hay 32 registros D, lo que limita las operaciones a 32 niveles de anidamiento léxico.
Consideremos cómo accederíamos a una variable global de nivel léxico 2 (D[2]) desde el nivel léxico 5 (D[5]). Supongamos que la variable se encuentra a 6 palabras de la base del nivel léxico 2. Por lo tanto, se representa mediante el par de direcciones (2, 6). Si no disponemos de registros D, debemos consultar la palabra de control en la base del marco D[5], que apunta al marco que contiene el entorno D[4]. A continuación, consultamos la palabra de control en la base de este entorno para encontrar el entorno D[3], y continuamos de esta manera hasta haber seguido todos los enlaces hasta el nivel léxico requerido. Este no es el mismo camino que el camino de retorno a través de los procedimientos que se han llamado para llegar a este punto. (La arquitectura mantiene tanto la pila de datos como la pila de llamadas en la misma estructura, pero utiliza palabras de control para diferenciarlas).
Como puede verse, acceder a una variable de esta manera resulta bastante ineficiente. Con los registros D, el registro D[2] apunta a la base del entorno léxico de nivel 2, y para generar la dirección de la variable solo necesitamos sumar su desplazamiento desde la base del marco de pila a la dirección de la base del marco en el registro D. (Existe un operador de búsqueda de lista enlazada eficiente, LLLU, que podría buscar en la pila de la forma descrita anteriormente, pero el método de los registros D sigue siendo más rápido). Con los registros D, el acceso a entidades en entornos externos y globales es tan eficiente como el acceso a variables locales.
Datos de la etiqueta D: pareja de direcciones, comentarios registro
| 0 | n | (4, 1) El entero n (declarado al entrar en un bloque, no en un procedimiento) |-----------------------| | D[4]==>3 | MSCW | (4, 0) La palabra de control de la pila de marcas que contiene el enlace a D[3]. |=======================| | 0 | r2 | (3, 5) El r2 real |-----------------------| | 0 | r1 | (3, 4) El r1 real |-----------------------| | 1 | p2 | (3, 3) Una referencia SIRW a g en (2,6) |-----------------------| | 0 | p1 | (3, 2) El parámetro p1 a partir del valor de f |-----------------------| | 3 | RCW | (3, 1) Palabra de control de retorno |-----------------------| | D[3]==>3 | MSCW | (3, 0) La palabra de control de la pila de marcas que contiene el enlace a D[2]. |=======================| | 1 | a | (2, 7) El arreglo a ======>[bloque de memoria de diez palabras] |-----------------------| | 0 | g | (2, 6) La g real |-----------------------| | 0 | f | (2, 5) La f real |-----------------------| | 0 | k | (2, 4) El entero k |-----------------------| | 0 | j | (2, 3) El entero j |-----------------------| | 0 | i | (2, 2) El entero i |-----------------------| | 3 | RCW | (2, 1) Palabra de control de retorno |-----------------------| | D[2]==>3 | MSCW | (2, 0) La palabra de control de la pila de marcas que contiene el enlace al marco de pila anterior. |=======================| — Fondo de la pila
Si hubiéramos invocado el procedimiento p como una corrutina o una instrucción de proceso, el entorno D[3] se habría convertido en una pila independiente basada en D[3]. Esto significa que los procesos asíncronos aún tienen acceso al entorno D[2], como se implica en el código del programa ALGOL. Yendo un paso más allá, un programa completamente diferente podría llamar al código de otro programa, creando un marco de pila D[3] que apunta al entorno D[2] de otro proceso sobre su propia pila de proceso. En un instante, todo el espacio de direcciones del entorno de ejecución del código cambia, haciendo que el entorno D[2] en la pila de proceso propia no sea directamente direccionable y, en cambio, que el entorno D[2] en la pila de otro proceso sea directamente direccionable. Así es como se implementan las llamadas a bibliotecas. En una llamada entre pilas de este tipo, el código que llama y el código llamado podrían incluso provenir de programas escritos en diferentes lenguajes fuente y compilados por diferentes compiladores.
Los entornos D[1] y D[0] no aparecen en la pila del proceso actual. El entorno D[1] es el diccionario de segmentos de código, que comparten todos los procesos que ejecutan el mismo código. El entorno D[0] representa las entidades exportadas por el sistema operativo.
En realidad, los marcos de pila ni siquiera tienen que existir en la pila de un proceso. Esta característica se utilizó desde el principio para la optimización de E/S de archivos; el FIB (bloque de información de archivo) se enlazaba a los registros de visualización en D[1] durante las operaciones de E/S. A principios de los noventa, esta capacidad se implementó como una característica del lenguaje mediante BLOQUES DE ESTRUCTURA y, combinada con la tecnología de bibliotecas, mediante BLOQUES DE CONEXIÓN. La capacidad de enlazar una estructura de datos al ámbito de direcciones de los registros de visualización implementó la orientación a objetos. Por lo tanto, el B6500 utilizó una forma de orientación a objetos mucho antes de que se acuñara el término.
En otros sistemas, el compilador podría construir su tabla de símbolos de manera similar, pero eventualmente los requisitos de almacenamiento se cotejarían y el código máquina se escribiría para usar direcciones de memoria planas de 16, 32 o incluso 64 bits. Estas direcciones podrían contener cualquier cosa, por lo que una escritura en la dirección incorrecta podría dañar cualquier cosa. En cambio, el esquema de direcciones de dos partes fue implementado por el hardware. En cada nivel léxico, las variables se colocaban en desplazamientos hacia arriba desde la base de la pila del nivel, ocupando típicamente una palabra; las variables de doble precisión o complejas ocuparían dos. Los arreglos no se almacenaban en esta área, solo un descriptor de una palabra para el arreglo. Por lo tanto, en cada nivel léxico el requisito total de almacenamiento no era grande: docenas, cientos o unos pocos miles en casos extremos, ciertamente no una cantidad que requiriera 32 bits o más. Y, de hecho, esto se reflejó en la forma de la instrucción VALC (llamada de valor) que cargaba un operando en la pila. Este código de operación tenía dos bits de longitud y el resto de los bits del byte se concatenaban con el byte siguiente para dar un campo de direccionamiento de catorce bits. El código que se ejecutaba estaría en algún nivel léxico, digamos seis: esto significaba que solo los niveles léxicos del cero al seis eran válidos, por lo que solo se necesitaban tres bits para especificar el nivel léxico deseado. La parte de direccionamiento de la operación VALC reservaba así solo tres bits para ese propósito, quedando el resto disponible para referirse a entidades en ese nivel y en niveles inferiores. Un procedimiento profundamente anidado (es decir, en un nivel léxico alto) tendría menos bits disponibles para identificar entidades: para el nivel dieciséis en adelante, se necesitarían cinco bits para especificar la elección de los niveles 0-31, dejando así nueve bits para identificar no más de las primeras 512 entidades de cualquier nivel léxico. Esto es mucho más compacto que direccionar entidades por su dirección de memoria literal en un espacio de direccionamiento de 32 bits. Además, solo el código de operación VALC cargaba datos: los códigos de operación para ADD, MULT, etc., no realizaban ningún direccionamiento, sino que trabajaban exclusivamente con los elementos superiores de la pila.
Mucho más importante es que este método implicaba que muchos errores posibles en sistemas que empleaban direccionamiento plano no podían ocurrir porque eran simplemente imperceptibles incluso a nivel de código máquina. Una tarea no tenía forma de corromper la memoria utilizada por otra tarea, porque no tenía forma de desarrollar su dirección. El hardware comprobaba los desplazamientos desde un registro D específico con respecto al límite del marco de pila: los valores erróneos se detectaban. De manera similar, dentro de una tarea, un descriptor de matriz contenía información sobre los límites de la matriz, por lo que cualquier operación de indexación era verificada por el hardware: dicho de otro modo, cada matriz formaba su propio espacio de direcciones. En cualquier caso, el etiquetado de todas las palabras de memoria proporcionaba un segundo nivel de protección: una asignación errónea de un valor solo podía ir a una ubicación que contuviera datos, no a una que contuviera un puntero o un descriptor de matriz, etc., y ciertamente no a una ubicación que contuviera código máquina.
Almacenamiento en matriz
Los arreglos no se almacenaban de forma contigua en memoria con otras variables; a cada uno se le asignaba su propio espacio de direcciones, que se localizaba mediante el descriptor. El mecanismo de acceso consistía en calcular en la pila la variable de índice (que, por lo tanto, tenía el rango completo de enteros, no solo catorce bits) y usarla como desplazamiento dentro del espacio de direcciones del arreglo, con comprobación de límites proporcionada por el hardware. Por defecto, si la longitud de un arreglo superaba las 1024 palabras, el arreglo se segmentaba y el índice se convertía en un índice de segmento y un desplazamiento dentro del segmento indexado. Sin embargo, existía la opción de evitar la segmentación especificando el arreglo como LONG en la declaración. En el caso de ALGOL, un arreglo multidimensional empleaba múltiples niveles de direccionamiento. Para una referencia a A[i,j], el primer índice apuntaba a un arreglo de descriptores, un descriptor para cada una de las filas de A, cuya fila se indexaba con j como en un arreglo unidimensional, y así sucesivamente para dimensiones superiores. La comprobación por parte del hardware de los límites conocidos de todos los índices de la matriz evitaría una indexación errónea.
FORTRAN, sin embargo, considera que todos los arreglos multidimensionales son equivalentes a un arreglo unidimensional del mismo tamaño, y para un arreglo multidimensional se utiliza aritmética entera simple para calcular el desplazamiento donde se encontraría el elemento A[i,j,k] en esa secuencia única. El arreglo unidimensional equivalente, posiblemente segmentado si es lo suficientemente grande, se accedería de la misma manera que un arreglo unidimensional en ALGOL. Aunque se impediría el acceso fuera de este arreglo, un valor erróneo para un índice combinado con un valor suficientemente erróneo para otro índice podría no resultar en una violación de los límites del arreglo de secuencia única; en otras palabras, los índices no se verificaron individualmente.
Debido a que el espacio de almacenamiento de un array no estaba limitado en cada lado por el espacio de almacenamiento de otros elementos, el sistema podía "redimensionarlo" fácilmente, aunque cambiar el número de dimensiones estaba impedido porque los compiladores requerían que todas las referencias tuvieran el mismo número de dimensiones. En el caso de ALGOL, esto permitió el desarrollo de arrays "irregulares", en lugar de los habituales arrays rectangulares fijos (o de mayor dimensión). Así, en dos dimensiones, un array irregular tendría filas de diferentes tamaños. Por ejemplo, dado un array grande A[100,100] con valores mayoritariamente cero, una representación de array disperso declarada como SA[100,0] podría tener cada fila redimensionada para contener exactamente los elementos necesarios para almacenar solo los valores distintos de cero de A en esa fila.
Debido a que los arreglos de más de 1024 palabras generalmente se segmentaban, pero los arreglos más pequeños no, en un sistema con poca memoria real, aumentar el tamaño declarado de una colección de arreglos temporales de 1000 a, digamos, 1050, podía significar que el programa se ejecutaría con mucha menos sobrecarga, ya que solo se necesitarían en memoria los segmentos individuales más pequeños en uso. El almacenamiento real para un segmento de arreglo se asignaba en tiempo de ejecución solo si se accedía a un elemento de ese segmento, y todos los elementos de un segmento creado se inicializaban a cero. Por lo tanto, esto desaconsejaba inicializar un arreglo a cero al principio, una omisión generalmente imprudente.
También se admite la equivalencia de matrices. La declaración ARRAY solicitaba la asignación de palabras de datos de 48 bits que podían utilizarse para almacenar cualquier patrón de bits, pero la práctica operativa general era que cada palabra asignada se consideraba un operando REAL. La declaración de:
MATRIZ A [0:99]
Se solicitó la asignación de 100 palabras de tipo REAL en la memoria. El programador también podría especificar que la memoria podría denominarse datos orientados a caracteres mediante la siguiente declaración de equivalencia:
MATRIZ EBCDIC EA [0] = A [*];
o como datos hexadecimales mediante la declaración de equivalencia:
MATRIZ HEXAGONAL HA [0] = A [*];
o como datos ASCII mediante la declaración de equivalencia:
MATRIZ ASCII AA[0] = A[*];
También se admite la capacidad de solicitar matrices de tipos de datos específicos sin equivalencia, por ejemplo:
MATRIZ EBCDIC MY_EA [0:99]
Se solicitó que el sistema asignara una matriz de 100 caracteres. Dado que la arquitectura se basa en palabras, el espacio real asignado es el número de caracteres solicitado, redondeado al siguiente límite de palabra completa.
El descriptor de datos generado durante la compilación indicaba el tipo de datos para el que estaba destinado el array. Si se declaraba una equivalencia de array, se generaba un descriptor de copia que indicaba ese tipo de uso específico, pero que apuntaba al descriptor original (MOM). De este modo, se garantizaba siempre la indexación de la ubicación correcta en la memoria.
También se admiten matrices booleanas, que pueden utilizarse como vectores de bits. Asimismo, se pueden solicitar matrices de enteros.
La discusión inmediatamente anterior utiliza la implementación de la sintaxis ALGOL para describir las declaraciones ARRAY, pero la misma funcionalidad es compatible con COBOL y FORTRAN.
Ventajas de la estructura de pila
Una ventaja de la estructura de pila es que, si un programa falla, se genera un volcado de pila y resulta muy sencillo para el programador averiguar el estado exacto del programa en ejecución. Compárese esto con los volcados de memoria y los paquetes de intercambio de otros sistemas.
Otra característica de la estructura de pila es que los programas son implícitamente recursivos. No se esperaba que FORTRAN admitiera recursión, y quizás uno de los obstáculos para comprender cómo se implementaría ALGOL fue precisamente cómo implementarla. En el B5000, esto no supuso un problema; de hecho, se enfrentaron al problema inverso: cómo evitar que los programas fueran recursivos. Al final, no se molestaron en ello. El compilador Burroughs FORTRAN permitía llamadas recursivas (al igual que todos los demás compiladores FORTRAN), pero a diferencia de muchos otros ordenadores, en un sistema basado en pila, los retornos de dichas llamadas también se ejecutaban correctamente. Esto podía tener efectos extraños, como en un sistema para la manipulación formal de expresiones matemáticas cuyas subrutinas centrales se invocaban repetidamente entre sí sin devolver ningún valor: ¡los trabajos grandes terminaban por desbordamiento de pila!
Así, Burroughs FORTRAN tenía una mejor comprobación de errores que otras implementaciones contemporáneas de FORTRAN. Por ejemplo, para subrutinas y funciones, comprobaba que se invocaran con el número correcto de parámetros, como es habitual en los compiladores de estilo ALGOL. En otros ordenadores, tales discrepancias eran causas comunes de fallos. Lo mismo ocurría con la comprobación de límites de matrices: programas que se habían utilizado durante años en otros sistemas fallaban con frecuencia al ejecutarse en un sistema Burroughs. De hecho, Burroughs se hizo conocido por sus compiladores superiores y su implementación de lenguajes, incluido el Simula orientado a objetos (un superconjunto de ALGOL), e Iverson , el diseñador de APL , declaró que la implementación de APL de Burroughs era la mejor que había visto. John McCarthy , el diseñador del lenguaje LISP , no estaba de acuerdo, ya que LISP se basaba en código modificable ; no le gustaba el código no modificable del B5000 , pero la mayoría de las implementaciones de LISP se ejecutaban en un entorno interpretado de todos modos.
El almacenamiento necesario para los múltiples procesos provenía del conjunto de memoria del sistema según se requería. No era necesario realizar SYSGEN en los sistemas Burroughs, como ocurría con los sistemas de la competencia, para preconfigurar las particiones de memoria en las que se ejecutarían las tareas.
Arquitectura etiquetada
El aspecto más distintivo del B5000 es que se trata de una máquina de pila, como se mencionó anteriormente. Sin embargo, otras dos características muy importantes de su arquitectura son que se basa en etiquetas y descriptores.
En el B5000 original, se reservaba un bit de indicador en cada palabra de control o numérica [ NB 7 ] para identificarla como tal. Esto era, en parte, un mecanismo de seguridad para evitar que los programas pudieran corromper las palabras de control en la pila.
Más tarde, durante el diseño del B6500, se comprendió que la distinción entre palabra de control y número de 1 bit era una idea muy útil, y se extendió a tres bits fuera de la palabra de 48 bits, formando una etiqueta. Los bits de datos son del 0 al 47, y la etiqueta se encuentra en los bits del 48 al 50. El bit 48 era de solo lectura, por lo que las etiquetas impares indicaban palabras de control que no podían ser escritas por un programa de usuario. A las palabras de código se les asignó la etiqueta 3. A continuación, se muestra una lista de las etiquetas y su función:
Internamente, algunas de las máquinas tenían palabras de 60 bits, y los bits adicionales se utilizaban para fines de ingeniería, como un campo de corrección de errores de código Hamming , pero los programadores nunca los veían.
La versión actual de estas máquinas, la Unisys ClearPath, ha ampliado las etiquetas a cuatro bits. El nivel de microcódigo que especificaba etiquetas de cuatro bits se denominaba nivel Gamma.
Las palabras con etiquetas pares son datos de usuario que un programa de usuario puede modificar como estado del usuario. Las palabras con etiquetas impares son creadas y utilizadas directamente por el hardware y representan el estado de ejecución de un programa. Dado que estas palabras son creadas y consumidas por instrucciones específicas o por el hardware, su formato exacto puede variar entre implementaciones de hardware y los programas de usuario no necesitan recompilarse, ya que el mismo flujo de código producirá los mismos resultados, aunque el formato de las palabras del sistema haya cambiado.
Las palabras de etiqueta 1 representan direcciones de datos en la pila. El IRW normal simplemente almacena una dirección vinculada a los datos de la pila actual. El SIRW hace referencia a datos de cualquier pila incluyendo un número de pila en la dirección. Entre otras cosas, los SIRW se utilizan para proporcionar direccionamiento entre pilas de procesos discretas, como las generadas en respuesta a las instrucciones CALL y PROCESS .
Las palabras de la etiqueta 5 son descriptores, que se describen con más detalle en la siguiente sección. Las palabras de la etiqueta 5 representan direcciones de datos fuera de la pila.
La etiqueta 7 es la palabra de control del programa que describe un punto de entrada al procedimiento. Cuando los operadores de hardware acceden a una PCW, se entra al procedimiento. El operador ENTR entra explícitamente a un procedimiento (rutina que no devuelve valor). Las funciones (rutinas que devuelven valor) se entran implícitamente mediante operadores como la llamada de valor (VALC). Las rutinas globales se almacenan en el entorno D[2] como SIRW que apuntan a una PCW almacenada en el diccionario de segmentos de código en el entorno D[1]. El entorno D[1] no se almacena en la pila actual porque puede ser referenciado por todos los procesos que comparten este código. Por lo tanto, el código es reentrante y compartido.
La etiqueta 3 representa las palabras clave, que no aparecerán en la pila. La etiqueta 3 también se utiliza para las palabras de control de pila MSCW, RCW y TOSCW.

Arquitectura basada en descriptores
La figura de la izquierda muestra cómo la arquitectura del Burroughs Large System era fundamentalmente una arquitectura de hardware para la programación orientada a objetos , algo que todavía no existe en las arquitecturas convencionales.
Conjuntos de instrucciones
Existen tres conjuntos de instrucciones distintos para los sistemas grandes de Burroughs. Los tres se basan en sílabas cortas que se distribuyen uniformemente en las palabras.
B5000, B5500 y B5700
Los programas en los procesadores B5000, B5500 y B5700 se componen de sílabas de 12 bits , cuatro por palabra. La arquitectura tiene dos modos: Modo Palabra y Modo Carácter, cada uno con un repertorio de sílabas independiente. Un procesador puede estar en estado de control o en estado normal, y ciertas sílabas solo son admisibles en estado de control. La arquitectura no permite el direccionamiento directo de registros o memoria; todas las referencias se realizan a través de la Tabla de Referencia de Programa de 1024 palabras, el segmento de código actual, las ubicaciones marcadas en la pila o los registros A y B que contienen las dos ubicaciones superiores de la pila. Burroughs numera los bits de una sílaba del 0 (bit alto) al 11 (bit bajo).
B6500 y sus sucesores
Los programas se componen de sílabas de 8 bits , que pueden ser Llamada por Nombre, Llamada por Valor o formar un operador, que puede tener de una a doce sílabas de longitud. Hay menos de 200 operadores , todos los cuales caben en sílabas de 8 bits. Muchos de estos operadores son polimórficos dependiendo del tipo de datos sobre los que se actúa, según lo especificado por la etiqueta. Si ignoramos los potentes operadores de escaneo, transferencia y edición de cadenas, el conjunto básico es de solo unos 120 operadores. Si eliminamos los operadores reservados para el sistema operativo, como MVST y HALT, el conjunto de operadores comúnmente utilizados por los programas de nivel de usuario es inferior a 100. Las sílabas de Llamada por Nombre y Llamada por Valor contienen pares de direcciones ; las sílabas de Operador no usan direcciones o usan palabras de control y descriptores en la pila.
Múltiples procesadores
La línea B5000 también fue pionera al tener dos procesadores conectados entre sí en un bus de alta velocidad como maestro y esclavo. En las líneas B6000, B7000 y B8000, los procesadores eran simétricos. La línea B7000 podía tener hasta ocho procesadores, siempre que al menos uno fuera un módulo de E/S. RDLK (LeaD with LocK) es una forma de sincronización de muy bajo nivel entre procesadores. RDLK opera en un solo ciclo. El mecanismo de nivel superior que generalmente emplean los programas de usuario es el tipo de datos EVENT . El tipo de datos EVENT tenía cierta sobrecarga del sistema. Para evitar esta sobrecarga, se puede utilizar una técnica de bloqueo especial llamada bloqueos Dahm (nombrada en honor a un gurú del software de Burroughs, Dave Dahm). Los bloqueos Dahm utilizaban la instrucción del lenguaje READLOCK ALGOL, que generaba un operador RDLK a nivel de código.
Entre los operadores más destacados se encuentran:
HEYU — envía una interrupción a otro procesador RDLK — Operador de semáforo de bajo nivel: carga el registro A con la ubicación de memoria dada por el registro A y coloca el valor en el registro B en esa ubicación de memoria en un único ciclo ininterrumpible. El compilador Algol generó código para invocar este operador a través de una función especial que permitía una operación de "intercambio" en datos de una sola palabra sin un valor temporal explícito. x:=RDLK(x,y);WHOI — Identificación del procesador IDLE — Inactivo hasta que se reciba una interrupción
Es poco frecuente que dos procesadores se envíen mutuamente un comando 'HEYU' de forma simultánea, lo que provoca un bloqueo conocido como 'un abrazo mortal '.
Influencia del B5000
La influencia directa del B5000 se aprecia en la actual gama de mainframes Unisys ClearPath, descendientes directos del B6500, que a su vez fue influenciado por el B5000, y que aún conservan el sistema operativo MCP tras 40 años de desarrollo continuo. Esta arquitectura se denomina ahora emode (modo de emulación), ya que la arquitectura del B6500 se implementó en máquinas construidas con procesadores Intel Xeon que ejecutaban el conjunto de instrucciones x86 como nativo, con código que emulaba el conjunto de instrucciones del B5000. En esas máquinas también se iba a incluir un nmode ( modo nativo ), pero finalmente se descartó , por lo que es frecuente oír que a las máquinas sucesoras del B6500 se las denomina "máquinas emode".
Las máquinas B5000 se programaban exclusivamente en lenguajes de alto nivel; no tenían lenguaje ensamblador.
La arquitectura de pila del B5000 inspiró a Chuck Moore , el diseñador del lenguaje de programación Forth , quien conoció el B5500 durante su estancia en el MIT. En Forth - The Early Years , Moore describió esta influencia, señalando que las instrucciones DUP, DROP y SWAP de Forth provenían de las instrucciones correspondientes del B5500 (DUPL, DLET, EXCH).
Las máquinas B5000, con su arquitectura basada en pila y memoria etiquetada, también influyeron notablemente en la serie soviética Elbrus de mainframes y supercomputadoras . Las dos primeras generaciones de la serie contaban con memoria etiquetada y CPU basadas en pila, programadas únicamente en lenguajes de alto nivel. Existía una especie de lenguaje ensamblador para ellas, llamado El-76, pero era más o menos una modificación de ALGOL 68 y admitía programación estructurada y procedimientos de primera clase. Sin embargo, las generaciones posteriores de la serie abandonaron esta arquitectura para adoptar las CPU VLIW, similares a las EPIC .
Los diseñadores del sistema empresarial HP 3000 de Hewlett-Packard habían utilizado una B5500 y quedaron muy impresionados por su hardware y software; su objetivo era construir una minicomputadora de 16 bits con un software similar. Varias otras divisiones de HP crearon minicomputadoras o máquinas de microprocesadores similares. El trabajo de Bob Barton sobre la notación polaca inversa (RPN) también se incorporó a las calculadoras HP, comenzando con la 9100A, y en particular a la HP-35 y las calculadoras posteriores.
Los sistemas NonStop diseñados por Tandem Computers a finales de la década de 1970 y principios de la de 1980 también eran máquinas de pila de 16 bits, influenciadas indirectamente por la B5000 a través de la conexión con la HP 3000, ya que varios de los primeros ingenieros de Tandem habían trabajado anteriormente en HP. Alrededor de 1990, estos sistemas migraron a la arquitectura MIPS RISC, pero continuaron admitiendo la ejecución de binarios de máquinas de pila mediante traducción de código objeto o emulación directa. En algún momento después del año 2000, estos sistemas migraron a la arquitectura Itanium y continuaron ejecutando los binarios de máquinas de pila heredados.
Bob Barton también influyó mucho en Alan Kay . Kay quedó impresionado por la arquitectura de etiquetado basada en datos del B5000, lo que influyó en su forma de pensar durante sus desarrollos en programación orientada a objetos y Smalltalk .
Otra característica de la arquitectura B5000 era su seguridad, ya que se ejecutaba directamente sobre el hardware. Esta técnica tiene precedentes en las máquinas virtuales actuales, que buscan proporcionar entornos seguros. Un ejemplo notable es la JVM de Java, que ofrece un entorno aislado y seguro para la ejecución de aplicaciones.
El valor de la vinculación entre hardware y arquitectura que existía antes de emode se conservaría sustancialmente en las máquinas basadas en x86, en la medida en que MCP era el único programa de control, pero el soporte que ofrecían esas máquinas seguía siendo inferior al que proporcionaban las máquinas donde el conjunto de instrucciones B6500 era el conjunto de instrucciones nativo. Una arquitectura de procesador Intel poco conocida que, de hecho, precedió a las implementaciones de 32 bits del conjunto de instrucciones x86, el Intel iAPX 432 , habría proporcionado una base física equivalente, ya que también era esencialmente una arquitectura orientada a objetos.
Véase también
Notas
- ↑ Por ejemplo, sílabas de 12 bits para B5000, sílabas de 8 bits para B6500
- ↑ Hubo problemas de seguridad
- ↑ Sin contar los controles de error
- ↑ A pesar del número de modelo, el B5900 tenía una arquitectura B6500 en lugar de una arquitectura B5000.
- 1 2 3 Solo para B5000, B5500 y B5700
- ↑ Solo para B6500, B7500 y modelos posteriores
- ↑ No había ningún bit de bandera en las palabras que contenían datos de caracteres o código.
Referencias
- Manual completo de ALGOL (tres volúmenes), Donald J. Gregory.
- Arquitectura de computadoras: un enfoque estructurado, R. Doran, Academic Press (1979).
- Computadoras apiladas: La nueva ola, Philip J. Koopman, disponible en:
- Manuales de los modelos B5500, B6500, B6700, B6800, B6900 y B7700 en: bitsavers.org
- 1 2 3 John T. Lynch (agosto de 1965), " The Burroughs B8500" (PDF) , Datamation : 49–50
- 1 2 3 4 George Gray (octubre de 1999), "Burroughs Third-Generation Computers" , Unisys History Newsletter , 3 (5), archivado del original el 26 de septiembre de 2017
- ↑ Burroughs (1963), Características operativas de los procesadores para el Burroughs B5000 (PDF) , Revisión A, 5000-21005
- ↑ John Mashey (15 de agosto de 2006). "Diseños admirados / diseños para estudiar" . Grupo de noticias : comp.arch . Usenet: 1155671202.964792.162180@b28g2000cwb.googlegroups.com . Consultado el 15 de diciembre de 2007 .
- 1 2 Burroughs (mayo de 1967), Manual de referencia del sistema de procesamiento de información Burroughs B5500 (PDF) , 1021326
- ↑ Tomado de "Tabla 5-1 Tabla de direccionamiento relativo". Manual de referencia de los sistemas de procesamiento de información Burroughs B5500 (PDF) . Documentación de sistemas. Burroughs Corporation. Mayo de 1967. págs. 5-4 . 1021326.
- 1 2 Manual de referencia del sistema de procesamiento de información Burroughs B6500 (PDF) , Burroughs, septiembre de 1969, 1043676
- 1 2 "Narrativa histórica de la década de 1960; EE. UU. contra IBM, Anexo 14971, Parte 2" . ed-thelen.org . Gobierno de EE. UU. 22 de julio de 1980. pág. 648 (409) . Consultado el 21 de febrero de 2019 . URL alternativa
- ↑ Archivado en Ghostarchivey la Wayback Machine: Burroughs Corporation (1969), Informe de estado de la Burroughs B6500 (película), Nigel Williams (publicado el 08/08/2015), Código de tiempo: 1969 estado - 0:00-0:52, 6:04-7:01, 8:14; fecha - 3:40, 4:21 , recuperado el 04/03/2019
- Tasa de envíos, primeras 16 computadoras: burroughs :: B6500 6700 :: CUBE XVI B6500 Estado Abr70 . Abr 1970. págs. 1–2 .
- ↑ Hayes, John P. (1978). Arquitectura y organización de computadoras . págs. 148–149 . ISBN 0-07-027363-4.
- ↑ "Exposiciones sobre la historia de la informática: Cuarta planta" . Universidad de Auckland . Consultado el 18 de mayo de 2020 .
- ↑ Resumen técnico del ILLIAC IV (PDF) . 22 de abril de 1968. B-176-B.
- ↑ Anderson, James P.; Hoffman, Samuel A.; Shifman, Joseph; Williams, Robert J. (1962), "D825 - un sistema de computadoras múltiples para comando y control", Actas de la Conferencia Conjunta de Computadoras de Otoño del 4 al 6 de diciembre de 1962, Actas de la Conferencia AFIPS, vol. 24, págs. 86–96 , doi : 10.1145/1461518.1461527 , ISBN 9781450378796, S2CID 1186864
{{cite book}}: Incompatibilidad de ISBN/Fecha ( ayuda ) - ↑ Henry M. Levy , "Capítulo 2 Arquitecturas de descriptores tempranas" (PDF) , Sistemas informáticos basados en capacidades , Digital Press
- ↑ "Anuncio B5500" (PDF) . Burroughs. 11 de agosto de 1964.
- ↑ "Los ordenadores antiguos de Dave - Otras máquinas" . Unisys A7-311 . Consultado el 30 de marzo de 2023 .
- ↑ "Foto de SCAMP en las computadoras antiguas de Dave" . Consultado el 30 de marzo de 2023 .
- ↑ Reitman, Valerie (18 de enero de 1989), "Unisys lista para ofrecer un mainframe de escritorio" , The Philadelphia Inquirer , archivado del original el 26 de abril de 2012 , consultado el 16 de abril de 2011.
- 1 2 "Historia de la empresa" . 9 de julio de 2021. Recuperado el 28 de agosto de 2021 .
- 1 2 "Unisys allana el camino para los clientes de la serie A & OS 2200" . Consultado el 28 de agosto de 2021 .
- ↑ "Unisys acelera el resurgimiento de los mainframes con los nuevos servidores ClearPath Enterprise y una nueva estrategia de precios agresiva. - Business Wire - HighBeam Research" (Comunicado de prensa). 8 de junio de 1998. Archivado del original el 16 de mayo de 2011.
- ↑ "Libra 595" . Unisys.
- ↑ "Libra 750" . Unisys. 24 de junio de 2021. Archivado del original el 11 de marzo de 2020. Consultado el 16 de mayo de 2018 .
- ↑ Bergeron, RD; et al. (15 de diciembre de 1972). «Lenguaje para el desarrollo de sistemas». En Rubinoff, Morris (ed.). Avances en informática . Vol. 12. Nueva York; Londres: Academic Press . pág. 282. ISBN 978-0080566443.
- ↑ Personal (1966). Manual de referencia B5500 ESPOL (PDF) . Detroit , Michigan: Burroughs Corporation – vía Computer History Museum .
- ↑ Personal (enero de 1970). Manual de referencia B6500 ESPOL (PDF) . Detroit , Michigan: Burroughs Corporation – vía Computer History Museum .
- ↑ Personal (27 de junio de 1972). Manual de información del lenguaje de programación del sistema ejecutivo B6700/B7700 (ESPOL) (PDF) . Detroit , Michigan: Burroughs Corporation – vía Computer History Museum .
- ↑ Organick, Elliot (1973). Organización de sistemas informáticos . ACM . págs. 115–117 . ISBN 0-12-528250-8.
- ↑ GM Amdahl; GA Blaauw; FP Brooks (abril de 1964). "Arquitectura del IBM System/360" . IBM Journal of Research and Development . 8 (2): 87– 101. doi : 10.1147/rd.82.0087 . Recuperado el 10 de septiembre de 2021 a través de ResearchGate.
Lecturas adicionales
- Barton, Robert S. (1961). "Un nuevo enfoque para el diseño funcional de una computadora digital". Actas de la Conferencia Conjunta de Computación del Oeste . ACM. doi : 10.1145/1460690.1460736 .
- Waychoff, Richard; Turner, Lloyd; Rosin, Robert F.; Pearson, Ralph W.; Oliphint, G. Clark; MacKenzie, F. Brad; MacDonald, Ray W.; MacDonald, Duncan N.; Lonergan, William D.; Kreuder, Norman L.; King, Paul D.; Hootman, Joseph T.; Hauck, Erwin A.; Hale, John E.; Galler, Bernard A.; Ford, James; Eppert, Ray R.; Dent, Benjamin A.; Dahm, David M.; Creech, Bobby A.; Collins, George A.; Berce, Henri; Barton, Robert S. (6 de septiembre de 1985). "La Conferencia Burroughs B 5000" . Instituto Charles Babbage , Universidad de Minnesota .La serie de ordenadores Burroughs 5000 fue analizada por las personas responsables de su desarrollo y comercialización desde 1957 hasta la década de 1960 en una conferencia celebrada en 1985 y patrocinada por AFIPS y Burroughs Corporation .
- Gray, George (marzo de 1999). "Algunas computadoras de transistores Burroughs" . Boletín de historia de Unisys . 3 (1). Archivado del original el 1 de octubre de 2016.
- Gray, George (octubre de 1999). "Computadoras Burroughs de tercera generación" . Boletín de historia de Unisys . 3 (5). Archivado del original el 26 de septiembre de 2017.
- Hauck, EA; Dent, Ben A. (1968). Mecanismo de pila Burroughs B6500/B7500 . Spring Joint Computer Conference. pp. 245– 251. doi : 10.1145/1468075.1468111 .
- McKeeman, William M. (1967). Diseño de computadoras dirigido por lenguaje . Conferencia conjunta de computación de otoño. págs. 413–417 . doi : 10.1145/1465611.1465665 .
- Organick, Elliot I. (1973). Organización de sistemas informáticos: la serie B5700/B6700 (PDF) . Academic Press.
- Waychoff, Richard (27 de septiembre de 1979). "Historias del B5000 y de las personas que estuvieron allí" (PDF) . Archivado del original (PDF) el 4 de marzo de 2016.
- Allweiss, Jack. "El Burroughs B5900 y el modo E: Un puente hacia la informática del siglo XXI. Edición revisada de 2018" .
- Martin, Ian. "'Demasiado adelantado a su tiempo': Gran Bretaña, Burroughs y la banca en tiempo real en la década de 1960" , Reunión Anual de la Sociedad para la Historia de la Tecnología, del 20 de septiembre al 3 de octubre de 2010, Tacoma, EE. UU.
Enlaces externos
- La página de Burroughs de Ian Joyner
- El Burroughs B5900 y el modo E: Un puente hacia la informática del siglo XXI - Jack Allweiss
- (Archivo web de:) Ralph Klimek en el B7800 en la Universidad de Monash
- "Primeras máquinas de Burroughs" , Museo de Informática de la Universidad de Virginia .
- "Organización de sistemas informáticos" , Serie de monografías de la ACM.
- Índice de manuales del B8500
- Proyecto de emulación B5500. Proyecto para crear un emulador funcional para el sistema informático Burroughs B5500.
- "Película y transcripción de Burroughs B6500"
- Computadoras centrales Burroughs
- Arquitectura informática de lenguajes de alto nivel
- Máquinas apiladoras
- Computadoras transistorizadas
- Unisys
- Introducciones relacionadas con la informática en 1961
- La década de 1960 en la informática
- La década de 1970 en la informática
- La década de 1980 en la informática
- computadoras de 48 bits