¿De dónde viene UNIX?

13
3911

Saludos a todos 🙂 estas semanas he estado bastante entretenido leyendo algunos libros sobre programación, la verdad es que la mejor forma de aprender a programar es siempre con un libro, cualquier artículo, tutorial, guía que uno pueda encontrar (incluyendo las mías) son meros puntos de referencia al momento de compararlas con un libro de verdad sobre el tema. Ahora bien, tenemos que definir lo que es un libro “de verdad” también, puesto que no todos los libros suelen ser buenos, y muchos de ellos pueden incluso costar más de lo que realmente valen y hacernos perder tiempo.

A lo largo de estos años la lista de libros que he leído y la de libros que puedo recomendar han divergido bastante, pero sin lugar a dudas entre algunos de mis favoritos tenemos (en ningún orden específico):


  • CEH Certified Ethical Hacker de Matt Walker.
  • Beginning Python: From Novice to Professional de Magnus Lie Hetland.
  • Hacking: the art of exploitation de Jon Erickson.
  • Getting Started with Arduino de Massimo Banzi.
  • Learning the bash Shell de Cameron Newbam & Bill Rosenblatt.
  • Learning the vi and vim editors de Arnold Robbins, Elbert Hannah & Linda Lamb.
  • Linux Kernel in a Nutshell de Greg Kroah-Hartman (un developer de Gentoo también).
  • Modern C de Jens Gustedt
  • The Shellcoder’s Handbook de Chris Anley, John Heasman, Felix “FX” Linder & Gerardo Richarte.
  • The C programming language de Brian W. Kernighan & Dennis M. Ritchie (creadores de C)
  • Debugging with GDB de Richard Stallman, Roland Pesch, Stan Shebs, et al.
  • Hacking Linux Exposed: Linux Security Secrets and Solutions de un gran grupo de investigadores de ISECOM, entre ellos Pete Herzog, Marga Barceló, Rick Tucker, Andrea Barisani (otro ex developer de Gentoo), Thomas Bader, Simon Biles, Colby Clark, Raoul Chiesa, Pablo Endres, Richard Feist, Andrea Ghirardini, Julian “HammerJammer” Ho, Marco Ivaldi, Dru Lavigne, Stephane Lo Presti, Christopher Low, Ty Miller, Armand Puccetti & et al.
  • Sistemas operativos: Un enfoque basado en conceptos de Dhananjay M. Dhamdhere
  • Pro Git  de Scott Chacon y Ben Straub
  • Expert C Programming: Deep secrets de Peter Van Der Linden.

Podría hablar maravillas de cada uno de estos libros, pero por hoy tomaremos algunos de los pasajes del último en la lista, puesto que muchas de estas anéctodas me han cautivado y ayudado a comprender mejor algunos de los intrincados secretos de C y la programación en general 🙂

Unix y C

Cuando hablamos de UNIX, la historia se entrelaza con el origen de este sistema y el desarrollo del lenguaje que hasta el día de hoy es uno de los más utilizados en el desarrollo del mismo y sus derivados (incluyendo Linux). Y curiosamente, estos dos nacen de un “error”.

Multrics fue un mega proyecto que juntó a los laboratorios Bell, General Electric y el mismo MIT para crear un sistema operativo, dicho sistema presentó muchos errores, y entre uno de los más importantes, fallos de performance que hacía del sistema algo practicamente inutilizable. Hablamos del año 1969, por lo que el hardware de esa época no podría soportar la cantidad de software que se necesitaba para correr el sistema mismo.

No fue hasta 1970 que un par de ingenieros de Bell empezaron a trabajar en un sistema operativo simple, rápido y ligero para el PDP-7. Todo el sistema había sido escrito en Assembler y había sido llamado UNIX como parodia a Multrics puesto que este solo deseaba hacer pocas cosas, pero hacerlas bien en lugar del tremendo trabajo desperdiciado que significó el segundo. Ahora podrán entender por qué Epoch comienza el 1ro de enero de 1970. 🙂 Un dato bastante curioso para mí. En ese momento todavía no se hablaba de un C propiamente dicho, sino de un New B puesto que las ideas de Ritchie provenían del ya utilizado lenguaje B de esa época.

Early C

Con el paso de los años (1972-3) el término C empezó a ser utilizado puesto que el lenguaje nuevo empezaba a tomar forma, y por esta época nace otro dato curioso, muchos programadores y chistes de programadores dicen:

