Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 85 AUTORES CIENTÍFICO-TÉCNICOS Y ACADÉMICOS Los primeros tiempos del software (parte II) Prof. Dr. Félix García Merayo Vicepresidente de ACTA El éxito tiene muchos padres, el fracaso es huérfano. John F. Kennedy à Resumen E n la primera parte de este título nos hemos referido a los tiempos más remotos del diseño y aparición del software, tanto de sistemas como de aplicaciones. Hemos recorrido una época que abarca desde el verano de 1944, en el que se hace pública la construcción y puesta a punto de la máquina electromecánica Mark I, hasta finales de la década de los cincuenta con la aparición de dos lenguajes de programación de alto nivel que se situaron a las puertas del mercado de la tercera generación de ordenadores. Nos referimos a FORTRAN y COBOL. Hemos establecido también las necesarias definiciones correspondientes al entorno del software. Nos proponemos en esta segunda parte continuar la historia del software retomándola donde la dejamos, dando entrada a la década de los sesenta y a temas nuevos relacionados siempre con el software como son la ciencia de los computadores y la ingeniería del software. Finalizaremos la historia de su evolución con el anuncio y puesta en el mercado de la tercera generación, a la que hemos aludido más arriba, causa de un nuevo impulso en el desarrollo del software. Hablaremos también de las dificultades y desacuerdos (generadores de una auténtica crisis) que siempre han perseguido a la programación y también de su carrera por alcanzar a los desarrollos del hardware. Esas dificultades se hicieron aún más patentes ante la aparición de los circuitos integrados y el almacenamiento en disco magnético en 1968. 85 Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 86 ACTA à Los primeros tiempos del software (parte II) Nuevo panorama de los lenguajes y del software Vamos a contemplar ahora el campo del software de la década de los sesenta desde la atalaya constituida por FORTRAN y COBOL. Entre los años 1958 y 1960 se desarrolló en Europa un nuevo lenguaje algebraico de alto nivel conocido con el nombre de ALGOL, Algorithmic Language, como alternativa a FORTRAN que se consideraba pobre en cuanto a formalización, estructuración y sintaxis, pero que sin embargo fue muy rico en versiones habidas e impacto y penetración en las organizaciones dedicadas al desarrollo de aplicaciones que no fueran de pura gestión e incluso también en éstas. Esto nunca lo logró ALGOL que, a pesar de sus diversas versiones y de su formalismo muy bien definido, nunca pasó de tener un empleo más allá del formativo y académico. Su nacimiento tuvo lugar en Zürich en una conferencia celebrada entre la American Association for Computing Machinery, ACM, y la European Association for Applied Mathematics and Mechanics, EAMM. Es importante señalar que Niklaus Wirth formaba parte del comité reunido. El objetivo principal de este nuevo lenguaje era el de poder ejecutarse en cualquier máquina y, por tanto, ser independiente de la configuración de hardware donde se aplicase. Eso nunca fue posible. Es cierto, sin embargo, que ALGOL inspiró el diseño e implementación de varios lenguajes posteriores a él que aparecieron en las décadas de los sesenta y setenta, como Pascal. El informe preliminar emitido por la citada conferencia llevaba el título International Algebraic Language o IAL, pretendiendo así sentar las bases del nuevo lenguaje. Noam Chomsky Abraham Noam Chomsky nació en Filadelfia, Pensilvania, el 7 de diciembre de 1928, de padres inmigrantes judíos. Ha sido un lingüista, filósofo, autor, activista y también político estadounidense. Fue profesor en el MIT desde 1955, ocupando la cátedra de Lenguaje Moderno y Lingüística de 1966 a 1976. Es profesor emérito en la misma institución y una de las figuras más prominentes en lingüística del mundo del siglo XX. Propuso la gramática generativa, que situó la sintaxis en el centro de la investigación lingüística. También debe destacarse su contribución al establecimiento de las ciencias cognitivas a partir de su crítica del conductismo de Skinner y de las gramáticas de estados finitos. Fuera del ámbito académico, Chomsky es bien conocido por su activismo político y se define a sí mismo como un socialista libertario y simpatizante con el anarcosindicalismo. Cuando hablamos del formalismo de ALGOL nos estamos refiriendo a una característica esencial que deben poseer los lenguajes de programación, como es la ausencia de ambigüedad en sus expresiones escritas (el programa) y lo que éstas significan y hacen (el proceso). Esa característica, esa definición de la sintaxis del nuevo lenguaje, se especificó mediante el empleo, a su vez, de otro lenguaje conocido con las siglas BNF de Backus-Normal-Form o también Backus-Naur-Form. Se trata de un metalenguaje con el que es posible expresar el formalismo de los lenguajes de programación con el fin de definir la sintaxis de los mismos, metalenguaje que ya había sido utilizado en gramática por Noam Chomsky en 1950 para definir la estructura sintáctica del inglés. Esta gramática, conocida como gramática libre de contexto, grammar context-free, fue adaptada posteriormente por Backus y por Naur y utilizada, como hemos dicho, en la descripción sintáctica del naciente ALGOL en 1962. FORMA BACKUS-NAUR Noam Chomsky. 86 La forma BNF constituye una sintaxis para definir los lenguajes formales. Los métodos formales proporcionan una técnica de análisis que es de suma importancia en los lenguajes de programación. Los métodos sintácticos consti- Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 87 Los primeros tiempos del software (parte II) tuyen una herramienta básica para formular y estructurar un lenguaje. La noción de sintaxis se deriva del estudio de los lenguajes normalizados y por ello se asocia con frecuencia, aunque sea incorrecto, con el significado de las palabras. La sintaxis estudia más bien la estructura de un lenguaje ligando las palabras o elementos básicos del mismo para formar así oraciones que tengan sentido. La teoría y la semántica de un lenguaje de programación viene documentada en el metalenguaje BNF. El creador de esta notación fue John Backus para poder describir la gramática del lenguaje ALGOL. Peter Naur denominó la notación de Backus como la Backus Normal Form, Forma Normal de Backus, simplificándola más tarde con el fin de emplear menos símbolos en las descripciones. Como consecuencia de esta contribución, y a sugerencias de Donald Knuth, el apellido de Peter reemplazó a la palabra Normal del nombre existente, quedando como Backus Naur Form. Un ejemplo de gramática que utiliza la notación BNF para definirla, podría ser el siguiente. Sea la frase EL HOMBRE AMA EL BIENESTAR. Su gramática correspondiente es: <oración> :: = <sujeto>|<predicado> <sujeto> :: = <frase sustantiva> <frase sustantiva> ::= <artículo> <nombre> <predicado> ::= <verbo> <complemento> <complemento> ::= <frase sustantiva> <verbo> ::= AMA <artículo> ::= EL <nombre> ::= HOMBRE | BIENESTAR El símbolo ::= separa una componente sintáctica de su definición; viene a ser como la componente <x> está formada por. Las componentes alternativas de una definición están separadas por el símbolo |. Equivale al O lógico. Cuando en una definición se dan dos o más componentes, éstas deben tomarse en el mismo orden en que figuran en la definición. Cada componente sintáctica junto con su definición (cada línea del ejemplo) constituye una regla de la gramática en cuestión también conocida con el nombre de ecuación sintáctica. Las palabras escritas con mayúsculas son las fundamentales o primitivas de la gramática que se define. Peter Naur. Peter Naur El danés Peter Naur nació en Frederiksberg, Dinamarca, el 25 de octubre de 1928 y ha sido un pionero de la informática mereciendo el premio Turing de ACM en 2005. Contribuyó al diseño del lenguaje ALGOL en su versión 60. Su apellido forma parte de la BNF. Estudió en la Universidad de Copenhague comenzando su carrera profesional como astrónomo, especialidad en la que recibió su grado de doctor en 1957, aunque más tarde su encuentro con los computadores le hizo cambiar de camino y encontrarse con la computación. Permaneció en el Instituto de Computación Danés desde 1959 hasta 1969, al mismo tiempo que impartía conferencias en el Instituto Niels Böhr y en la Universidad Técnica de Dinamarca. Desde 1969 hasta 1998 fue profesor de ciencia de los computadores en la Universidad de Copenhague. Sus principales líneas de trabajo, diseño e investigación han sido: estructura y rendimiento de los programas y algoritmos, ingeniería y arquitectura del software. Las distintas versiones de ALGOL se sucedieron muy rápidamente. La originada por el comité de Zürich pasó a llamarse ALGOL 58, lenguaje que fue implementado en diversos computadores. En una reunión posterior celebrada en 1960 en París se dio nacimiento al ALGOL 60. En 1962 de nuevo se reunió el comité en Roma, revisando y mejorando la versión del sesenta, versión utilizada durante esa década principalmente por los científicos de Europa. Los fabricantes americanos, como IBM, no dieron dema- 87 Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 88 ACTA Los primeros tiempos del software (parte II) siada importancia a este lenguaje. Sin embargo sí fue muy utilizado para describir con él los algoritmos de todo tipo en casi todas las revistas científicas, tanto europeas como americanas. Siguieron más tarde las versiones ALGOL W, impulsada por Niklaus Wirth (de ahí la W en el nombre de su versión) y más tarde ALGOL 68 que ya fue un verdadero lenguaje de propósito general y no sólo de orientación científica como lo habían sido las versiones precedentes. Pero esta versión causó la muerte del lenguaje al convertirse en demasiado ambicioso y poco práctico. Wirth, que había sido uno de sus impulsores y que se percató de sus inconvenientes, presentó, basándose en ALGOL 60, un nuevo lenguaje que llamó Pascal cuyo primer compilador se implementó en 1970. Por último añadir que el nombre de ALGOL corresponde también al de una estrella (estrella ? de la constelación de Perseo) que en inglés se conoce con el nombre the Ghoul, el Espíritu (maligno). Cualquiera que sea la razón de su poca fortuna, bien la posible etimología de su nombre, bien su mejorable gestión, lo cierto es que ALGOL, como se ha advertido, influyó enormemente en el diseño de lenguajes de programación posteriores. Niklaus Wirth en una conferencia respondiendo a preguntas de Knuth. En la misma época que ALGOL se desarrollaron otros muchos lenguajes pero sólo algunos llegaron a ser conocidos, aunque ninguno de éstos tuvo la importancia de FORTRAN o COBOL. Citaremos JOVIAL, LISP y SNOBOL. El nombre JOVIAL procede de Jules Own Version of the International Algebraic Language, es decir, se trataba de una versión particular del ALGOL idea- 88 da por Jules Schwartz y desarrollada por el Departamento de Defensa de los Estados Unidos junto con el sistema de defensa de las fuerzas aéreas SAGE. Hoy día aún se emplea en aplicaciones de control de tráfico aéreo y en sistemas de defensa aérea. Jules Schwartz. LISP, List Processing, fue un lenguaje de programación orientado sobre todo al proceso de símbolos y no a la evaluación de expresiones algebraicas. Ha sido hasta nuestros días el lenguaje elegido por los investigadores en inteligencia artificial para sus trabajos y desarrollos. En inteligencia artificial, las aplicaciones tratan con datos en forma de símbolos y con estructuras formadas por expresiones simbólicas. Fue ideado por John McCarthy entre 1956 y 1958 e implementado por primera vez entre 1959 y 1962. SNOBOL, de String-Oriented symbolic Language, apareció como un lenguaje orientado al manejo de cadenas o secuencia de caracteres (character strings), cadenas con las que se forman frases y oraciones. Por lo tanto es muy apropiado para el tratamiento de textos, basándose en la identificación de palabras que son cadenas de longitud variable. También es posible la identificación de expresiones algebraicas considerándolas como palabras. Fue diseñado en 1962 por un grupo de investigación de los laboratorios Bell. Tuvo versiones mejoradas sobre la primera como SNOBOL3 y SNOBOL4, introducida en diciembre de 1969. Entre los ensambladores y el COBOL se situó en la década de los sesenta un nuevo lenguaje de IBM cuyo uso permaneció incluso en los setenta y, en algunas instalaciones, ha llegado hasta tiempos muy recientes. Fue conocido con las siglas RPG, Report Program Generator, es decir, se trataba de un generador de programas con los que producir informes. Otras marcas también facilitaron sistemas similares aunque con distintos nombres. El sistema se utilizó Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 89 Los primeros tiempos del software (parte II) con frecuencia en muchas instalaciones comerciales. La literatura técnica de aquel entonces no se atrevió a clasificar el sistema entre los lenguajes de programación a pesar de que, en cierto modo, podía operar a nivel incluso más alto que COBOL. Con este sistema era posible seleccionar los datos de entrada, interpretar las fichas perforadas (soporte de la información de aquellos años), mantenimiento, fusión y comparación de ficheros, ejecución de cálculos simples, presentación posterior de formularios impresos, etc. El programa fuente escrito en RPG contenía ciertos tipos de instrucciones que indicaban al generador los datos a procesar, las operaciones de cálculo a ejecutar con ellos y las unidades periféricas a utilizar. Todo ello lo indicaba el programador rellenando el correspondiente patrón preimpreso. à El software de sistemas Junto con los programas encargados de resolver los problemas del usuario (software de aplicaciones) ya dijimos que existía otra categoría cuyo objeto es el de manejar automáticamente los recursos del ordenador durante el proceso de las distintas tareas (jobs). Sabemos, por ejemplo, que la mayor parte de los trabajos rutinarios, como podría ser la preparación de una nómina en un centro de proceso de la información, presentaban muchas variaciones según el usuario del que se tratara, de tal forma que ese programa se intermezclaba e interaccionaba con otros más cortos y sencillos que empleaban ficheros de diferentes maneras. Uno de esos programas podría constar de unas pocas líneas de código y unos pocos datos; otro es posible que utilizara pocos registros pero que ejecutara muchas operaciones con ellos; un tercero usaría muchos registros y muy pocas operaciones sobre los mismos. El panorama que se presenta al ordenador es por tanto extremadamente variado y nunca estará sujeto a reglas fijas en el tiempo. Por otra parte, era el hombre el que llevaba a cabo esa preparación de ligar unos programas con otros para conseguir el resultado perseguido con el computador. Por eso, las primeras instalaciones relegaban al juicio del operador la organización y planificación de este tipo de tareas. Cuando los problemas fueron aumentando en número y complejidad, se comenzaron a desarrollar ciertos programas que ya en los sesenta dominaron la industria. Se conocieron como sistemas operativos. Uno de los más primitivos se diseñó y desarrolló en casa de un usuario, en los laboratorios de la General Motors, a comienzos de 1956, teniendo una gran influencia sobre otros usuarios y sobre todo sobre las marcas de aquel entonces. Su éxito constituyó el principio de lo que acabó llamándose batch processing, proceso por lotes, consistente en agrupar los distintos trabajos en un solo bloque de fichas perforadas, separados unos de otros por ciertas tarjetas de control de forma que la máquina distinguía perfectamente el principio y final de cada uno de ellos, ejecutándolos secuencialmente y sin interrupción. El trabajo humano era simple y se limitaba a preparar el bloque total. Las tarjetas de control llevaban perforados en unas determinadas columnas (normalmente en las primeras) los códigos apropiados según fueran las acciones que se requerían del computador. Esos códigos indicaban si se trataba de una compilación, de la ejecución de un nuevo programa o simplemente de unos datos. En IBM, esto dio lugar a la aparición de un nuevo lenguaje denominado Job Control Language, JCL, es decir, un lenguaje con el que se controlaba la secuencia de los trabajos. Ejemplos típicos de este tipo de claves de control eran los códigos // o bien /* perforados en las dos primeras columnas de las tarjetas. Diagrama de flujo de un proceso por lotes. En el entorno universitario se dieron las mismas necesidades al tener que gestionar el flujo de los trabajos de manera eficiente. Los programas de los alumnos cambiaban de una semana a otra o de un estudiante a otro, por lo que se hizo necesario que todos ellos recibieran mensajes claros acerca de la clase de errores que cometían y cómo solucionarlos. En 1959 apareció el sistema MAD, Michigan Algoritmic Decoder, desarrollado en la Universidad de Michigan por Bernie Galler, Bob Graham y Bruce Arden. Estaba basado en ALGOL pero se ocupaba 89 Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 90 ACTA Los primeros tiempos del software (parte II) de los detalles del proceso sucesivo y secuencial de los trabajos. Las ventajas que ofrecía este sistema, entre otras, eran una rápida compilación y buenos diagnósticos para ayudar al estudiante a encontrar los errores y corregirlos, todo lo cual es primordial en un centro de formación académico. Tanto las instalaciones comerciales como las académicas tenían los mismos objetivos: acomodar programas de diferentes longitudes y complejidad. También, y ahora por razones económicas, se hacía necesario conseguir que el computador estuviera ocupado la mayor parte del tiempo. Pocas marcas conseguían esto con sus máquinas; los creadores del MAD sí lo lograron. Pero volvamos a la actuación de los programas del sistema en un proceso por lotes. Cuando un programa fuente contenía un simple error sintáctico, el sistema operativo era capaz de decidir si el computador debía continuar tratando de resolver el problema o no. Si decidía que no, simplemente transfería el contenido de la parte de memoria donde se encontraba el problema a una impresora, impresión que contenía filas de números (no siempre en el sistema decimal, más bien en hexadecimal), suspendía el trabajo en curso y comenzaba a ejecutar el trabajo siguiente de la cola. La palabra que los técnicos de la informática empleaban, y aún se emplea, para este proceso era dump; se hacía un dump de memoria, lo que significa una descarga, un vaciado de una parte de la memoria sobre un periférico que en este caso era una impresora. A medida que los sistemas operativos evolucionaron, el empleo de la memoria aumentó hasta que llegó un momento en que ya no quedaba memoria suficiente para procesar el propio programa del que se acababa de hacer la diagnosis. Por ello esos sistemas cada vez eran más complejos como lo indica también la evolución de su nombre. Comenzaron llamándose monitors (monitores), luego supervisor systems (sistemas supervisores) y finalmente operating systems (sistemas operativos). En los primeros tiempos los sistemas más simples los desarrollaron los propios usuarios, como ocurrió con el Sistema Monitor para Fortran para la serie de máquinas IBM 7090. SOS, de Share Operating System, fue otro sistema operativo aún más complejo y también muy eficiente desarrollado por SHARE para los mainframes de IBM. Cuando IBM decidió tener una sola línea de negocio fusionando la científica y la comercial con la aparición de la arquitectura System/360, que fue un éxito para IBM y revolucionó la industria de los computadores, desarrolló el sistema operativo OS/360 que estuvo disponible en 1966, sistema con múltiples fallos en sus primeros años de existencia. 90 La historia de las dificultades de los primeros sistemas operativos se repitió con la aparición del minicomputador, el mini, a mitad de los sesenta: el primero de ellos sólo tuvo capacidad de memoria para soportar un monitor muy simple. Cuando estas máquinas evolucionaron en potencia también sus sistemas operativos fueron más potentes y eficientes. Eso fue lo que ocurrió con los VAX y su sistema VMS de la compañía DEC, Digital Equipment Corporation, en el año 1978. Y aún más: el fenómeno se volvió a repetir con la aparición de los primeros ordenadores personales que poseían unos monitores rudimentarios que cargaban los datos almacenados en una cinta casete; pasaron más tarde a disponer de auténticos sistemas operativos en disco magnético (disco duro). à Ciencia de la Computación Informática Al final, todos los casos anteriores lo que nos muestran es que se hizo más esfuerzo en el desarrollo de los sistemas operativos que en el diseño y evolución de los lenguajes de programación. Ahora bien; mientras que los sistemas operativos eran misión de las marcas, los lenguajes se convirtieron en una disciplina académica y ello condujo a la aparición de una especialidad dentro de la universidad: Ciencia de la Computación (Computer Science) para los países anglosajones, Informática para los más latinos. Esta disciplina aparece a finales de los cincuenta en instituciones como Stanford y Purdue bajo nombres diferentes y en los departamentos de Matemáticas e Ingeniería Eléctrica. Se estableció un punto de arranque basado en computadores baratos con tambor magnético, como el Librascope LGP-30 y la máquina IBM-650. La disciplina comenzó a tomar cuerpo y a legitimarse en cursos de verano universitarios impartidos en 1955. A principios de los sesenta la ciencia de los computadores pugnó por definirse a sí misma y establecer sus objetivos en relación no sólo en cuanto a materias de ingeniería eléctrica y matemática aplicada sino también sobre la utilización del computador en contabilidad, archivos y trabajo administrativo en general. Una de las personas que más influyó en este arranque fue el profesor George Forsysthe, de la Facultad de Matemáticas de la Universidad de Stanford. Bajo su liderazgo se creó la División de Ciencia de la Computación dentro del Departamento de Matemáticas en 1961. La propia universidad creó cuatro años más tarde un departamento separado que fue el primero de esta disciplina establecido en los Estados Unidos. Su prestigio nacional e internacional ha llegado hasta nuestros días. Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 91 Los primeros tiempos del software (parte II) Herbert Alexandre Simon Alan Perlis Herbert Simon nació en Milwaukee, Wisconsin, el 15 de junio de 1916 y falleció el 9 de febrero de 2001. Cursó estudios en la Universidad de Chicago, en la que se graduó en 1936. El grado de doctor lo obtuvo en 1943. Trabajó como profesor asistente en esa universidad entre los años 1936 y 1938 así como también en organizaciones ligadas a la gestión de organismos públicos. Fue profesor auxiliar entre 1942 y 1947 y profesor titular de ciencias políticas entre 1947 y 1949. En 1949 comenzó a trabajar en el Instituto de Tecnología Carnegie, enseñando administración y psicología. A partir de 1966 su docencia pasó a ejercerla en la materia de ciencias de la computación. Fue un pionero y fundamental en el campo de la inteligencia artificial. Perlis nació en Pittsburg el 1 de abril de 1922 y falleció el 7 de febrero de 1990 en New Haven, Connecticut. Cursó la licenciatura de química en el Instituto de Tecnología Carnegie, ingresando luego en la fuerza aérea, en la que combatió durante la Segunda Guerra Mundial. A su regreso a Estados Unidos se doctoró en matemáticas en el MIT. Recibió la medalla Turing de ACM en 1975 junto con Allen Newell por su contribución a la inteligencia artificial, a la psicología cognitiva humana y al proceso de listas. Fue designado también Distinguished Fellow de la Asociación Norteamericana de Economía. Recibió el Premio Nobel de Economía en 1978. En 1952 comenzó a trabajar en el laboratorio de la Universidad Purdue, obteniendo poco después la cátedra de matemáticas. En la Universidad Carnegie fue el director de los Departamentos de Matemáticas y de Ciencias de la Computación. Su especialidad fueron los lenguajes de programación. En 1957 dirigió un comité de la ACM con el fin de diseñar un lenguaje de programación universal que culminó con el ALGOL-60. Recibió en 1966 el primer premio Turing, otorgado por sus aportaciones al campo de la computación. Allen Newell Allen Newell nació el 19 de marzo de 1927 en San Francisco y fallece el 19 de julio de 1992 en Pittsburg. Sus investigaciones se dirigieron al campo de la computación y de la psicología cognitiva. Fue también uno de los pioneros de la inteligencia artificial, junto con Minsky, Simon y McCarty, contribuyendo a la creación del lenguaje IPL, Information Processing Language, en 1956. De izquierda a derecha, Simon y Newell. En el otoño de 1967 tres profesores del Instituto de Tecnología Carnegie, en Pittsburg, Herbert Simon, Alan Perlis y Allen Newell, escribieron una cartaartículo al editor de la prestigiosa revista Science donde definían la ciencia de la computación como el estudio de los computadores, definición que conllevaba no sólo la noción de computador como una máquina estática sino más bien como un sistema capaz de ejecutar procesos dinámicos de acuerdo con una serie de reglas. Defendieron siempre esta noción Se graduó en física en Stanford en 1949, ampliando después estudios de matemáticas en Princeton. Obtuvo el grado de doctor en 1957. Trabajó para RAND Corporation desde 1950 hasta 1961, donde conoció a Herbert Simon que era profesor de administración industrial en el Instituto de Tecnología Carnegie. Comenzó su carrera docente en 1961 y jugó un papel fundamental en la creación del Departamento de Ciencia de la Computación en Carnegie Mellon. Recibió el premio Turing de ACM en 1975 junto con Herbert Simon y la Medalla Nacional de las Ciencias en 1992. Escribió más de 250 publicaciones de las cuales 10 fueron libros. 91 Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 92 ACTA Los primeros tiempos del software (parte II) contra quienes consideraban que el computador era un desarrollo, un fenómeno del hombre y por lo tanto no una ciencia natural. El primero de ellos, Herbert Simon, obtuvo el Premio Nobel por su trabajo encuadrado en lo que podríamos denominar ciencia de la gestión. Con el título The Sciences of the Artificial, se publicaron las lecciones impartidas por Simon en defensa de la tesis de que los fenómenos de las ciencias naturales no están reñidos con los debidos a la creación humana y por tanto no resulta equivocado crear una ciencia que estudie lo artificial. à ACM Association for Computing Machinery Seis meses más tarde de publicarse la carta aludida en la revista Science, ACM, Association for Computing Machinery, dio a la luz Curriculum 68. Era un informe en el que se relacionaba el conjunto de asignaturas que la asociación consideraba debían cursar aquellas personas que deseaban graduarse en informática. ACM hacía énfasis en las bases teóricas y matemáticas que los estudiantes deberían poseer para alcanzar la graduación. También se refería a procedimientos algorítmicos, lenguajes de programación y estructuras de datos. Pero no se hablaba en aquel manual del hardware. Sin embargo, en una versión del año 1965, anterior a la que nos estamos refiriendo, sí se consideraban, aunque fuera como optativas, asignaturas relacionadas con la electrónica y los computadores analógicos. Por ello, y fijándose en el informe del 68, Simon, Perlis y Newell aconsejaban a los futuros informáticos cursar también estudios de ingeniería eléctrica. El resumen sería que por el año sesenta y ocho la ciencia de los computadores era ya una ciencia respetable en Estados Unidos; su importancia también llegó a Europa de la mano de Francia. Y en España debemos citar la creación del Instituto de Informática de Madrid en 1969, del que fuimos su primer Jefe de Estudios, institución piloto dependiente directamente del Ministerio de Educación que fue el precursor de las primeras facultades, como la Facultad de Informática de la Universidad Politécnica de Madrid, pionera de las creadas en España. Además patrocina conferencias internacionales y facilita diversos servicios a sus miembros asociados. à Aparición de la programación estructurada Se hizo famosa en el mundo informático la frase de Dijkstra, La sentencia GO TO considerada como 92 ACM ACM, Association for Computing Machinery, fue creada en el año 1947 en Estados Unidos como una sociedad pionera científica y formativa en el campo de la Ciencia de la Computación. Publica diversas revistas especializadas siempre relacionadas con algún campo de la informática. Su revista mensual oficial lleva el título Communications of the ACM, manteniendo desde su aparición contenidos del más alto nivel en todos sus artículos. Tiene miles de socios en todo el mundo. Portada de un número de la publicación oficial de ACM Las revistas abarcan los más variados temas, como gráficos por ordenador, algoritmos, sistemas distribuidos, sistemas multimedia, etc. También tiene publicaciones especializadas por grupos de interés (Special Interest Group, SIG), como las dedicadas a los lenguajes de programación, aplicaciones de la computación, arquitectura de computadores, recuperación de información, ingeniería del software, sistemas operativos y un largo etcétera. perniciosa. Edsger Dijkstra ha sido profesor de la Universidad Técnica de Eindhoven, Holanda. Envió una carta en marzo de 1968 a la misma publicación de ACM donde apareció el Curriculum al que se ha hecho mención y la frase aludida era precisamente el título del escrito que envió. La carta comenzaba así: Durante muchos años he observado que la calidad de los programadores disminuye cuanto más utilizan la sentencia go to en los programas que producen. Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 93 Los primeros tiempos del software (parte II) las siguientes estructuras de control: secuencias, bifurcaciones condicionales o estructuras de selección y repeticiones. Según este teorema, las estructuras básicas de todo programa bien estructurado, son tres: La secuencia: conjunto de instrucciones ejecutadas una a continuación de la otra, una sola vez. Edsger Dijkstra La sentencia go to era una sentencia de bifurcación disponible en todos los lenguajes de programación de hace años. Se trataba de una orden escrita por el programador en el programa fuente para saltar a otra sentencia del programa que no fuera la siguiente en el orden secuencial lógico. Ejecutaba una bifurcación incondicional. La carta de Dijkstra puso de relieve un planteamiento que se ha hecho duradero y permanente en la informática hasta nuestros días, planteamiento con el que pretendía cambiar los fundamentos de la creación de programas. Sus esfuerzos se encaminaron a transformar la ciencia de la computación en otra con bases teóricas más formales, lo que suponía mover los sistemas de software de aquellos años desde unos cimientos de arena a otros teóricos asentados sobre roca. LA PROGRAMACIÓN ESTRUCTURADA La programación estructurada es un estilo, a la vez que una herramienta, de diseño de programas encaminado a que éstos reflejen fielmente la estructura algorítmica de la solución. Esta técnica tiene en cuenta la codificación de los programas utilizando un número limitado de estructuras de control para así formar unidades altamente estructuradas de código legible, más fácil de comprobar, mantener y modificar. En la programación estructurada está expresamente prohibido el uso de la sentencia GO TO. Este estilo de programación está basado en el teorema de la estructura, probado matemáticamente, que establece que cualquier programa con una entrada y una salida, es equivalente a otro programa que contenga únicamente La selección: elección entre una o más secuencias, de tal forma que se ejecuta una sola vez una de las secuencias, mientras que las restantes no se ejecutan nunca. La repetición: ejecución repetida de una secuencia un número determinado de veces. Se trata de la iteración. Cualquier algoritmo, y su correspondiente programa, puede construirse mediante el empleo de estas tres estructuras. No obstante, la estructura secuencia no es lo suficientemente potente para, sólo con ella, tratar de resolver todos los problemas. Con frecuencia, se hace necesario la toma de decisiones, y ello supone la utilización de la estructura de selección para tomar una alternativa entre varias posibilidades. El hecho de utilizar esta praxis, por cada conjunto de sentencias dentro del programa, y por cada una de las estructuras que lo conformen, existirá exactamente un punto de entrada y un punto de salida y, en consecuencia, el seguimiento del programa a efectos de diagnosis podrá hacerse de manera más sencilla. Todo lenguaje de programación de tipo imperativo, como son Fortran, Pascal, C, etc., dispone de distintas variantes en cada una de las tres estructuras, representadas por esquemas sintácticos adecuados. Los métodos de la programación estructurada se deben a E. Dijsktra. En los círculos técnicos se organizó un gran debate sobre el uso o no de la denostada sentencia go to. Pero realmente Dijsktra estaba preocupado por algo más profundo que por ese comando particular causante de la chispa. En esta corriente tan diversa, algunos incluso llegaron a dudar de la relevancia de la enseñanza de la computación en las aulas universitarias. Lo positivo de este debate fue que con él se dio nacimiento a la programación estructurada, un méto- 93 Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 94 ACTA Los primeros tiempos del software (parte II) do que sus defensores lo consideraban como la manera de convertir el arte de la programación, como la llamaba Knuth en sus libros, en una verdadera ciencia. Si la carta de Dijkstra fue o no el detonante lo cierto es que la programación a partir de ese momento se movió en esa dirección en los años que siguieron. à Ingeniería del software En octubre de 1968 se convocó una conferencia en Garmisch, sur de Alemania, con el llamativo título de Ingeniería del Software, que quería marcar el final de la edad de la inocencia, una constatación de que la crisis por la que atravesaba la producción del software no finalizaría pronto pero sí que podía y que tenía que reconducirse. Decíamos que el título todo él y sobre todo su primera palabra, ingeniería, era llamativo y provocativo; pero se hizo deliberadamente y sugería que lo que estaba detrás de la crisis del software era el hecho de que los programadores ignoraban los fundamentos teóricos y las disciplinas de la práctica diaria en la que se fundamentaban otros campos tradicionales de la ingeniería. La conferencia, que fue patrocinada por la NATO, también reveló la notable distancia existente entre la ingeniería del software y la propia informática, cuyo centro era la universidad. Los organizadores eran conscientes de que los computadores eran responsables en muchos casos de poner en riesgo vidas humanas, incluyendo en esa responsabilidad a los sistemas militares empleados por la NATO. Estos sistemas no deberían tolerar ninguno de los errores que de hecho se podían producir en un entorno de proceso de datos por lotes (descrito anteriormente). Por ello se pensó que debería existir una semejanza con otras formas de ingeniería como la ingeniería civil en la que, por ejemplo, cuando cruzamos un puente todos confiamos en los expertos que lo han diseñado. En otros aspectos sin embargo, esa analogía no se da. En ingeniería civil han funcionado siempre las certificaciones de obra y existe una cadena de responsabilidades legales caso de siniestro. Eso no se daba en la computación en general y tampoco en la producción del software en particular. En 1996 se celebró una nueva conferencia, también en Alemania, sobre el tema del software, concretamente sobre la historia de la ingeniería del software, llegándose a la inesperada conclusión de que los intentos habidos para establecer una auténtica ingeniería en la producción conjunta de los sistemas software habían fallado. 94 à Nuevas estrategias en la venta del software En diciembre de 1968, y bajo la presión del gobierno estadounidense, IBM anunciaba en todo el mundo que el siguiente año desempaquetaría su software, es decir, lo vendería separadamente en lugar de cargarlo juntamente con sus sistemas de hardware. Uno de los primeros productos con los que IBM se inauguró en esta estrategia fue el CICS, Customer Information Control System, un sistema para el control de las comunicaciones, producto que alcanzó rápidamente un gran éxito y que IBM aún sigue manteniendo en catálogo y mejorándolo día a día con las innumerables versiones que de él han ido apareciendo. Comenzó a ofrecerlo en julio de 1969 por 600 $ al mes en soporte de cinta magnética. El software, que hasta entonces había sido como algo etéreo, podía a partir de ahora comprarse y venderse libremente. Como consecuencia de todo esto, aparecieron en el mercado otros vendedores de software no ligados a ninguna marca: comenzaba el mercado libre del software. Además, los efectos de lo que estaba ocurriendo en los campus universitarios marcaron la trayectoria de lo que había que recomendar a las fábricas productoras de software, es decir, la programación se hizo más profesional, más estructurada y con bases teóricas más firmes. Al mismo tiempo, la industria de los computadores pasó por su época más innovadora. Y así, a finales de la década de los sesenta apareció en el mercado el circuito integrado, lo que incrementó la venta de los sistemas comerciales que, a su vez, potenciaba una nueva clase de computadores baratos, eso sí, de limitadas posibilidades en cuanto a su memoria interna, por lo que no era posible, en la mayoría de los casos, implementar en ellos lenguajes altamente estructurados, como Pascal. Los programadores recurrieron de nuevo a los lenguajes no estructurados, a los ensambladores e incluso, de nuevo, al go to. En 1969 aparece un nuevo sistema, el UNIX. Estos fueron sus inicios. Ken Thompson y Denis Ritchie eran dos profesionales que trabajaban en los laboratorios de la Bell Telephone en Murray Hill, New Yersey. Ellos crearon el sistema operativo UNIX sobre el minicomputador PDP-11 de DEC, máquina con unos recursos de memoria extremadamente limitados. Thompson escribió la primera versión del sistema en lenguaje ensamblador y después sus colegas desarrollaron un lenguaje de programación de sistemas que llamaron lenguaje B, que se convirtió en el lenguaje C en 1973 y más tarde en 1978 en un len- Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 95 Los primeros tiempos del software (parte II) guaje de propósito general, como lo definen sus creadores en The C Programming Language. Conviene recordar las palabras de Ritchie para definir este nuevo lenguaje: se trata de un lenguaje próximo a la máquina. Eso significaba que, para sus creadores, C conservaba la potencia del lenguaje ensamblador, era un lenguaje para la creación de programas de sistemas y, por lo tanto, no era un lenguaje de alto nivel como Pascal o FORTRAN. Tampoco tenía en cuenta, en sus inicios, las normas de la programación estructurada. No obstante, se convirtió en uno de los lenguajes más populares cuando apareció en el mercado el ordenador personal y, más tarde, el gigante del software Microsoft. Estas son las frases que Kernigham y Ritchie escriben en el prólogo de su libro en el que definen el lenguaje: C ha sido diseñado originalmente e implementado sobre un sistema operativo UNIX en una máquina DEC PDP-11 por Dennis Ritchie. El sistema operativo, el compilador C y todos los programas de aplicación UNIX (incluidos los necesarios para preparar este libro) están escritos en C. También han aparecido compiladores para otras máquinas como el Sistema 370 de IBM, Honeywell 6000 e Interdata 8/32. C no está vinculado a ningún hardware o sistema particular; sin embargo, es sencillo escribir programas que podrán procesarse sin cambios sobre cualquier máquina que soporte C. El éxito de UNIX y C compensaron las debilidades de ALGOL-68 y PL/1, los dos lenguajes aparecidos a finales de los sesenta. Ya nos hemos referido a ALGOL-68, que significó un intento por mejorar ALGOL-60. Pero lo cierto es que, fuera del entorno académico, la versión 68 únicamente fue implementada y soportada por máquinas de Burroughs Coorporation. Muchos pensaron que el escaso soporte de FORTRAN por parte de IBM condenaba a este lenguaje a su postración, sobre todo cuando la compañía anunció PL/1. Pues bien; por una parte, el legado de ALGOL-68 fue un nuevo lenguaje, Pascal, lenguaje muy bien estructurado que Nicholas Wirth, del Ins- tituto Técnico Federal de Suiza, desarrolló como reacción a la complejidad contenida en la última versión de ALGOL. Por otra parte, el esfuerzo de IBM por desarrollar un lenguaje para reemplazar FORTRAN y COBOL y alimentar así a sus nuevas arquitecturas orientadas al proceso de aplicaciones tanto comerciales como científicas, no tuvo demasiado éxito como vamos a ver. La compañía consideró que el diseño y producción de un nuevo lenguaje podría resolver la problemática de los dos mercados. Un comité conjunto de IBM y (de nuevo) SHARE llegó a la conclusión de que el nuevo lenguaje no debía ser una ampliación del FORTRAN, aún a sabiendas de que la versión de aquel entonces, FORTRAN IV, era muy popular y muy utilizada. El nuevo lenguaje se llamó PL/1, Programming Language 1, y era una derivación de FORTRAN, COBOL y ALGOL. Las primeras versiones aparecieron en 1964, y cuando el nuevo lenguaje estuvo realmente operativo, tanto FORTRAN IV como COBOL estaban ambos muy introducidos ya en el sistema IBM 360. Considerando sus raíces, PL/1 era además un lenguaje extremadamente complejo, lo que unido a la penetración que ya tenían sus dos competidores hizo que PL/1 nunca llegara a ser demasiado popular. à Bibliografía Ceruzzi, P. E., A History of Modern Computing, The MIT Press, 2003. Chenique, François, Software, Dunod, París, 1971. Chomsky, N. y Miller, G. A., El Análisis Formal de los Lenguajes Naturales, Comunicación-Serie B, Madrid, 1972. Kernighan, B. W., Ritchie, D. M., The C Programming Language, Prentice-Hall, 1978. Tucker, Allen B., Jr., Lenguajes de Programación, McGraw-Hill, Madrid, 1987. 95 Primeros tiempos software.qxp 24/07/2009 14:23 PÆgina 96