Podría decirse que la historia de la computación podría dividirse en tres eras: mainframes, minicomputadoras y microcomputadoras. Las minicomputadoras proporcionaron un puente importante entre las primeras mainframes y las omnipresentes microcomputadoras de hoy. Esta es la historia de la PDP-11, la minicomputadora más influyente y exitosa de todos los tiempos.
En su día, las minicomputadoras se utilizaron en una variedad de aplicaciones. Sirvieron como controladores de comunicaciones, controladores de instrumentos, preprocesadores de grandes sistemas, calculadoras de escritorio y administradores de adquisición de datos en tiempo real. Pero también sentaron las bases para avances significativos en la arquitectura de hardware y contribuyeron en gran medida a los sistemas operativos modernos, los lenguajes de programación y la computación interactiva tal como los conocemos hoy.
En el mundo informático actual, en el que cada computadora ejecuta alguna variación de Windows, Mac o Linux, es difícil distinguir entre los procesadores del sistema operativo. Pero hubo un momento en que las diferencias en la arquitectura de la CPU eran un gran problema. El PDP-11 ayuda a explicar por qué fue así.
El PDP-11 se introdujo en 1970, en un momento en que la mayor parte de la informática se realizaba en costosos mainframes de GE, CDC e IBM a los que pocas personas tenían acceso. No había computadoras portátiles, de escritorio o computadoras personales. La programación solo la hacían unas pocas empresas, principalmente en ensamblador, COBOL y Fortran. La codificación se realizó en tarjetas perforadas y los programas se ejecutaron en lotes no interactivos.
Aunque el primer PDP-11 fue modesto, sentó las bases para una invasión de minicomputadoras que haría que una nueva generación de computadoras estuviera más disponible, esencialmente creando una revolución en la informática. El PDP-11 contribuyó al nacimiento de la sistema operativo UNIX y el lenguaje de programación C. También influiría en gran medida en la próxima generación de arquitecturas informáticas. Durante los 22 años de vida útil de la PDP-11, una tenencia sin precedentes según los estándares actuales, se vendieron más de 600 000 PDP-11.
Los primeros modelos PDP-11 no eran demasiado impresionantes. El primer PDP-11 11/20 costó $20,000, pero solo venía con unos 4 KB de RAM. Usaba cinta de papel como almacenamiento y tenía una consola de impresora de teletipo ASR-33 que imprimía 10 caracteres por segundo. Pero también tenía una asombrosa arquitectura ortogonal de 16 bits, ocho registros, 65 KB de espacio de direcciones, un tiempo de ciclo de 1,25 MHz y un bus de hardware UNIBUS flexible que admitiría futuros periféricos de hardware. Fue una combinación ganadora para su creador, Digital Equipment Corporation.
La aplicación inicial del PDP-11 incluía control de hardware en tiempo real, automatización de fábrica y procesamiento de datos. A medida que el PDP-11 ganó reputación por su flexibilidad, programabilidad y asequibilidad, se utilizó en sistemas de control de semáforos, el sistema de defensa antimisiles Nike, control de tráfico aéreo, plantas de energía nuclear, sistemas de entrenamiento de pilotos de la Marina y telecomunicaciones. También fue pionero en el procesamiento de textos y datos que ahora damos por sentado.
Y la influencia del PDP-11 es especialmente evidente en la programación de montaje del dispositivo.
Conceptos básicos de la programación de ensamblaje.
Antes de la invención de lenguajes de alto nivel como Python, Java y Fortran, la programación se hacía en lenguaje ensamblador. La programación en lenguaje ensamblador se puede realizar con muy poca RAM y almacenamiento, lo cual es perfecto para el entorno informático inicial.
El lenguaje ensamblador es un formato intermedio de bajo nivel que se convierte en lenguaje de máquina y luego puede ser ejecutado directamente por la computadora. Es de bajo nivel porque está manipulando directamente aspectos de la arquitectura de la computadora. En pocas palabras, la programación ensambladora mueve sus datos byte a byte a través de registros de hardware y memoria. Lo que hizo diferente la programación del PDP-11 fue que el diseño de la minicomputadora era elegante. Cada instrucción tenía su lugar y cada instrucción tenía un significado.
Un espacio de direcciones de 16 bits significaba que cada registro podía abordar directamente hasta 64 KB de RAM, con los 4 KB superiores reservados para entradas y salidas asignadas a la memoria. Los PDP-11 podrían abordar un total de 128 KB de RAM usando segmentos de registro (más sobre eso en un momento). Entonces, a pesar de que los sistemas PDP-11 se enviaron con solo 4 KB de RAM, aún eran productivos mediante el uso inteligente de las primeras técnicas de programación.
Un programa en lenguaje ensamblador
Este concepto se captura mejor a través de un ejemplo de programa de lenguaje ensamblador PDP-11 simple, que veremos a continuación. Palabras clave que comienzan con un «.» son directivas para el ensamblador. .globl
exporta una etiqueta como un símbolo al enlazador para que la use el sistema operativo. .text
define el inicio del segmento de código. .data
define el inicio de un segmento de datos separado. Las palabras clave que terminan en «:» son etiquetas. La programación de ensamblaje usa etiquetas para direccionar simbólicamente la memoria. (Nota: con la jerga de PDP-11 y la codificación futura, cualquier texto después de / es un comentario).
Palabras clave | Traducción |
.globl _principal | Exporte la etiqueta _main como punto de entrada para que la use el sistema operativo |
.texto | Comienzo del segmento de declaración donde vive el código de solo lectura |
_principal: MOV VAL1, R0 | Copie el valor de la palabra en la ubicación de memoria VAL1 en el registro 0 |
AGREGAR $ 10, R0 | Agregue 10 para registrar el valor 0 |
MOV R0, VAL1 | Copie el valor del registro 0 a la ubicación de memoria VAL1 |
_.Los datos | Inicio del segmento de datos donde viven los datos de lectura/escritura |
VAL1: .palabra $100 | Reserve 2 bytes de almacenamiento para contener Val1, inicializado a 100 |
Aunque se pueden usar valores numéricos para las direcciones de memoria, el uso de etiquetas en lugar de direcciones codificadas facilita la programación y permite la reubicación del código en la memoria. Esto le da al sistema operativo flexibilidad al ejecutar código, asegurando que cada programa sea rápido y eficiente.
La directiva del ensamblador .data coloca los datos en un segmento de memoria que se puede leer y escribir. El montón del código es de solo lectura para evitar que los errores de programación dañen el programa y provoquen bloqueos. Esta separación de instrucción de datos en el PDP-11 se denomina «instrucción y datos separados». Además de agregar estabilidad, esta característica también duplica el espacio de direcciones al habilitar 64 KB para código y 64 KB para datos, lo que se consideró una innovación en ese momento. Como resultado, las microcomputadoras X86 de Intel posteriormente hicieron un uso extensivo de los segmentos.