Probando la primera versión de Unix: UNICS 0

Probando la primera versión de Unix: UNICS 0

Henry Tejera
Henry Tejera Unix

¿Nunca te preguntaste cómo sería usar el sistema operativo de una de esas computadoras que ocupaban una sala entera y solo tenían unos pocos K de memoria? 


Un proyecto de SDF, que celebró los 50 años del sistema operativo Unix, te permite usar la primera versión, antes de que incluso se llamara así. Estoy hablando de UNICS, la versión 0 donde todo comenzó…

Te propongo hacer un muy breve paseo por la historia de Unix, para terminar viviendo la experiencia de interactuar con esa versión embrionaria, rústica pero fundacional.

Un apacible verano

En el verano boreal de 1969, se estaba gestando una revolución que solo años después, y a la luz de los acontecimientos, se hizo evidente el verdadero alcance de su impacto en varios aspectos de la sociedad.

Foto de una computadora PDP-7. Fuente: Wikipedia.
Foto de una computadora PDP-7. Fuente: Wikipedia.

En ese año, Ken Thompson se sentó enfrente de una gigante PDP-7 de los Laboratorios Bell, metió sus manos en una teleimpresora modelo ASR33, y el mecánico ruido de las teclas acompañó su flujo para codificar lo que se convertiría en la primera versión de Unix, conocida como UNICS.

¿Por qué UNICS y no UNIX?

Hasta el momento de escribir esto, no tenía ni idea de que la primera versión de Unix se originó producto del desarrollo de otro sistema operativo, llamado: Multics.

Pantalla de inicio de sesión para el servidor público Multics de BAN.AI Fuente: Wikipedia.
Pantalla de inicio de sesión para el servidor público Multics de BAN.AI Fuente: Wikipedia.

Multics, acrónimo de Multiplexed Information and Computing Service, fue un proyecto impulsado por el Instituto Tecnológico de Massachusetts (el famoso MIT), la desaparecida General Electric y los Laboratorios Bell.

Multics fue uno de los primeros sistemas operativos diseñados para ser seguro y orientado al tiempo compartido; aunque, Thompson parece no tenerle una gran estima, al menos eso fue lo que le dijo a Peter Seibel:

«[Multics fue] sobrediseñado y sobreconstruido. Estaba casi inutilizable. Ellos [el MIT] todavía afirman que es un éxito monstruoso, pero claramente no lo fue».

La cuestión es que los Laboratorios Bell siguieron su propio camino, distanciándose del desarrollo de Multics, y fue Thompson, junto con otros desarrolladores (entre ellos Dennis Ritchie), que terminaron por crear UNICS.

Ken Thompson (sentado) y Dennis Richie (no sentado) con una PDP-11 en 1972.
Ken Thompson (sentado) y Dennis Richie (no sentado) con una PDP-11 en 1972.

UNICS es un acrónimo de Uniplexed Information and Computing System, en contraste con Multics, que era multiplexado.

Probando UNICS

SDF, del cual te hablé en este post: ¿Qué es sdf.org? La guía (no) definitiva, ofrece un servicio que te permite probar diferentes versiones de Unix, incluida UNICS.

Esto se logra a través del uso de un simulador de PDP-7 que se encuentra instalado en los servidores de SDF.

Comenzamos la aventura 👉https://unix50.org

unix50.org simulación de diferentes versiones de Unix.

Un aspecto interesante de esta propuesta, es que no es necesario tener una cuenta en SDF para poder probar Unix; es posible ingresar usando la siguiente cuenta:

  • Usuario: unix50
  • Servidor: unix50.org 
  • Contraseña: unix50

Si estás en Windows, podés usar Putty para conectarte:

Configuración de Putty para ingresar a unix50.org.
Configuración de Putty para ingresar a unix50.org.

Una vez que ingresas al servidor, vas a ver una lista de todas las instancias disponibles con diferentes versiones de UNIX. Selecciona la opción [a] para comenzar la simulación de UNICS:

Listado de versiones de Unix disponibles en unix50.

Podés loguearte con el usuario dmr y password dmr.

¿Qué se puede hacer en UNICS?

No mucho, desde una perspectiva moderna. No hay que olvidar que estamos en la infancia de los sistemas operativos. 

Si alguna vez usaste Linux, los comandos que hay disponibles en UNICS tan van a resultar algo familiar:

  • as
  • bc
  • cat
  • chdir
  • chmod
  • chown
  • chrm
  • cp
  • date
  • ln
  • ls
  • mv
  • stat

Esta versión tiene la posibilidad de ejecutar código escrito en el lenguaje de programación B, que fue el predecesor del lenguaje C.

El sitio unix50 recoge las notas que hizo Ken Thompson sobre esta versión de UNIX:

«Aquí tienes algo de información...

adm y apr envían trabajos a la máquina central de procesamiento por lotes (ge-635 gcos). Solo recuerdo un comando para enviar un trabajo de impresión. La PDP-7 no tenía impresora. En realidad, había un trabajo de impresión más reciente que imprimía al rechazar el trabajo por lotes debido a un error de sintaxis trivial. La impresión tenía un costo. El rechazo del trabajo era gratuito.

