Cuando programar significaba mover interruptores

Hay una escena que el cine lleva décadas repitiendo mal: aparece un gran ordenador de los años cincuenta o sesenta, lleno de luces parpadeantes, y algún técnico con bata blanca pulsando interruptores de vez en cuando. La realidad era bastante más interesante, pues aquellos interruptores no estaban allí para decorar ni para impresionar a las visitas, y no se pulsaban cada media hora cuando el operario de turno hacía la ronda con una carpeta de pinza en la mano. En la mayoría de los casos eran literalmente «el teclado» de la máquina.
Las primeras computadoras electrónicas carecían de los sistemas de entrada que hoy damos por supuestos. No existían teclados ni ratones, no había interfaces gráficas ni terminales conectados permanentemente. Incluso antes de que una máquina pudiera leer una cinta de papel o una tarjeta perforada, había que cargar en memoria un pequeño programa inicial, y para introducir ese software se hacía necesario enviarlo bit a bit mediante los interruptores del panel frontal.
Imaginemos una máquina con un bus de 16 bits. En el frontal encontrábamos normalmente dieciséis palancas alineadas horizontalmente, cada una de ellas representando un bit. Interruptor hacia arriba significaba 1; interruptor hacia abajo significaba 0. Si el operador quería introducir el valor binario 0001001000110100, debía colocar exactamente cada interruptor en la posición correcta y, después, pulsar una tecla o palanca de carga para escribir ese valor en memoria. Luego cambiaba la combinación y repetía el proceso para la siguiente instrucción.

En máquinas como el IBM 1130, aquellos interruptores servían además para indicar direcciones de memoria concretas. El operador podía seleccionar una dirección, visualizar su contenido mediante los indicadores luminosos y modificarla manualmente. Era algo parecido a abrir hoy un editor hexadecimal, sólo que en lugar de una ventana tenías una consola metálica llena de bombillas.
El proceso de arranque, además, era especialmente delicado. Supongamos que el ordenador debía cargar el sistema desde una lectora de tarjetas perforadas, pero esa lectora todavía no podía utilizarse porque el equipo no sabía cómo comunicarse con ella. Por lo tanto, primero había que introducir mediante interruptores una rutina extremadamente pequeña, de apenas unas instrucciones en código máquina, que era capaz de leer unas pocas palabras desde la tarjeta. Lo leído contenía un cargador más potente que, a su vez, volcaba en memoria el resto del software. Era un proceso escalonado que los ingenieros llamaban bootstrap (arranque, en castellano), término del que deriva el actual boot de los sistemas operativos.

Un error de un solo bit podía arruinar la operación. Si el operador pretendía introducir una instrucción con valor hexadecimal 3A pero por descuido colocaba un interruptor incorrectamente y escribía 3B, el programa podía dejar de funcionar inmediatamente. No había mensajes explicativos ni depuradores sofisticados, y la solución habitual consistía en volver a revisar una por una las posiciones de los interruptores y compararlas con la documentación técnica.
Las luces del panel frontal eran igualmente importantes, pues no estaban pensadas para mostrar actividad de forma decorativa, como sucedería décadas después en muchos ordenadores domésticos. Habitualmente representaban el contenido de registros internos, direcciones de memoria o líneas de datos. Un operador experimentado podía observar el patrón de luces y deducir si el procesador estaba ejecutando instrucciones, atrapado en un bucle o esperando una entrada externa.
Algunos fabricantes llevaron la idea todavía más lejos. Los llamados sense switches permitían que los programas consultaran directamente el estado de determinados interruptores físicos durante la ejecución. En el IBM 701, por ejemplo, el software podía comprobar si un interruptor concreto estaba activado y tomar decisiones distintas en función de ello. En ciertos sistemas IBM, incluso el lenguaje FORTRAN incorporaba instrucciones específicas para leer estos interruptores y controlar luces del panel frontal. Esto daba lugar a situaciones que hoy resultan difíciles de imaginar, en las que, por ejemplo, un programa científico que llevaba horas ejecutándose podía modificar su comportamiento porque el operador había cambiado la posición de una pequeña palanca. También era posible activar modos de diagnóstico, solicitar información adicional o alterar estrategias de cálculo sin recompilar absolutamente nada, solo moviendo interruptores. En cierto modo, eran las opciones de configuración de una aplicación moderna, pero implementadas directamente en hardware.

Los paneles frontales también eran herramientas de mantenimiento. Cuando una máquina fallaba, los técnicos examinaban las luces para localizar el punto exacto del problema. Muchos manuales de servicio incluían tablas completas indicando qué combinación de indicadores correspondía a determinados errores. Hoy conectamos un depurador o revisamos un registro de eventos; entonces se observaba el comportamiento de las bombillas.
Lo más fascinante de todo es que aquellos operadores desarrollaban una comprensión extraordinariamente profunda de sus sistemas. No trabajaban sobre capas de abstracción, leían directamente los bits, las direcciones de memoria y los registros internos. Cuando un programa no funcionaba, podían seguir visualmente el recorrido de los datos por la máquina. La informática moderna nos ha dado herramientas infinitamente más cómodas, pero también nos ha alejado de esa relación casi física con el hardware.

Quizá por eso cuesta no sentir cierta admiración por aquellos pioneros. Mientras nosotros nos quejamos cuando un IDE tarda siete segundos en arrancar, ellos cargaban el programa inicial de un ordenador colocando docenas de interruptores en la posición correcta uno por uno. Y si se equivocaban en el último bit, tocaba empezar otra vez desde el principio. Eso sí que era programación de bajo nivel.

