Agenda • Plankalkul de Zuse • Minimal Hardware Programming: Pseudocódigos • La IBM 704 y Fortran • Programación Funcional: LISP • El primer paso hacia la sofisticación: ALGOL 60 • Computando registros de negocios: COBOL • El inicio del tiempo compartido: BASIC Agenda (continuación) • Todo para todos: PL/I • Dos lenguajes dinámicos: APL y SNOBOL • Los inicios de la abstracción de datos: SIMULA 67 • Diseño ortogonal: ALGOL 68 • Algunos descendientes de ALGOL • Programación basada en lógica: Prolog • Historia del más esfuerzo grande en diseño: Ada Agenda (continuación) • Programación orientada a objetos • Combinando características imperativas y orientadas a objetos: C++ • Un lenguaje orientado a objetos basado en un paradigma imperativo: Java • Lenguajes “escrípticos”: JavaScript, PHP y Python • Un lenguaje basado en C para el nuevo milenio: C# • Lenguajes de programación híbridos basado en etiquetas Genealogía de lenguaes comunes Plankalkül de Zuse • Nunca implementado • Estructuras de datos avanzadas – Punto flotante, arreglos, registros • Invariantes Sintaxis Plankalkül • Una sentencia para asignar la expresión A[4] + 1 a A[5] | A + 1 => A V | 4 5 S | 1.n 1.n datos) (subíndices) (tipos de Mínimo Hardware para programar: Pseudocódigos • ¿Qué estaba mal con usar código máquina? – – – – Legibilidad pobre Posibilidades de modificación pobre Codificación de expresiones tediosa Deficiencias dependientes de máquina – No había posibilidad para indización o manejo de punto flotante Pseudocódigos: Short Code • Short Code fue desarrollado por Mauchly en1949 para las computadoras BINAC – Las expresiones eran codificadas, de izquierda a derecha – Ejemplo de operación: 01 02 03 04 – ) = / 06 07 08 09 abs value + pause ( 1n 2n 4n 58 (n+2)nd power (n+2)nd root if <= n print and tab Pseudocódigos: Speedcoding • Speedcoding fue desarrollado por Backus en 1954 para la IBM 701 • Pseudo ops para funciones aritméticas y matemáticas – Ramificación condicional y no condicional – Auto incremento del registro para el acceso a arreglos – Leeeento – Solo se podían usar 700 palabras para programas de usuario Pseudocódigos: Sistemas Relacionados • El sistema de compilación UNIVAC – Desarrollado por Grace Hopper y su grupo – Pseudocódigo expandido en código máquina • David J. Wheeler (Universidad de Cambridge) – Desarrolló un método que reasignaba direcciones para resolver el problema de direccionamiento absoluto IBM 704 y Fortran • Fortran 0: 1954 – no implementado • Fortran I:1957 – Diseñado para la nueva IBM 704, la cual tenía indización de resgistros y hardware para punto fijo – Ambiente de desarrollo • Las computadoras eran pequeñas y no confiables • Las aplicaciones eran científicas • No había metodologías de programación ni herramientas • La eficiencia de máquina era lo más importante Proceso de diseño de Fortran • Impacto del entorno en el diseño de Fortran I – No había necesidad para el almacenamiento dinámico – Se necesitaba un manejo adecuado de arreglos y ciclos con conteo integrado – No se necesitaban manejar cadenas, aritmética decimal ni un manejo poderoso de I/O Fortran I: Revisión • Primera implementación de Fortran – – – – – Los nombres podían tener hasta 6 caracteres Ciclo con verificación posterior (DO) I/O Formateada Subprogramas definidos por el usuario Tres diferentes sentencias de selección (IF aritmético, <,=,>) – No había sentencias de entrada (escrita) de datos Fortran I: Revisión (continuación) • Primera implementación de FORTRAN – No tenía un proceso de compilación independiente – Compilador liberado en April de 1957, después de 18 años-hombre de esfuerzo – Los programas de más de 400 líneas rara vez compilaban correctamente, debido principalmente a la poca confiabilidad de la 704 – El código era muy rápido – Se adoptó amplia y rápidamente Fortran II • Distribuido en 1958 – Se podía compilar independientemente – Errores de Fortran I resuletos Fortran IV • Evolucionado durante 1960-62 – Declaraciones de tipo explícito – Sentencias de selección lógicas – Estándar ANSI en 1966 Fortran 77 • Llegó a ser un nuevo estándar en 1978 – Incluía manejo de cadenas – Ciclos con sentencias de control lógico – Sentencia IF-THEN-ELSE Fortran 90 • Versión más importante desde Fortran 77 – – – – – – Módulos Arreglos dinámicos Punteros Recursión Sentencias CASE Verificación de tipos Evaluación de Fortran • Compiladores altamente optimizadores – El almacenamiento y tipo de cada variable es verificado en tiempo de ejecución • Cambió dramáticamente la manera en como las computadoras eran usadas • Caracterizado como el lingua franca del mundo computacional Programación Funcional: LISP • LISt Processing language – Diseñado en el MIT por McCarthy • Los investigadores de IA necesitaban un lenguaje para: – Procesar datos en listas (en lugar de arreglos) – Realizar computación simbólica (en lugar de numérica) • Sólamente dos tipos de datos: átomos y listas • La sintaxis está basada en Cálculo lambda Representación de Listas en LISP Evaluación LISP • Programación funcional pionera – No hay necesidad de variables ni asignación – Control vía recursión y expresiones condicionales • Aún es dominante en IA • COMMON LISP y Scheme son dialéctos contemporáneos de LISP • ML, Miranda, y Haskell son lenguajes relacionados Scheme • Desarrollado en el MIT a mediados de los 1970s • Pequeño • Uso estensivo del ámbito estático • Funciones como entidades de primera clase • Sintaxis simple (y reducida), lo hace ideal para aplicaciones educativas COMMON LISP • Un esfuerzo para combinar características de diversos dialectos de LISP en un único lenguaje • Grande y complejo El primer paso hacia la sofisticación: ALGOL 60 • Ambiente de desarrollo – FORTRAN había (apenas) llegado para la IBM 70x – Muchos otros lenguajes habían sido diseñado para máquinas específicas – No había lenguajes portables; todos eran dependientes de una máquina en específico – No existía un lenguaje universal para comunicar algoritmos • ALGOL 60 fue el resultado del esfuerzo para diseñar un lenguaje universal Proceso de diseño • ACM y GAMM se reunieron por cuatro días para realizar el diseño (del 27 de Mayo al 1 de Junio de 1958) • Objetivos del lenguaje – Tener similitudes con la notación matemática – Ser bueno para la descripción de algoritmos – Ser traducible a código máquina ALGOL 58 • El concepto tipo fue formalizado • Los nombres (names) podían ser de cualquier longitud • Los arreglos podían tener cualquier número de subíndices • Los parámetros estaban separados de acuerdo a su modo (in & out) • Los subíndices era colocados entre corchetes • Había sentencias compuestas (begin ... end) • El punto y coma se adoptó como separador de sentencias • El operador de asignación fue := ALGOL 58: Implementación • (no se implementó) se impelementaron variaciones variaciones de él (MAD, JOVIAL) • Aunque inicialmente IBM estaba entusiasmado, dejo de soportarlo a mediados de 1959 ALGOL 60: Resumen • Modificaron ALGOL 58 en una reunión de 6 días en París • Características nuevas – – – – – Estructura de bloques (local scope) Dos métodos para pasar parámetros Subprogramas recursivos Arreglos dinámicos de pila Aún no tenía soporte para I/O; tampoco para manejo de cadenas ALGOL 60: Evaluación • Éxito – Fue el estándar para publicar algoritmos por 20 años – Todos los lenguajes imperativos subsecuentes están basados en él – Primer lenguaje independiente de máquina – El primer lenguaje cuya sintaxis estaba formalmente definida (BNF) ALGOL 60 Evaluación (continuación) • Fracaso – Nunca fue ampliamente usado, especialmente en los E.U. – Razones • La falta de I/O y un conjunto de caracteres extendido produjo programas no portables • Demasiado flexible – difícil de implementar • Fortalecimiento de Fortran • Descripción sintáctica formal • Falta de soporte por parte de IBM Computerizing Business Records: COBOL • Ambiente de desarrollo – UNIVAC fue el inicio para usar FLOW-MATIC – USAF fue diseñado para usar AIMACO – IBM estaba desarrollando COMTRAN COBOL: antecedentes históricos • Basado en FLOW-MATIC • Características de FLOW-MATIC – Nombres hasta de 12 caracteres – Nombres en inglés para operadores matemáticos (inexistencia de expresiones aritméticas) – Datos y código estaba completamente separado – Todas las sentencias iniciaban con un verbo COBOL: Proceso de diseño • Primera reunión de diseño (Pentágono) - Mayo 1959 • Objetivos de diseño – Debía ser similar al inglés cotidiano – Debía ser fácil de usar, aún si eso significaba que fuese menos poderoso – Debía ampliar la base de usuarios de computadoras – No debía estar sesgado por problemas de compiladores contemporáneos • Los miembros del comité de diseño pertencian en su totalidad a manufactureros de computadoras y a ramas del DoD • Problemas de diseño: expresiones ¿aritméticas? ¿subíndices? Peleas entre manufactureros COBOL: Evaluaciónn • Contribuciones – Primera instalación de macros en un lenguaje de alto nivel – Estructuras de datos jerárquicas (registros) – Sentencias de selección anidadas – Nombres largos (hasta 30 caracteres), con guiones – División de datos separada COBOL: Influencia del DoD • Primer lenguaje obligatorio por DoD – Hubiera fallado sin el apoyo del DoD • Aún es el lenguaje más ampliamente usado para aplicaciones de negocios El inicio del tiempo compartido: BASIC • Diseñado por Kemeny & Kurtz en Dartmouth • Objetivos de diseño: – Fácil de aprender y de usar por estudiantes no científicos – Debía ser “placentero y amigable” – Tiempo de respuesta rápido para tareas – El tiempo del usuario es más importante que el tiempo de máquina • Dialecto popular actual: Visual BASIC • El primer lenguaje ampliamente usado con tiempo compartido Todo para todos: PL/I • Diseñado por IBM y SHARE • Situación de la computación en 1964 (punto de vista de IBM) – Computación científica • Computadoras IBM 1620 y 7090 • FORTRAN • SHARE user group – Computación de negocios • Computadoras IBM 1401, 7080 • COBOL • Grupo de usuarios GUIDE PL/I: antecedentes • En 1963 – Los usuarios científicos comenzaron a necesitar I/O más elaborada, similar a la que cobol tenía; los usuarios de negocios necesitaban punto flotante y arreglos – Parecía que se necesitaba dos tipos de computadoras, de lenguajes y de soporte-demasiado costoso • La solución obvia – Construir una computadora para ambos clases de aplicaciones – Diseñar un lenguaje par ambas clases de aplicaciones PL/I: Proceso de diseño • Diseñado en 5 meses por un comité 3 x 3 – 3 miembros por IBM y 3 por SHARE • Concepto inicial – Una extensión de Fortran IV • Inicialmente llamado NPL (New Programming Language) • Nombrado PL/I en 1965 PL/I: Evaluación • PL/I contribuciones – – – – Concurrencia de primer nivel Primer lenguaje con manejo de excepciones Recursión basada en switch Primera implementación de puntero como tipo de dato puntero • Preocupación – Muchas nuevas características fueron diseñadas con poca profundidad – Demasiado grande y complejo Dos lenguajes dinámicos iniciales: APL y SNOBOL • Caracterizados por ser de tipado dinámico y asignación dinámica de almacenamiento • Las variables no tenían tipo – Una variable adquiría su tipo cuando se le asignaba un valor • El almacenamiento se asignaba a una variable cuando a esta se le asignaba un valor APL: un lenguaje de programación • Diseñado como un lenguaje de descripción de hardware en IBM por Ken Iverson en 1960 – Altamente expresivo (muchos operadores, para ambos, escalares y arreglos de varias demensiones – Los programas eran de muy difícil lectura • Aún en uso; cambios mínimos SNOBOL • Diseñado para manipular cadenas en Bell Labs por Farber, Griswold, y Polensky • Operadores poderosos para string pattern matching • Más lento que lenguajes alternativos • Aún en uso para ciertas tareas de procesamiento de texto El inicio de la abstracción de datos: SIMULA 67 • Diseñado primariamente para simulación de sistemas en Norway por Nygaard y Dahl • Basado en ALGOL 60 y SIMULA I • Contribuciones primarias – Co-routinas – un tipo de subprograma – Implementado en una estructura llamada clase – Las clases son las bases para la abstracción de datos – Las clases son estructuras que incluyen ambos: datos locales y funcionalidad Diseño ortogonal: ALGOL 68 • Un desarrollo consecuente de ALGOL 60 pero no un superconjunto de dicho lenguaje • Fuente de muchas nuevas ideas (a pesar que nunca alcanzó un uso generalizado) • El diseño está basado en conceptos de ortogonalidad – Unos cuantos conceptos de principo combinados con unos cuantos mecanismos ALGOL 68: Evaluación • Contribuciones – Estructuras de datos definidas por el usuario – Tipos de referencia – Arreglos dinámicos (llamados flex arrays) • Comentarios – Menos usado que ALGOL 60 – Tuvo fuerte influencia en lenguaes subsecuentes, especialmente, en Pascal, C y Ada. Descendientes iniciales de ALGOL • El lenguaje ALGOL impacto en todos los lenguajes imperativos – – – – – – – Pascal C Modula/Modula 2 Ada Oberon C++/Java Perl (hasta cierto punto) Pascal - 1971 • Desarrollado por Wirth (un miembro del comité de ALGOL 68) • Diseñaba para enseñar programación estructurada • Pequeño, simple, nada realmente nuevo • El que más ha impactado en la enseñanza de programación – Desde mediados de los 1970s hasta finales de los 1990s, fue el más usado para enseñar programación C - 1972 • Diseñado para programación de sistemas(en Bell Labs por Dennis Richie) • Evolución de from BCLP, B, pero también ALGOL 68 • Poderoso conjunto de operadores, con una verificación deficiente de tipos • Se difundió inicialmente a través de UNIX • Muchas áreas de aplicación Perl • Relacionado con ALGOL únicamente a través de C • Un lenguaje de scripting – Un sript (file) contiene instruciones para ser ejecutadas – Otros ejemplos: sh, awk, tcl/tk • Desarrollado por Larry Wall • Las variables de Perl son estaticamente tipadas e implicitamente declaradas – Tres “namespaces” distintivos, denotados por el primer caracteres del nombre de una variable • Poderoso pero algo peligroso • Ampliamente usado como un lenguaje de propósito general Programación basada en lógica: Prolog • Desarrollado por Comerauer y Roussel (Universidad de Aix-Marseille), con ayuda de Kowalski ( Universidad de Edinburgo) • Basada en lógica formal • No-procedural • Se puede resumir como un inteligente sistema de base de datos que utiliza un proceso de inferencia para deducir la verdad de las consultas dadas • Altamente ineficiente, reducida área de aplicación Historia del esfuerzo más grande de diseño: Ada • Inmenso esfuerzo en diseño, involucrando a cientos de personas, mucho dinero y cerca de 8 años – Requerimientos de – Requerimientos de 1975) – Requerimientos de – Requerimientos de – Requerimientos de Strawman (Abril 1975) Woodman (Agosto de Tinman (1976) Ironman (1977) Steelman (1978) • Nombrada Ada por Augusta Ada Byron, conocida como la primer programadora Ada: Evaluación • Contribuciones – – – – Paquetes – soporte para abstracción de datos Manejo de excepciones Programas genéricos Concurrencia – a través de un modelo de tareas • Comentarios – Diseño competitivo – Incluía todo lo conocido en ingeniería de software y diseño de lenguajes – Los primeros compiladores eran muy complicados; el primer compilador realmente usable fue desarrollado 5 años después de que el diseño del lenguaje fuera completado Ada 95 • Ada 95 (inició en 1988) – Soporte para OOP a través de derivación de tipos – Mejores mecanismos de control para datos compartidos – Nuevas características de concurrencia – Bibliotecas más flexibles • Su popularidad se disminuyó cuando DoD no requierió su uso debido a la popularidad de C++ Programación orientada a objetos: Smalltalk • Desarrollada por Xerox PARC, inicialmente por Alan Kay, posteriormente por Adele Goldberg • La primera implementación completa de un lenguaje orientada a objetos (datos, abstracción, herencia y dynamic type binding) • Pionero en el uso de interfaces gráficas • Promotor de la programación orientada a objetos Combinando programación imperativa y programación orientada a objetos: C++ • Desarrollada en Bell Labs por Stroustrup en 1980 • Evolución de C y SIMULA 67 • Facilidades para programación orientada a objetos tomada parcialmente de SIMULA 67 • Provee manejo de excepciones • Un lenguaje complejo y grande, en parte es debido al soporte de programación estructurada y OO • Crecimiento rápido en popularidad conjuntamente con OOP • Estándar ANSI aprovado en November 1997 • La versión de Microsoft (liberada con .NET in 2002): gestiona C++ – interfaces, sin herencia múltiple Lenguajes OOP relacionados • Eiffel (diseñado por Bertrand Meyer 1992) – No fue derivado directamente de ningún otro lenguaje – Más pequeño y simple que C++, pero casi con todo su poder – Perdió popularidad ante C++ porque muchos programadores provenían de C • Delphi (Borland) – Pascal + características para soportar OOP – Más elegante y seguro que C++ Un lenguaje imperativo orientado a objetos: Java • Desarrollado por Sun a principios de los 1990s – C y C++ no fueron satisfactoriamente aplicados a dispositivos electrónicos empotrados • Basado en C++ – Significativamente simplificado (no incluía struct, union, enum, aritmética de punteros, y la mitad de las coacciones de asignamiento d e C++) – Soporta sólamente OOP – Tiene referencias pero no punteros – Incluye soporte para applets y una forma de concurrencia Java: Evaluación • Elimina las características inseguras de C++ • Características de concurrencia • Bibliotecas para applets, GUIs y base de datos • Portable: Concepto Java Virtual Machine, compiladores JIT • Ampliamente usado para páginas WWWW Lenguajes de Scripting para la Web • JavaScript – Una aventura conjunta entre Netscape y Sun Microsystems – Usado para programación Web (del lado del cliente) para crear documentos dinámicos de HTML – Relacionado con Java, solo por el nombre • PHP – PHP: Hypertext Preprocessor – Usada para aplicaciones Web (del lado del servidor); produce código HTML como salida • Python – Un lenguaje scripting OO interpretado – Verificación dinámica de tipos Un lenguaje basado en C para el nuevo milenio: C# • Parte de la plataforma de desarrollo .NET • Basado en C++, Java y Delphi • Provee un lenguaje para desarrollo de software basado en componentes • Todos los lenguajes .NET(C#, Visual BASIC.NET, C++ administrado, J#.NET, y Jscript.NET) usan un sistema común de tipos (CTS), el cual provee una biblioteca de clases común Lenguajes híbridos de Markup/Programación • XSLT – eXtensible Markup Language (XML): un lenguaje metamarkup – eXtensible Stylesheet Language Transformation (XSTL) transforma documentos XML para ser desplegados • JSP – Java Server Pages: una collección de tecnologías para soportar documentos Web dinámicos – servlet: un programa Java que reside en un servidor Web; las salidas del servlet es desplegada en el browser Resumen • Desarrollo, desarrollo del ambiente, y evaluación de un número importante de lenguajes de programación