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.