miércoles, 22 de febrero de 2023

Los que definieron la ciencia de la Informática (IV) Unix y C

 
Actualizado el 13/04/23, cambios en azul 
Añadidas nuevas versiones del Unix el 02/06/23, cambios en verde 

En esta estrada trato sobre el desarrollo del Unix y la creación de mi muy querido lenguaje C (yo amo el BASIC por que empecé con el, pero no hay mejor lenguaje que el C), que van muy de la mano.

Laboratorios Bell

Laboratorios Bell era una subsidiaria dedicada a la investigación de la principal compañía de telefonía americana, la AT&T. Esta había crecido mucho a principios del XX, sobre todo tras la compra de la Bell Company (empresa creada por el que patentó el teléfono Alexander Graham Bell) para dar servicio de telefonía en todo Estados Unidos. En 1881 se crea American Bell para desarrollar el equipamiento para las empresas de telefonía Bell, en 1907 AT&T crea su propio laboratorio, y en 1925 se fusionan ambos para crearse la Bell Telephone Laboratories.

Como muestra de lo avanzado de sus investigaciones en sus instalaciones a principios de la década de 1950 se creó el transistor y también Claude Shannon crea la Teoría de la Información.

El origen del C

En los años 60 se definen dos lenguajes teóricos importantes, por un lado ALGOL (ALGOritmic Language, Lenguaje Algorítmico) que tuvo pocas implementaciones pero influyó mucho en los posteriores, y que derivó directamente en el PASCAL, y usando ideas del ALGOL se deriva el lenguaje CPL (Cambridge Programming Language, aunque posteriormente se le llamó Combined Programming Language, Lenguaje de Programación Combinado), que no llegó nunca a desarrollarse debido a ser demasiado grande, ambicioso y complejo. Ante esto en 1967 Martin Richards de la Universidad de Cambridge, mientras estaba en el MIT, desarrolla el BCPL (Basic Combined Programming Language, Lenguaje de Programación Combinado Básico), aunque fue descrito en una presentación en 1969. Se llegaron a desarrollar hasta 25 implementaciones diferentes, pero nunca fue realmente mas que un lenguaje académico. Tenía dos partes, el compilador creaba un código intermedio, que luego un ejecutor específico para cada ordenador podía ejecutar, esta idea se ha usado en lenguajes como el Java y PASCAL.

Ese mismo año lo utiliza Dennis Ritchie como base para el lenguaje B, ayudado por Ken Thompson, como una simplificación del BCPL, del que Thompson elimina todo lo prescindible para poder usarlo en un mini (eliminando hasta parte del nombre).

Entre 1969 y 1972 y para el PDP que tenía disponible en los laboratorios Bell, Dennis Ritchie escribe un compilador para un nuevo lenguaje al que denomina C, usando las ideas del anterior B. Es un lenguaje diseñado específicamente para el desarrollo de sistemas operativos, y se ha vuelto el padre de la mayoría de lenguajes modernos que usan aproximadamente su misma sintaxis, como C++, Java, JavaScrip o PHP

El origen del UNIX

En los años 60 el Instituto Tecnológico de Massachusetts, los Laboratorios Bell y General Electric trabajaba intensamente en las comunicaciones, con la idea de desarrollar un ordenador que daría servicio a cientos de terminales por todo el país a través de las líneas telefónicas. Para su funcionamiento se definió un sistema operativo denominado MULTICS (Multiplexed Information and Computing Service, Servicio Multiplexado de Información y Computación). Este sistema correría en grandes Mainframes de las empresas General Electrics y Honeywell participantes en el proyecto. Aunque estuvo mucho tiempo en desarrollo, no llegó a funcionar nunca al ser un producto demasiado avanzado para el momento.

Uno de los programadores de los laboratorios Bell, Ken Thompson, escribió un juego llamado Space Travel (Viaje espacial) para la GE-645 en que estaban desarrollando el MULTICS, pero el juego era lento y sus ejecuciones eran caras (en esa época se miraba el coste de los programas por su tiempo de ejecución para calcular su rentabilidad) ya que salía por 75$ por partida. 

Entre 1969 y 1978 dos investigadores que trabajaban en MULTICS obtuvieron permiso para usar una computadora PDP-7 que en eso momento estaba siendo reemplazada por otra mas avanzada y había quedado parada, estos eran Ritchie y Thompson. Usando esta máquina, con ideas de MULTICS crearon el sistema operativo UNIX (Uniplexed Information and Computing Service, Servicio Uniplexado de Información y Computación), cambiando el multi por el uni ya que daba servicio a un solo usuario, basando el nombre al parecer en una idea de Brian Kernighan sobre un comentario de Andrew Tanenbaum

Cuando les dejaron el PDP reescribió el programa en ensamblador ayudado por Ritchie, al tener que desarrollar muchas rutinas para el manejo del sistema, Thompson pensó en crear un nuevo sistema operativo para la máquina. De esta manera Thompson y Ritchie lideraron un grupo de programadores para desarrollar en ensamblador  un sistema operativo multitarea, junto a un nuevo sistema de manejo de ficheros y un nuevo intérprete de comandos y algunos programas auxiliares.