Los programadores saben que se empieza a contar desde 0 en lugar de 1.

Pues esto no es del todo cierto 🙂 la verdadera razón por la que esto es considerado así hasta el día de hoy es porque en su creación, para los escritores de compiladores era más sencillo calcular un arreglo utilizando offsets, estos indican la distancia que existe desde un punto de origen hasta el objetivo deseado, es por esto que:

array[8]=2;

Nos indica que el elemento de array es definido como 2, porque al array se le suman 8 unidades para llegar al espacio de memoria donde se almacenará el elemento 2. Antes de C, muchos lenguajes empezaban a contar desde 1, gracias a C, ahora casi todos comienzan con 0 🙂 así que no es culpa de los programadores, sino de los escritores de compiladores que esto sea así.

The Bourne Shell

Este es un tópico que aunque no está directamente relacionado con C, puede ayudar a más de uno a entender por qué la programación en Shell es tan peculiar, y ciertamente es curioso saberlo. Steve Bourne escribió por esa temporada un compilador de Algol-68, este es un lenguaje en el que las llaves ( {} ) son reemplazadas por palabras, por lo que lo podríamos definir de la siguiente manera en C:

#define IF if(

#define THEN ){

#define ELSE }else{

#define FI };

Estos son solo algunos ejemplos de lo que entiende Algol, pero si lo aplicamos a la programación en shell el día de hoy, ya entenderán por qué en shell tus programas requieren de un fi para cada if 🙂 ciertamente interesante.

Comiencen a leer

No puedo contarles todos los detalles del libro, especialmente porque muchos de estos ya son temas de programación que requieren un fondo previo para poder ser comprendidos, pero pensé en compartir con ustedes algunas de las anecdotas curiosas que fui encontrando en el camino 🙂 No he tenido tiempo de trabajar en algunos de los artículos que han estado en la lista de pendientes porque simplemente estos últimos libros me han atrapado y los estoy disfrutando cada día y sobre todo tratando de comprenderlos al máximo. Saludos y ya pronto podré compartir con ustedes más temas, saludos.

13 COMENTARIOS

  1. Interesante, aunque seguramente, Multrics se deba a un error de imprenta, ya que el nombre original de ese sistema operativo era Multics, y Unix, originalmente se llamó Unics, precisamente haciendo referencia a ese gran sistema operativo, eventtualmente y por fonética, Unics se transformó en Unix, ahora bien, tan sólo te faltó mencionar el nombre de quien se considera el autor de Unix; Ken Thompson, cuenta la leyenda que estaban ambos, Thompson y Ritchie, en la cafetería de los laboratorios Bell comentando sobre sus proyectos y fue que Ritchie sugirió a Thomposon que reescribiera su programa Unics con C, el lenguaje que él habiá escrito … y lo demás, es historia. 😉

    Por cierto, anteriormente todos los programs se escribian con las instrucciones de la maquina, lo que los hacia totalmente dependientes del hardware, la inovación de C, aparte de hacer más facil la escritura de proramas, era que el lenguaje fuera independiente del hardware implementando los compiladores, una filosofía que muchos años después tomaría Java, en el sentido que los programas no fueran dependientes del sistema operativo, añadiendo la famosa maquina virtual de java.

    • Lo malo de las leyendas es que desvirtúan la historia, en más de un sentido… y pueden hacer pensar que algo sucede cuando no es así… como el hecho de la conversación existente entre Thompson y Ritchie (lo cual omití a voluntad) puesto que lleva a errores históricos y técnicos (C no fue antes de UNIX)…

      Y en cuanto a lo segundo… otra leyenda que desvirtúa la realidad, puesto que antes de C existió B, A, pascal, Ada, algol-60, PL/1 y algunos cuantos más que eran propiamente lenguajes de programación (muy diferentes de Assembly y sus dialectos por arquitectura que son dependientes del hardware del procesador) así que C no “innovó” en este sentido, simplemente adoptó soluciones que ya existían en otros lenguajes y al final de cuentas se popularizó más rápido y mejor que estos… La única parte de verdad de eso es que Java se basó en este concepto de portabilidad para después crear su máquina virtual, pero no solamente se basó en C para esto, sino que siguió otros modelos, sino no tendríamos el paradigma de programación orientada a objetos en java…

      Sentía que debía aclarar la situación porque cualquier persona menos versada podría tomarlo como verdad y después creer que eso sucedió así… saludos 🙂

Dejar una respuesta