Grandes momentos de la informática (I)

No voy a hablar meticulosamente cual clase de Historia acerca de los avances informáticos desde el ábaco, ni el ordenador no-programable creado por Wilhelm Schickard en 1623 o la inacabada máquina de calcular de Charles Babbage y Ada Lovelace, la primera programadora (Siglo XIX), sino que voy a pasar directamente a momentos cumbre que llamaron mi atención.

Es bien conocida la historia de Alan Turing en la segunda guerra mundial: Su teoría de Máquina de Turing y la fabricación de Colossus en 1.943, el ordenador para decodificar los mensajes nazis codificados con Enigma:

Colossus. Fotografia tomada del banco de imágenes FreePik

Sin embargo es mucho menos conocida la historia del Z3 de 1.941. Según Wikipedia:

«La computadora Z3, creada por Konrad Zuse en 1941, fue la primera máquina programable y completamente automática, características usadas para definir a un computador.» […] «En 1998 Raúl Rojas demostró que el Z3 es Turing completo

Tenía 2.300 relés, frecuencia de 5 Hz y un ancho de palabra de 22 bits.

Z3. Fotografía: De Venusianer, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=3632073

Para lograrlo su inventor Konrad Zuse recurrió a la base binaria, el álgebra booleana y la implementación de esta con relés, descubrimientos clave anteriores (3 siglos tenía ya la base binaria). Zuse fue el primer programador «práctico» ya que Ada se quedó sólo en la teoría. Por cierto, la máquina de Babbage finalmente fue construida en 1.991 y funcionaba tal cual la diseñó Babbage con álgebra decimal, que fue lo que la lastró en su momento por su complejidad.

El hito alemán del Z3 suele pasar desapercibido debido a la segunda guerra mundial. Del mismo modo el Z1 fue el primer ordenador electromecánico (1.938) en lugar del Mark I de IBM (1.944), pero el Z3 era tecnológicamente superior, y más rápido.

La máquina de Harvard: El Mark I

Mucho más conocido que los Z, el Mark I estadounidense fue fabricado por IBM y enviado a Harvard en 1.944. Se trataba de la implementación binaria y booleana de la máquina de Babbage.

Mark I. Fotografía: CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=601387

Debido a que se basaba en la máquina de cálculo de Babbage era parcialmente mecánica programándose en lenguaje máquina con interruptores: «Funcionaba con relés, se programaba con interruptores y leía los datos de cintas de papel perforado», según Wikipedia. Aún no se había inventado el lenguaje Ensamblador.

Las partes mecánicas las movía con electromagnetismo por lo que era un ordenador electromecánico como el Z1. También suponía unas medidas y peso enormes: «Medía unos 15,5 metros de largo, unos 2,40 metros de alto y unos 60 centímetros de ancho, y pesaba aproximadamente cinco toneladas.» Pero lo más impresionante es que tenía 800 kilómetros de cables.

El tiempo mínimo por operación era 0,3 segundos y hacía un escándalo al funcionar comparable a una habitación llena de mecanógrafos.

No fue una reacción al Z3 porque se presentó el proyecto a IBM en 1.937.

Hoy en día se utiliza la arquitectura Harvard en procesadores digitales de señales o D.S.P. y en microcontroladores sin memoria cache para separar y usar a la vez memoria de datos e instrucciones y compensar así el rendimiento (de no tener cache).

El Z2 dejó atrás esta tecnología electromagnética usando en su lugar relés, y fue perfeccionado en el Z3.

Las válvulas de vacío: ENIAC y UNIVAC.

El sustituto de los relés fueron las válvulas de vacío. Se utilizaron en la máquina experimental ENIAC (1.944) en la universidad de Pensilvania, U.S.A.

ENIAC. Foto: De United States Army – Image from [1], Dominio público, https://commons.wikimedia.org/w/index.php?curid=978783

Las válvulas de vacío se utilizaron en (¿casi?) todos los ordenadores posteriores hasta ser sustituidas por transistores desde 1.956. Los transistores (Inventados en 1.947) dieron lugar a la «segunda generación de la informática».

Una vez más los Z alemanes fueron eclipsados: El Z4 fue el primer ordenador vendido comercialmente en 1.950, no el UNIVAC estadounidense (De los creadores de ENIAC) ni el Ferranti Mark 1 británico, vendidos en 1.951.

Los creadores de ENIAC fabricaron el UNIVAC (1.951) y lo vendieron a la oficina del censo de Nueva York. Utilizaba cintas magnéticas y se programaba en lenguaje compilado A-0.

Wikipedia:

«El Sistema A-0 fue escrito por la oficial Grace Hopper en 1951 y 1952 para UNIVAC I. Fue el primer compilador desarrollado para una computadora electrónica. El A-0 funcionaba más como un cargador o enlazador que como la noción moderna de compilador. Un programa era especificado como una secuencia de subrutinas y argumentos. Las subrutinas eran identificadas por un código numérico y los argumentos de las subrutinas eran escritas directamente después de cada código de subrutinas. El sistema A-0 convertía la especificación en código máquina que podía ser alimentado a una computadora para ejecutar el programa.»

Medio de almacenamiento: La cinta magnética.

El Univac innovó además de en el primer lenguaje compilado en un modo de almacenar grandes cantidades de datos reemplazables: Las cintas magnéticas permitían ir mucho más allá de las cintas de papel de la máquina de Turing teórica y las usadas en los ordenadores de los años 40. Permitían funcionar no sólo como dispositivo de salida de información, sino que también podían leerlo. Ya no era necesario programar con interruptores ni usar tarjetas o cintas perforadas. La densidad de información era mucho mayor y también la velocidad de lectura y escritura. Y era más duradero que el papel. No obstante los programas seguían escribiéndose en código máquina salvo en los ordenadores que soportaban lenguaje Ensamblador.

Las cintas magnéticas eran intercambiables a diferencia del tambor magnético.

Medio de almacenamiento: Tambor magnético.

Inventado en 1932 por Gustav Tauschek, en Austria. En 1.954 IBM fabricó un antecesor del disco magnético, el tambor magnético. Se diferencian de las cintas en la capacidad de acceder a cualquier dato (acceso aleatorio) en lugar de limitarse a la lectura/escritura secuencial de las cintas. Al no ser extraible como los discos y ser muy voluminoso, también se puede considerar al tambor magnético antepasado del disco duro.

Fue usado por algunos ordenadores como memoria principal. Años después la RAM se convirtió en la memoria principal por ser mucho más rápida, y relegó a los medios de almacenamiento a ser únicamente memoria secundaria.

Lenguaje Ensamblador.

2 años antes del A-0 de UNIVAC, en 1.949 llegó la segunda generación de lenguajes de programación: El código máquina comenzó a sustituirse por lenguaje ensamblador, pero no había una sintaxis común. Cada fabricante que lo empleaba diseñaba una versión para su ordenador.

Se trataba de una adaptación legible para los humanos del código máquina. Ya no se operaba mediante números: Los «mnemónicos» (sentencias) representaban el tipo de operación a realizar mediante pocos caracteres, como un alias de números que codificaban instrucciones en código máquina. Las direcciones de memoria no eran largos números binarios sino breves hexadecimales (de 0 a F) abarcando con pocos caracteres grandes cantidades de memoria (RAM, ROM, almacenamiento…), y en general todo era más fácil que en código máquina. Más tarde, a medida que se hacían más complejos, los ordenadores tuvieron más instrucciones para ahorrarse pasos, abreviar la programación y aumentar el rendimiento.

Citando a Wikipedia:

«En 1946 se desarrolló la primera computadora digital. En un principio, estas máquinas ejecutaban instrucciones consistentes en códigos numéricos que señalaban a los circuitos de la máquina los estados correspondientes a cada operación, lo que se denominó lenguaje máquina.

Pronto los primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus programas mediante claves más fáciles de recordar que esos códigos; al final, todas esas claves juntas se traducían manualmente a lenguaje máquina. Estas claves constituyen los llamados lenguajes ensambladores.»

Compiladores y Lenguajes de alto nivel: Fortran.

El ensamblador seguía siendo demasiado complejo de utilizar y de aprender, así que se siguió investigando en cómo facilitar y acelerar la programación. Esto dio lugar a los lenguajes basados en idiomas humanos (Inglés) llamados «lenguaje de alto nivel», usando un programa traductor o compilador que traducía a lenguaje máquina. Sin embargo estos lenguajes tienen que traducirse a algo que la máquina entienda, el código máquina, y se hace mucho más lentamente que traduciendo ensamblador.

Mientras que un lenguaje interpretado línea por línea es lento al traducirse sobre la marcha, un programa previamente compilado es mucho más rápido al estar ya traducido a lenguaje máquina.

Wikipedia:

«El primer compilador fue escrito por Grace Hopper, en 1952 para el lenguaje de programación A-0. En 1950 John Backus dirigió una investigación en IBM sobre un lenguaje algebraico. En 1954 se empezó a desarrollar un lenguaje que permitía escribir fórmulas matemáticas de manera traducible por un ordenador; le llamaron FORTRAN (FORmulae TRANslator). Fue el primer lenguaje de alto nivel y se introdujo en 1957.»

El lenguaje compilable A-0 del Univac era tipo ensamblador, de «bajo nivel» y por lo tanto cercano al lenguaje máquina y complejo de utilizar.

Fortran, un lenguaje de alto nivel para fórmulas matemáticas, es mucho más importante históricamente y mucho más extendido. Está orientado a resolver problemas matemáticos y ha tenido un amplio uso científico y militar. En sus versiones modernas todavía es muy utilizado en el ámbito científico por su velocidad resolviendo problemas matemáticos.

