Brian Kerhningham es profesor de ciencia del cómputo, e specialista de C, y uno de los hackers encargados de desarrollar UNIX. En una de las entrevistas da un pequeño raconto del proceso creativo que llevó a tal sistema operativo. ----- Creo que en cierto punto de la conversación mencioné el hecho que la gente que trabajaba en MULTICS - una especie de segunda versión de un sistema de tiempo compartido CTSS elaborado en el MIT, en colaboración con General Electric y Bell Labs - arribaron a la conclusión que se había convertido en un Sistema muy grande para proveer la utilidad de computo para programadores originalmente propuesta. MULTICS estaba de hecho escrito en lenguajes de alto nivel. Comenzaron con PL/1 que no fue una buena elección, y luego cambiaron a BCPL, lenguaje desarrollado por entonces por Mark Richards, de Cambridge. La gente que escribían MULTICS que estaban en Bell Labs - en particular Ken Thompson y Dennis Ritchie - se hicieron con la idea que podría ser posible escribir software similar a un sistema operativo interesante - junto a las herramientas que le dieran soporte - recurriendo a lenguajes uevons de alto nivel en lugar de hacerlo en mero ensamblador. De modo que al mismo tiempo que se orientaron a UNICS- esta versión mucho más pequeña y acotada escrita en los Laboratorios Bell - investigaban el uso de lenguajes de alto nivel. Existía una variedad de estos: existía un lenguaje llamado B, que fue el primer intento realizado por Ken Thompson (se trataba de un lenguaje muy simple, y supongo que podría decirse que era una versión acotada de BCPL) - una pobre convención de nombres... Con B podías hacer ciertas cosas interesantes pero noera lo suficientemente potente. En particular, su limitación radicaba en que se trataba de un lenguaje interpretado, no era compilable. Esto significa que no generaba código máquina para una computadora en particular, sino que interpretaba las órdenes de programación y las traducía a lenguaje ensamblador de bajo nivel, lo que además quiere decier que corría de manera relativamente lenta. La otra cosa fue que el lenguaje B no tenía ni siquiera cons ideraba soportar las arquitecturas de las máquinas nuevas que estaban apareciendo por entonces, en particular la DEC PDP-11. Estas nuevas máquinas, en lugar de concentrarse en un s istema con arquitecturas de un mismo tamaño de palabra (por ejempo 16 bits o algo así) podían hacer caso a distintos tamaños de palabras que el sistema podría manipular natural o eficientemente: podría ser 8 bits, 16, tal vez 32 bits. El lenguaje B no reflejaba eso, por lo que Dennis Ritchie se abocó a diseñar una versión de B más rica en funcionalidades y que contase además con mecanismos de lenguaje que dieran cuenta: "esto es una cifra de 8 bits, esta es de 16 bits"... en definitiva, que las comprendiese y las manipulasen, e incorporó esta característica a una versión distintiva llamada C. Escribió un compilador para C, y con el compilador en mano e mpezó a escribir el sistema operativo en sí. Tardó un tiempo - por supuesto, escribió otro software crítico en lenguajes de alto nivel en lugar de ensamblador. Probablemente le llevó seis meses para tenerlo funcionando, y contó entonces con un sistema operativo portable, y esto es fundamental por varias razones. En primer lugar, facilitaba que gran cantidad de personas comprendiesen lo que hace el código, pues no requiere programadores de experiencia crítica al estar escrito en un lenguaje de alto nivel [N.de.T. los lenguajes de alto nivel son mas sencillos que los ensambladores de bajo nivel, cuyo problema principal es ser muy específicos para una familia de CPU en particular]. Y otro punto era su portabilidad, en el sentido que si alguien realizaba un compilador de C para una arquitectura de máquina diferente, entonces podías recompilar tu programa - cualquiera fuese - para esa nueva arquitectura y de esta manera mudar tu programa a la otra máquina. Esta fue siempre la ventaja fundamental de los lenguajes de alto nivel, pero ahora esta ventaja recaía en el sistema operativo mismo, y ello implicaba ahora que el sistema operativo al co mpleto - para entonces conocido como UNIX - ya no quedaría anclado en la PDP-11 sino que podría utilizarse en otras máquinas posteriores. Aún así, la dificultad de escribir un sistema operativo en lenguajes de alto nivel para utilizarlo en muchas arquitecturas diferentes radica en los detalles que restan por pulir; existen ciertas excrecencias que los lenguajes de alto nivel simplemente son incapaces de alisar, de modo que siempre restan por resolver ciertos detalles menores del portado asistiéndose con lenguaje ensamblador del procesador al cual está destinado. Es el pr oblema del huevo y la gallina: cómo compilar el compilador, como el compilador de C fue escrito en B, la idea de un huevo haciendo una gallina es - metafóricamente - la idea correcta. Lo que se hacía por entonces era escribir código fuente en B en una hoja de papel, y luego se traducía eso mentalmente en algo que fuese capaz de procesar un poco más de código C, y que permitiese luego iniciar el siguiente proceso. Esta es la idea básica cuando no existe aún el compilador automático (que es la forma que conocemos. De modo que se trató de un proceso de incubadora mental - el cual nunca hice yo mismo. En algún momento a comienzos de dicho proceso, cuando hab{ia mucha gente escribiendo programas interesantes, me interesé en el proceso de cómo explicarle esto a demás, para que otros pudiesen aprender B. Esto fue porque Ken Thompson y Dennis Ritchie no se ocuparon demasiado en redactar documentación. Así que yo mismo escribí un tutorial de B que vino bien cuando salió C, y mas adelante redacté otro un tutorial sobre C. Y para ese entonces ya eran dos libritos de esto, y pareció entonces que había ya un "mercado" para el lenguaje C. Así que tuve que torcerle el brazo a Dennis Ritchie para que escribiese el libro conmigo. Y es una las cosas más inteligentes que hice en toda mi vida, sin ambiguedades. Así que tomamos mi tutorial, mas bien una parte de él, y una gran parte de su manual de referencia - que es excelente - y luego rellenamos con material en el medio para explicar las varias partes del lenguaje, y lo publicamos. Lo escribimos en el 77 y lo publicamos a principios del 78, y por supuesto fue hecho con todas las herramientas de preparación de documentos que estuvimos haciendo durante todos esos años. De modo que tenía expresiones matemáticas usando NQN, tenía tablas usando operadores, tenía mis programas C/PL, la primera versión fue anterior al formato PIC, no tenía imágenes, pero la segunda edición ya las incorporaba. ¿Es esto un incesto o es escribir lo que la gente hizo? No sé pero fue algo así. Y recuerdo hablar al aeditor de Prentice Hall, donde el editor era Carl Carlston, y recuerdo una discusión con él donde me preguntaba cuantas copias pensaba vender del libro, y le dije que no tenía idea, tal vez unas 2.000. Y ha hecho mejor que eso (Nota: C Programming de Brian Kerningham es un libro clásico de programación, con más de 20 millones de copias y 32 ediciones). Lo pueden encontrar en castellano aquí: https://frrq.cvg.utn.edu.ar/pluginfile.php/13741/mod_resource/content/0/El-lenguaje-de-programacion-C-2-ed-kernighan-amp-ritchie.pdf UNIX ss el Sistema Operativo que se desarrolló a principios de la década de los setenta por el personal de la BILL TELEPHONE LABORATORIES (Nueva Jersey, EEUU), pertenecientes a la compañía AT&T. Estos laboratorios se estableciereon en 1925 y se pueden considerar como uno de los más importantes grupos de investigación del mundo. En definitiva, se dedican a realizar investigaciones dentro del mundo científico, y como pueden ser las comunicaciones, las matemáticas, la fística y - de manera especial - la informática (diseño asistido por ordenador, técnicas de compilación, redes de datos, etc). Durante el trasncurso de 1969, el Departamento de Ciencias del Cómputo de los Laboratorios Bell utilizó un ordenador General Electric GE-645 con un sistema operativo denominado MULTICS. MULTICS se puede considerar como uno de los primeros sistemas interactivos MULTIUSUARIO, es decir, que permite la utilización simultánea del computador por varios usuarios y que además - al ser interactivo - ofrece una respuesta casi inmediata a la solicitud de una determinada orden. Con anterioridad el método de trabajo era sustancialmente distinto, por supuesto que los sistemas operativos implementados funcionaban por LOTES. El usuario mecanografiaba las órdenes destinadas al computador en fichas perforadas, éste las leía, y algún tiempo despuçes (que podían ser varios minutos o varias horas) de obtenían los resultados en papel impreso. Dada la lentitud del proceso, el MULTICS supuso un importante avance; sin embargo, este sistema operativo carecía de funcionalidades importantes para los programadores. En 1969 KEN THOMPSON y DENNIS RITCHIE crearon un sistema o perativo con el fin de paliar algunos problemas de complejidad que se derivaban de la utilización de grandes ordenadores. A este sistema se le llamó UNIX, y supuso la simplificación del diálogo entre el hombre y la máquina. Thompson y Ritchie consideraron que la mayor parte del desarrollo de programas (mas del 50%) se empleaba en crear código fuente y compilarlo. Para tales tareas no se necesitaba la utilización de enorme potencia de cálculo, sino que bastaba con un ordenador pequeño que dispusiera de gran cantidad de memoria en periféricos donde almacenar los ficheros de código fuente. Aspeco importante a considerar es que el programador disponga de un método sencillo para la creación, actualización y manejo de los ficheros; esta es una de las características escenciales del UNIX: un sistema de ficheros con estructura jerárquica en forma de árbol. Esta herramienta permite la creación de un fichero sin necesidad de definir parámetros del mismo (extensión, formato, etcétera); se puede localizar - además - de forma automática cualquier fichero en cualquier directorio del sistema. Una vez que se ha creado el fichero de código fuente es necesario compilarlo, y para tal tarea tampoco se requiere un gran ordenador, que únicamente será necesario a la hora de ejecutar grandes programas. Se desarrollaron, por tanto, en Bell Labs una serie de programas de computadora utilitarios, concebidos para facilitar las comunicaciones entre los grandes y pequeños ordenadores. Estos utilitarios forman parte del sistema UNIX y son accesibles para todos sus usuarios. Permiten la traducción del código interno utilizado por los pequeños PDP- 11 de Digital, al código EBCDIC en uso por los grandes mainframes de IBM. Concluyendo, con el UNIX se logró dotar a máquinas pequeñas de un sistema interactivo comparable al de los grandes ordenadores de la época. DESAROLLO DEL SISTEMA La primera versión del UNIX se realizó durante los años 1967- 1970 en las minicomputadoras PDP-7 y PDP-9 de Digital Equipment Corporation. Esta versión, escrita en lenguaje Ensamblador, contenía los principales conceptos de sistemas multiusuario tales como CTTS, TENEX, MULTICS. En un principio sólo permitía la utilización del ordenador en monousuario y el desarrollo del software fundamental (ensabladores, compiladores, editores de texto y sistema) supuso cerca de cinco años-hombre en labores de programación. En 1971 se desarrolló la segunda versión del UNIX. Se utilizaron para ellos la DEC PDP-11/40 y la PDP-11/45. En esta nueva versión se introdujo como característica más importante la explotación del UNIX en modo multiprogramación. Thompson desarrolló un lenguaje interpretado basado en el BCPL, con la finalidad que fuese portable y lo denominó LENGUAJE B. En el mismo año 1971 Ritchie lo modificó para que fuese compilable y el nuevo resultado se llamó LENGUAJE C. El Lenguaje C se ha utilizado tanto para la escritura de sistema y de software básico cómo para aplicaciones de usuario. La re-escritura en el lenguaje C del sistema UNIX se realizó en 1972 para algunas versiones de la gama PDP-11, añadiéndose así nuevas funciones al sistema. En 1974 se escribió una versión simplificada del UNIX para el microordenador LSI-11/03. Como mencionamos anteriormente, el software incluye muchos programas desarrollados en lenguaje C. Algunos se han incorporado como nuevas órdenes del sistema para usuarios o técnicos de sistemas, mientras que otros ejecutan funciones específicas. Por ejemplo, un programa actualiza una base de datos en un entorno de tiempo real, mientras que otro proporciona posibilidades de edición de textos. Los profesores y estudiantes universitarios han escrito numerosos programas C compatibles con el software de UNIX. La Western Electric vende licencias para el sistema UNIX con aproximadamente 250 diferentes. Hasta el nacimiento de la versión 6 de UNIX, su uso era interno y restringido a los Laboratorios Bell. Estaba extendido por los distintos deparatamentos, que le fueron incorporando modificaciones de acuerdo con sus respectivas necesidades (MERT, PWD/UNIX). En 1975 el sistema UNIX comienza a ser difundido. Su comercialización se limita al envío de una cinta magnética y un emeplar de cada manual. Los laboratrios Bell no garantizaba por entonces ni la instalación, ni el mantenimiento del sistema. El PWD ("Programmer's Workbench") se desarrolló a la vez que la versión 7 de UNIX para un equipo diferente al utilizado por Thompson y Ritchie. Se utilizó para centros de cómputo donde el desarrollo se hacía con PWD/UNIX en minicomputadoras PDP11, y la ejecución se realizaba en sistemas IBM 370 y UNIVAC 1100. Las innovaciones que conlleva el PWD con respecto a la Versión 6 de UNIX son: * Modificaciones en las funciones de organización de usuarios en proyectos de gran envergadura; * Creación de utilizades para gestión de las fuentes ("SCCS") y el envío de trabajos a distancia; En los Laboratorios Bell el sistema PDW/UNIX se puso a disposición del servicio BISP, que posee una red de PDP-11/45 y PDP-11/70 conectados con IBM 370/168, XDS Sigmas y UNIVAC 1100 utilizados por gran cantidad de usuarios. La Versión 7 supuso un cambio importante con respecto a la 6, introduciendo una serie de modificaciones que se pueden resumir en: * Superación de las limitaciones en cuanto al tamaño de ficheros; * intento de portabilidad con el fin de portar UNIX a distintas máquinas; * desarollo de nuevos utilitarios Hasta entonces UNIX sólo se había instalado en máquinas PDP-11, sin embargo se llega a la conclusión que es necesario portarlo a otras máquinas. El primer transporte se realizó en el año 1977 sobre un mainframe InterData 8/32. El hecho de que fuera necesaria la portabilidad supuso llevar a cabo una serie de modificaciones. * A nivel del lenguaje C se realizaron los cambios oportunos para que los programas se independizaran en la medida de lo posible de las características físicas de la máquina; * A nivel del compilador se introdujeron técnicas que falicitaban la adaptación del mismo a distintas máquinas; * A nivel del sistema, se pretendió aislar los componentes más dependientes de la arquitectura de cómputo del resto. Debido al aumento de la potencia computacional y al ab aratamiento del coste de las minicomputadoras, el sistema operativo UNIX se volvió rápidamente popular en ellas. Estas máquinas se han utilizado inmediatamente para el control de experimentos de laboratorio, soporte de diseño asistido por computadora, supervisión de redes de telecomunicaciones y ejecución de funciones comerciales. El desarrollo de un software que cumpliera estas aplicaciones específicas supuso a los programadores un nuevo reto y el sistema UNIX se ofrecía como una herramienta efectiva para conseguirlo. Hacia en 1978 estaban funcionando en universidades, departamentos gubernamentales y en los laboratorios Bell, más de 500 instalaciones del sistema UNIX. Con las modificaciones descritas anteriomente surge en 1978 la séptima versión del UNIX (UNUX/v7) para las computadoras DEC PDP- 11, y el UNIX/v32 para la DEC VAX-11/780. El UNIX System III, que aparece en 1982, incluye además: * utilitarios del PWB/UNIX; * una distribución para máquinas de la gama Digital Equipment (la PDP-11/23 y la VAX-11/780); * mecanismos de comunicación interprocesos. El UNIX System V que surge en 1983 ofrece también la licencia de instalación, mantenimiento y actualizaciones de sistema. En la actualidad es importante destacar el sistema UNIX desarrollado por la Universidad de Berkeley (versión 4.1 BSD) que gestiona memoria virtual. Estos programas han sido adoptados por los laboratorios Bell y se incluyen en las nuevas versiones de UNIX. Una de estas importantes contribuciones es el editor de textos VI. En definitiva, hay dos opciones posibles en la elección del UNIX como herramienta de trabajo: * Los sistemas que trabajan con el UNIX portado a una máquina en particular. En este caso es necesario el pago de una licencia y de un canon a los Laboratorios Bell; * Los sistemas que poseen los mismos servicios que el UNIX pero que han sido lo suficientemente modificados como para que se los considere ajenos a los laboratorios Bell. ## Los programas UNIX Los programas del sistema UNIX están funcionalmente clasificados de la siguiente forma: * EL NUCLEO que planifica tareas y gestiona el almacenamiento de datos. * LA SHELL es un programa que relaciona e interpreta las órdenes tecleqadas por un usuario del sistema. Interpreta peticiones de usuarios, llama a programas de la memoria y los ejecuita al mismo tiempo o en una serie de canalizaciones llamadas "tuberías" ("Pipes"). * LOS PROGRAMAS UTILITARIOS ejecutan una variedad de subrutinas y unas funciones especiales de mantenimiento de sistema. El sistema UNIX se puede complementar o modificar por todo aquel que disponga de LICENCIA DE ACCESO a los códigos fuente del mismo. Un elevado número de programadores han ido incorporando al sistema programas incluyendo los de la Universidad de California. Estos programas, y los que irán apareciendo, incrementarán la amplia biblioteca de software existene para UNIX. ## El Usuario frente al sistema UNIX Cuando se pretende acceder al sistema operativo UNIX lo primero que debemos hacer es presentarnos al mismo. Esto se consigue con un IDENTIFICADOR que permite al sistema comprobar si se poseen los derechos propios de acceso,,identificador que es asignado por el administrador del sistema. También es necesario disponer de un terminal de tipo conversacional conectado al sistema para poder efectuar esa tarea de presentación al sistema. Estos procedimientos se denominan LOGIN, y pueden ser efectuados mediante el comando LOGIN <nombre de usuario> o bien automátifacmente después del enganche y conexión del terminal al sistema. Explicaremos la utilización del teclado del terminal con sus caracteres especiales y simularemos una sesión de trabajo UNIX para ir profundizando y desarrollando algunos comandos básicos y fundamentales. ###Terminales y su utilización La comunicación entre el sistema operativo UNIX y el usuario se realiza fundamentalmente a través de un TERMINAL o CONSOLA (entrada/salida). El sistema UNIX trabaja en modo de transmisión FULL DUPLEX, es decir, los caracteres que se digitan en la consola son enviados al sistema, y este responde reenviándolos de vuelta a la pantalla, con lo cual son visualizados por el operador. En casos concretos y especiales, como puede ser la digitación de una palabra secreta de contraseña o acceso al sistema, este "eco" a pantalla es omitido. Muchos de los caracteres que se puden digitar son directamente visualizados en pantalla, pero existen caracteres especiales que poseen otra interpretación y significado para el sistema. Uno de los más importantes es el caracter generado por la tecla de RETORNO DE CARRO. Este caracter indica al sistema el fin de la línea de entrada, moviento el cursor al principio de la línea siguiente. El caracter RETURN debe ser enviado al sistema antes de que este interprete la secuencia de caracteres enviada previamente. Como podemos observar, es uno de los CARACTERES DE CONTROL ("invisibles") que PRODUCEN UNA SERIE DE EFECTOS ESPECIALES EN EL TERMINAL. Este caracter RETURN está implementado directamente en el teclado de la mayoría de los terminales. Otros caracters de control deben ser generados presionando una tecla especial denominada CTRL, CTL o CTNL combinado con otro caracter, que normalmente suele ser una letra. El caracter RETURN es esquivalente a presionar la tecla CTRL seguida de una M. Existe otra serie de caracteres de control que definiremos a continuación: Ctrl+d Indica al proceso que se ha finalizado la entrada de caracteres. No hay mas caracteres en la entrada. Ctrl+h Caractere BACKSPACE. Se utiliza para la corrección de errores de tecleo. Ctrl+i Tabulador. Avanza el cursor de la pantalla hasta el próximo tabulador definido (TAB STOP). En UNIX la distancia de tabulador se considera de 8 espacios. Ctrl+C DELETE, RUBOUT. En muchos sistemas UNIX este caracter produce la finalización de un proceso sin esperar a su término. BREAK. Esta tecla, dependiendo de como esté definido el terminal, produce efectos similares a DELETE o RUBOUT.