sys save generaba un archivo central que, al ejecutarse, continuaba después del sys save. Se utilizaba para establecer puntos de interrupción en trabajos largos y para trabajos que requerían mucha inicialización para que pudieran iniciarse más rápido.

Una nota; este UNIX no tenía un sistema de archivos jerárquico. Solo había un número fijo de directorios. Cada uno estaba vinculado por el directorio de directorio dd. Para acceder a otro directorio, escribías:

chdir dd chdir dir

Pero el comando chdir aceptaría varios argumentos, así que lo anterior se convierte en:

chdir dd dir

Si alguna vez desvinculabas tu enlace a dd, serías cortado.

Más tarde, dd se convirtió en "..", lo que significa "arriba". No se podía hacer referencia a un archivo en otro directorio directamente. Por lo tanto, tenías que vincularlo con un nombre local y luego hacer referencia a través del nombre local. Este enlace:

link; sys; x; y

creaba un enlace local "y" al archivo "x" en el directorio "sys" referenciado desde "dd". ¿Eso aclara un poco la confusión de los nombres?

Trabajaré en algunos de los otros temas que mencionas. Algunos envían ondas gravitacionales a través de las telarañas, pero nada específico.

Aquí tienes algo de información...

adm y apr envían trabajos a la máquina central de procesamiento por lotes (ge-635 gcos). Solo recuerdo un comando para enviar un trabajo de impresión. La PDP-7 no tenía impresora. En realidad, había un trabajo de impresión más reciente que imprimía al rechazar el trabajo por lotes debido a un error de sintaxis trivial. La impresión tenía un costo. El rechazo del trabajo era gratuito.

sys save generaba un archivo central que, al ejecutarse, continuaba después del sys save. Se utilizaba para establecer puntos de interrupción en trabajos largos y para trabajos que requerían mucha inicialización para que pudieran iniciarse más rápido.

Una nota; este UNIX no tenía un sistema de archivos jerárquico. Solo había un número fijo de directorios. Cada uno estaba vinculado por el directorio de directorio dd. Para acceder a otro directorio, escribías:

chdir dd chdir dir

Pero el comando chdir aceptaría varios argumentos, así que lo anterior se convierte en:

chdir dd dir

Si alguna vez desvinculabas tu enlace a dd, serías cortado.

Más tarde, dd se convirtió en "..", lo que significa "arriba". No se podía hacer referencia a un archivo en otro directorio directamente. Por lo tanto, tenías que vincularlo con un nombre local y luego hacer referencia a través del nombre local. Este enlace:

link; sys; x; y

creaba un enlace local "y" al archivo "x" en el directorio "sys" referenciado desde "dd". ¿Eso aclara un poco la confusión de los nombres?

Trabajaré en algunos de los otros temas que mencionas. Algunos envían ondas gravitacionales a través de las telarañas, pero nada específico.»

Hello, World!

Pocas cosas hay más satisfactorias que ver un Hello, World! imprimirse en pantalla. Vamos a intentar hacerlo con UNICS y el lenguaje B.

Estando logueados con el usuario dmr, ejecutamos:  ln dd dmr

En ese directorio se encuentra el archivo hello.b

cat hello.b
main $(
 write('He');
 write('ll');
 write('o,');
 write(' W');
 write('or');
 write('ld');
 write(!*n');
$)

Compilamos para generar el archivo hello.s

bc hello.b hello.s 

Ensamblamos: 

as ops.s bl.s hello.s bi.s

El comando as ensambla los archivos ops.s, bl.s, hello.s y bi.s y produce un archivo llamado a.out.

Finalmente, ejecutamos a.out y ante nuestros ojos: 

Hello, World!
Hello, World! con el lenguaje B en una PDP-7 con UNICS.

Para poner un poco de contexto y dimensionar (nunca mejor dicho), el esfuerzo que implicaba programar algo sencillo como lo anterior, te dejo este vídeo del canal Living Computers, en donde se puede ver la ejecución de este mismo programa en una PDP-7 restaurada:

Una competición por una bolsa de arroz

En la página https://sdf.org/?tutorials/unix50th se documenta la competencia acaecida el 10 de julio de 2019, con motivo de la celebración número 50 de Unix.

Organizada por SDF, este encuentro congregó a una «manada» de hackers que, según cuenta la leyenda, estuvieron dos horas intentando hacer algo más que un escueto Hello, World! en el simulador de PDP-7 con UNICS.

¿El resultado? Un hacker, Karl Koscher, se llevó el premio mayor: un dispensador de arroz y una bolsa de arroz de calidad superior.

Este fue su código:

main $(
 auto c;
 while (1) $(
   c = read();
   write(c + 1);
   flush();
 $)
$)
supersat)

Pero, ¿qué hace ese código exactamente? Es una especie de implementación de ROT1, un sencillo cifrado de sustitución basado en un desplazamiento (también llamado rotación).

Ya que estás en unix50, podés aprovechar por darte una vuelta por las otras versiones de Unix que hay disponibles.

Fin.

 


/ Súmate al boletín. No es gran cosa, pero es gratis 👇 /