Posteriormente el laboratorio les deja un PDP-11/20 con la condición de agregar herramientas de procesamiento de textos (un editor para escribir el programa runoff para formatear e imprimir) a UNIX, por lo que en 1970 ya se habla oficialmente en los laboratorios Bell del sistema operativo UNIX, donde el sistema de procesamiento de textos fue utilizado para procesar las solicitudes de patentes que recibían. Luego se mejoró runoff desarrollando troff, que permitía realizar composición tipográfica.

El 3 de noviembre de 1971 Thomson y Ritchie publicaron "UNIX Programmer's Manual", un manual de programación de UNIX, lo que fué su lanzamiento definitivo.

En 1972 se decide reescribir UNIX usando el Lenguaje de programación C, de esta manera UNIX podría ser fácilmente modificado para funcionar en otras computadoras, y como el código era más sencillo de entender y de manejar aumentó la velocidad de desarrollo de UNIX.

AT&T puso a UNIX a disposición de universidades y empresas (incluyendo al propio gobierno) a través de licencias. ​ Al adquirir una de ellas el Departamento de Computación de la Universidad de California, con sede en Berkeley, en 1975 desarrolló su propia versión de UNIX conocida como Berkeley Software Distribution (BSD). En esta distribución se creó el protocolo TCP/IP que es la base de internet.

Posteriormente el UNIX dejó de ser libre para su uso en universidades, pasando a comercializarse. Se lanzaron muchos desarrollos, Microsoft llega a un acuerdo para portar UNIX a los 286 creando una versión que se denominó XENIX, y para los 386 hay dos empresa que lo comercializan con versiones propias, SCO (que compró el XENIX y desarrolló SCO UNix y UnixWare, hoy es parte de Caldera Systems), y SUN que crea Solaris (hoy parte de Oracle). La IBM también lo comercializa creado AIX, Hewlett-Packard crea por su parte HP-UX y DEC comercializa ULTRIX.

Para intentar poner orden el este caos de versiones incompatibles entre si, se creó el estandar POXIS, que intentaba que hubiera cierta compatibilidad en el núcleo entre las versiones para que se pudieran ejecutar programas desarrollados en cualquiera de ellas en otras, no se consiguió nunca una compatibilidad plena, pero fue un buen avance.

Como ya no se puede usar el código en la enseñanza, el profesor Andrew Tanenbaum decide escribir una versión reducida del mismo para sus clases, lo que dio origen al MINIX. Uno de los usuarios de MINIX, Linus Torvalds, descontento con lo que permitía decide ampliarlo, creando otro sistema operativo denominado LINUX, del que posteriormente deriva a su vez Android. Por su parte, Apple derivó su MAC OS X y posteriores como macOS, iOS, iPadOS, tvOS o watchOS a partir del BSD (realmente parten de su anterior NeXTSTEP que usa el nucleo de Mach y partes del BSD).

De esta manera la familia del UNIX actualmente está compuesta por muchas variantes directas o indirectas, además de ser la base de algunas de las ideas del CP/M, que a su vez es la inspiración del MS/DOS.

Si quieres usar un UNIX hoy día tienes varias opciones (mejorada la lista con adicciones):

  • UNIX de código libre (cuidado que no todas las versiones de estos productos lo son): 
    • Variantes de LINUX (hay demasiadas)
    • Variantes de BSD (FreeBSD, Dragonfly BSD, NetBSD, OpenBSD)
    • MINIX (tiene versiones 1, 2 y 3)
    • Variantes libres de Solaris (OpenSOLARIS,  Nexenta OS, Illumos, SchilliX, BeleniX).
    • Coherent, un clon del Unix muy sencillo, las primeras versiones eran de código propietario, pero desde 2015 pasó a código libre.
  • UNIX de código propietario
    • OpenServer (basado en Xenix y no abierto a pesar de su nombre)
    • Solaris en sus versiones comerciales (sin el Open delante)
    • AIX y z/OS de IBM
    • HP-UX.
    • Silicon Graphics IRIX 
    • UnixWare de Univel (hoy parte de SCO-Caldera)
    • Ultix de DEC para alguna de sus máquinas
    • Amiga Unix. Versión para el Commodore Amiga 3000 del Unix System V de AT&T, poco usado ya que no incluía la posibilidad de ejecutar programas desarrollados para otros sistemas, pero muy apreciado por sus pocos usuarios al incluir parte de las fuentes, por lo que se podía modificar.
    • Atari  System V. Versión para el Atari TT030, intento de crear una estación de trabajo que no funcionó ya que tras sacar el ordenador y anunciarlo, tardaron dos años en comercializar el Unix.
    • Una lista mas extensa se puede consultar en la Wikipedia (en inglés). Pulsa aquí para verla
  • Variantes de código propietario (aunque tienen partes de código abierto, de estas solo verás el interface gráfico que hay por encima): 
    • MAC OS X y sus variantes para teléfonos, tabletas  TV
    • Android
  • Otros desarrollos basados en POSIX:  
    • BeOS no está basado en Unix, pero tiene cierta compatibilidad POSIX y el interface de la línea de comandos está basado en Bash.
    • QNX

Hay mas versiones de UNIX de múltiples fabricantes, solo he mencionado las mas conocidas, y si incluimos sistemas que han usado parte de POSIX en su núcleo se amplia bastante la lista.