lunes, 18 de abril de 2011

Los herederos de ENIAC




Las arquitecturas actuales de los procesadores se suelen clasificar en dos: CISC (Complex Instruction Set Computing) y RISC (Reduced Instruction Set Computing).

Aunque ambas se basan en concepciones diferentes de como debe organizarse el hardware dentro del procesador y como es el modelo de programación, tienen algo en común: el juego de instrucciones de ambas familias gira en torno a los registros disponibles que ofrece la arquitectura al programador y en base a la cual se articula la programación.

En la imagen de la derecha apreciamos para las arquitecturas mas conocidas el número de registros y el tipo. De media, los programadores tenemos accesibles unos 16 a 32 registros de proposito general.

Tal vez desde un punto de vista humano, es algo natural la forma de organizar la arquitectura de un procesador en torno a los registros. Los cálculos intermedios se realizan ayudándose de estos registros y cual pequeña hoja de papel, los programadores los usamos para evitar la penalización innata que tiene el acceso a la memoria principal.

Aunque organizar la arquitectura en torno a estos registros facilita la programación, desde un punto de vista de hardware el banco de registros representa todo un reto arquitectónico. Además, se crean dependencias de datos entre instrucciones que o bien a través de código o a través de hardware añadido es necesario controlar.

Existen alternativas a la programación con registros que ayudan a simplificar el hardware, la programación y el diseño de compiladores.


Sobre el año 1963, Borrough's Corporation lanzó al mercado la B5000. Sería la primera de una serie de máquinas que la firma iría lanzando comercialmente a lo largo de la década de los sesenta. Como las demás máquinas de la época, la B5000 ocupaba toda una sala, encerraba bajo su chasis transistores de segunda generación pero algo la diferenciaba de sus contemporáneas. La CPU de la B5000 no tenía registros sino que empleaba una estructura de datos conocida por pila.


La pila es una estructura de datos que sólo permite el acceso al último dato insertado en ella. Las únicas operaciones que la estructura permite son la de apilar un dato (push) o la de sacar el último dato apilado (pop). De esta forma, los operandos de cada instrucción no son indicados al procesador de forma explícita como sucede en los demás procesadores CISC/RISC. En su lugar, la máquina sabe que los operadores necesarios para llevar a cabo la instrucción están en la pila y en función de la instrucción ejecutada, el procesador tomará el número de elementos necesarios de la pila.

El juego de instrucciones de la B5000 explotaba al máximo el uso de la pila. Había operaciones implícitas para extraer los elementos necesarios de una instrucción. Por ejemplo, si queremos sumar 15 y 42, la máquina tomaba de la pila los operandos necesarios para la suma, realizaba la operación y volvía a colocar el resultado en la pila. El uso implícito de la pila hacía que las instrucciones de la B5000 se pudieran empaquetar de 12 en 12 bits.

El desarrollo de la B5000 también tuvo en consideración el diseño de software con lenguajes de alto nivel (ALGOL) y no el ensamblador. La máquina disponía de dos modos de operación, la de ejecución de programas de usuario y un modo privilegiado denominado "control". También diferenciaba entre la ejecución del programa principal de la ejecución de las subrutinas que componían a este (ideal para programas en ALGOL).

Muchas de las características de la B5000 son generales a la familia de máquinas basadas en pila. Desde un punto de vista más formal, las máquinas basadas en pilas se categorizan en razón a tres criterios:
  1. Número de pilas (S=simple, M=multiple)
  2. Tamaño de la pila (S=small, L=large)
  3. Número de operadores de la instrucción (0,1,2)
Nuestra B5000 se categoriza como una máquina SS0 (1 única pila, tamaño de pila pequeño, 0 operadores por instrucción). Todas las máquinas de pila con 0 operadores son denominadas "máquinas de pila pura". Cada categoría tiene sus propias características:
  • Las máquinas SS0, aunque sencillas desde un punto de vista de hardware, tienen un claro cuello de botella en la única pila disponible. El diseño de este tipo de arquitecturas debían prestar especial cuidado con la pila. Por ejemplo, la B5000 tenía dos registros no accesibles al programador (llamados A y B) que contenían los dos primeros elementos de la pila. Esto acelera mucho las operaciones con la pila posibilitando las operaciones en un único ciclo de reloj.
  • Los diseños MS0 y ML0 pueden ser consideradas extensiones de la SS0 pero tienen el atractivo añadido a su simplicidad que carecen de muchos de los problemas de rendimiento que sufren las SS0. El tener varias pilas posibilita de una forma casi directa la programación con varios hilos de ejecución.
  • Los diseños SS1 y SL1 intentan conservar la esencia de las SS0 pero sacrifican la simplicidad de la pila por una combinación de pila más registros auxiliares en un intento de evitar que la pila se convierta en un cuello de botella.
  • Los diseños de pila con 2 operadores no se consideran máquinas basadas en pila. Los procesadores de la familia x86 serían un ejemplo de este tipo de máquinas (concretamente SL2) : el registro SP (stack pointer) de los x86 habilita a esta familia a operar como una máquina de pila pero su funcionamiento no sería "puro" sino una emulación de una máquina SS0. En general, los procesadores CISC/RISC serían típicamente máquinas SL2/ML2. Un ejemplo de máquina ML2 serían los procesadores 680x0 (disponen de 8 registros que pueden ser usados como pilas).
Junto al de la simplicidad de diseño, otro aspecto interesante que comparten las máquinas basadas en pila es su extrema eficiencia minimizando el tamaño de los programas. Las máquinas RISC pueden llegar a necesitar el doble de bits para codificar el mismo programa que una máquina CISC pero es que una máquina CISC puede necesitar entre 3 y 8 veces lo que una máquina basada en pila.

Os recomiendo la lectura de Stack Computers: the new wave de Philip J. Koopman, Jr.

No hay comentarios:

Publicar un comentario en la entrada