¿Qué sucederá cuando una computadora no tenga registros?

Puede construir una computadora perfectamente fina y funcional sin registros. Se llama una máquina de pila. En lugar de conjuntos de registros para almacenar operandos, se empujan hacia abajo en una sola pila de último en entrar, primero en salir (LIFO) y se despliegan en orden inverso cuando es necesario en un cálculo.

Las arquitecturas de pila funcionan con cálculos realizados en polaco inverso o postfix.

La corporación Burroughs, uno de la media docena de diseñadores y fabricantes principales de mainframe en la década de 1960, construyó una máquina de este tipo a partir de la serie B5000. Fue bastante exitoso en ese momento y distintivo porque su arquitectura estaba orientada y diseñada en combinación con el software; Fue construido como un sistema integrado. La mayoría de los otros (IBM 360, Honeywell, NCR, Control Data, Sperry y la actual base Intel X86) diseñaron máquinas que contienen hardware ALU con registros y conjuntos de instrucciones a los que los equipos de compilación y SO se adaptaron. El Burroughs B5000 fue diseñado alrededor del lenguaje de programación ALGOL de alto nivel y compiló el código ALGOL en una sola pasada (la mayoría de los otros compiladores fueron de dos pasadas) directamente a la implementación de la máquina sin requerir un lenguaje de ensamblaje intermedio. La compilación para la ejecución fue bastante rápida en comparación con la competencia. La estructura de postfix y la arquitectura de pila desempeñaron un papel clave en esto.

Las arquitecturas de pila tienen una ventaja cuando el espacio físico de su hardware está restringido y es muy caro. Como todas las operaciones se realizan utilizando el valor superior o los dos valores superiores de la pila, no hay campos de direccionamiento de registro en las instrucciones, lo que los hace más pequeños y el código de máquina mucho más denso. La compensación es que quizás necesite más instrucciones, pero la tienda de programas suele ser más compacta que la de las arquitecturas de registro. Debido a la simplicidad de la tienda de operandos, los compiladores son más simples y rápidos y el acceso a los operandos suele ser más rápido que las máquinas de registro, especialmente con conjuntos de registros más grandes. La otra ventaja está en el procesamiento de interrupciones cuando el estado de la máquina tiene que cambiarse. Sin la necesidad de leer, guardar y volver a cargar conjuntos de registros, esto sucede mucho más rápido.

Existen algunas desventajas para las arquitecturas de pila, particularmente con más referencias de memoria, ya que carece de un caché de registro local para almacenar valores temporales.

Las arquitecturas de pila pueden tener algunos registros de propósito especial en la ALU para punteros o valores de estado. También puede tener un diseño híbrido con una pila y algunos registros direccionables para actuar como almacén local de operandos, superando así la desventaja de referencia de memoria.

Otros ejemplos de sistemas de conjuntos de instrucciones de pila son la serie HP 3000 y las computadoras en tándem.

Además de ALGOL, el lenguaje FORTH también estaba orientado hacia arquitecturas de pila. FORTH se hizo popular en sistemas embebidos donde el almacenamiento y el tamaño de ALU estaban restringidos.

Las máquinas de pila virtual también se crearon donde la arquitectura se interpretó en softare. La p-máquina UCSD Pascal fue un ejemplo, al igual que la Máquina virtual Java y Adobe Postscript.

Aquí hay una referencia algo técnica de la revista IEEE Computer para aprender más sobre el funcionamiento de una máquina apiladora (HP 3000 en este caso) escrita en algún momento a mediados de la década de 1970, a juzgar por la foto del autor 🙂

https: //pdfs.semanticscholar.org…

Nota: Estoy usando el término “registro” aquí como un elemento arquitectónico de un diseño ALU (Unidad Aritmética-Lógica), suponiendo que la pregunta se dirija a ese nivel y no al nivel de diseño lógico. De hecho, la implementación de la puerta lógica real de una pila pushdown se realiza con un conjunto de elementos de almacenamiento vinculados que algunos podrían denominar registros. Pero aquí, estoy usando el término registro para referirme a un elemento de almacenamiento que es individualmente direccionable por el conjunto de instrucciones de la máquina.

Si dejamos de lado los dispositivos de E / S, estamos hablando de una CPU sin registros.

En realidad, esto podría ser construir (casi), pero sería una computadora realmente muy lenta. Se puede acceder a los registros dentro de una CPU de manera muy rápida: algunas arquitecturas de CPU pueden agregar dos registros y almacenar el resultado en otro registro dentro de un ciclo de reloj. El acceso a la memoria externa requiere la mayoría de las veces múltiples ciclos de reloj. La menor cantidad de tiempo para el caché L1 que está conectado directamente a la CPU (si no es parte del chip) y progresivamente más lento para los cachés L2 y L3 y en la última etapa la DRAM.

La razón por la que dije que solo puede construir una CPU casi sin registro es el pequeño hecho de que el núcleo mismo de la CPU que hace el “cálculo” (ALU) necesita más de un valor a la vez. Por ejemplo, si desea agregar dos valores, la ALU necesita ambos valores para agregarlos exactamente al mismo tiempo. Y la salida de la adición también debe almacenarse en algún lugar. Entonces, a menos que construya una CPU que pueda acceder al menos a 3 valores de RAM al mismo tiempo, lo que significaría tres buses de datos en lugar de uno, tres buses de direcciones en lugar de uno, necesitará al menos dos registros dentro de la CPU para almacenar uno de los operandos de la operación y el resultado o los dos operandos si almacena el resultado directamente en la RAM.

Esos registros podrían estar completamente ocultos para el programador; por ejemplo, solo puede suministrar un

agregar address1, address2, addressresult

operación al programador que luego se procesaría internamente como

cargar contenido de dirección1 en hiddenr1
cargar contenido de address2 en hiddenr2
agregue hiddenr1 a la tienda hiddenr2 en hiddenresult
escriba el resultado oculto en la memoria ram en la dirección

En realidad, es bastante común que las CPU realicen operaciones externas visibles en múltiples pasos internos. Esto se llama Microcódigo – Wikipedia.

De hecho, las CPU de Intel incluso tienen microcódigo modificable. Al iniciar la computadora, el BIOS puede cargar un nuevo microcódigo en la CPU, por ejemplo, para corregir algunos errores en el funcionamiento de la CPU.

Volviendo a nuestra CPU “sin registro”: si todas las operaciones se realizan en valores en la memoria, una operación que en teoría podría realizarse en 1 ciclo de reloj, por ejemplo

agregar r1, r2 -> r3

podría necesitar docenas de ciclos de reloj ya que se debe acceder al menos a 3 direcciones de memoria externa.

Todo eso significa que su computadora podría ralentizarse fácilmente por un factor de 100 o más.

Será más lento, porque los valores de interés estarán menos disponibles para hacer cálculos.

Los diseñadores sacarán lo mejor de una mala situación y repensarán por completo la arquitectura de la computadora, dejando atrás la separación entre el procesamiento y la memoria, o se adaptarán invirtiendo en:

(1) almacenamiento en caché aún mejor

(2) un conjunto de instrucciones actualizado que está optimizado para un procesador sin estado.

(Dado que la CPU ya no mantiene un registro de contador de programa, presumiblemente cada instrucción especifica la dirección de la siguiente instrucción, o la CPU no sabe qué parte del programa se está ejecutando. Wow).