Segunda generación de la Informática.

En 1.956 comenzaron a sustituirse las grandes válvulas de vacío por los pequeños transistores. En este contexto histórico ya estaba inventado el almacenamiento masivo en cintas magnéticas, el tambor magnético (Híbrido entre disco duro y RAM), el Ensamblador, el compilador, y sólo un año después el lenguaje de alto nivel FORTRAN.

Fuente: https://sites.google.com/site/osupaep2010/home/introduccion/la-segunda-generacion-1955-1965

Lenguajes de alto nivel: COBOL

La oficial Grace Hooper creó nuevos lenguajes después del A-0: Uno de ellos fue el Flow-Matic en el que se inspira COBOL.

Algunos sistemas clave llevan décadas funcionando sobre COBOL y nadie se atreve a tocarlos. Es famoso el caso del programa de gestión de contratos de Defensa de Estados Unidos del que dependen muchos millones de dólares.

Fue diseñado con la misma intención que Java: Un único código que funcione en todas las máquinas. Un estándar acordado entre distintos fabricantes y el gobierno de U.S.A.

Wikipedia:

«En la creación de este lenguaje participó la comisión CODASYL, compuesta por fabricantes de ordenadores, usuarios y el Departamento de Defensa de Estados Unidos en mayo de 1959. La definición del lenguaje se completó en poco más de seis meses, siendo aprobada por la comisión en enero de 1960. El lenguaje COBOL fue diseñado inspirándose en el lenguaje Flow-Matic de la oficial Grace Hopper y el IBM COMTRAN de Bob Bemer, ya que ambos formaron parte de la comisión.»

Se trata de un lenguaje más legible que el FORTRAN original, aunque por lo que veo al principio se utilizaba con tarjetas perforadas y números. No obstante también he encontrado imágenes de tarjetas perforadas de COBOL.

Fue muy utilizado en el ámbito de las finanzas y contabilidad. No en vano la B de sus siglas significa «bussiness», negocios.

Fuente: https://medium.com/modern-mainframe/beginners-guide-cobol-made-easy-introduction-ecf2f611ac76

Memoria RAM:

Cito a WikiPedia:

Uno de los primeros tipos de memoria RAM fue la memoria de núcleo magnético, desarrollada entre 1949 y 1952 y usada en muchos computadores hasta el desarrollo de circuitos integrados a finales de los años 60 y principios de los 70. Esa memoria requería que cada bit estuviera almacenado en un toroide de material ferromagnético de algunos milímetros de diámetro, lo que resultaba en dispositivos con una capacidad de memoria muy pequeña. Antes que eso, las computadoras usaban relés y líneas de retardo de varios tipos construidas para implementar las funciones de memoria principal con o sin acceso aleatorio.

En 1969 fueron lanzadas una de las primeras memorias RAM basadas en semiconductores de silicio por parte de Intel con el integrado 3101 de 64 bits de memoria y para el siguiente año se presentó una memoria DRAM de 1024 bytes, referencia 1103 que se constituyó en un hito, ya que fue la primera en ser comercializada con éxito, lo que significó el principio del fin para las memorias de núcleo magnético. En comparación con los integrados de memoria DRAM actuales, la 1103 es primitiva en varios aspectos, pero tenía un desempeño mayor que la memoria de núcleos.

En 1973 se presentó una innovación que permitió otra miniaturización y se convirtió en estándar para las memorias DRAM: la multiplexación en tiempo de la direcciones de memoriaMOSTEK lanzó la referencia MK4096 de 4096 bytes en un empaque de 16 pines,1​ mientras sus competidores las fabricaban en el empaque DIP de 22 pines. El esquema de direccionamiento2​ se convirtió en un estándar de facto debido a la gran popularidad que logró esta referencia de DRAM. Para finales de los 70 los integrados eran usados en la mayoría de computadores nuevos, se soldaban directamente a las placas base o se instalaban en zócalos, de manera que ocupaban un área extensa de circuito impreso. Con el tiempo se hizo obvio que la instalación de RAM sobre el impreso principal, impedía la miniaturización , entonces se idearon los primeros módulos de memoria como el SIPP, aprovechando las ventajas de la construcción modular. El formato SIMM fue una mejora al anterior, eliminando los pines metálicos y dejando unas áreas de cobre en uno de los bordes del impreso, muy similares a los de las tarjetas de expansión, de hecho los módulos SIPP y los primeros SIMM tienen la misma distribución de pines.

A finales de los 80 el aumento en la velocidad de los procesadores y el aumento en el ancho de banda requerido, dejaron rezagadas a las memorias DRAM con el esquema original MOSTEK, de manera que se realizaron una serie de mejoras en el direccionamiento.

Continuará en la siguiente entrada.