Download Chapter 1

Document related concepts

Lisp wikipedia , lookup

Dylan (lenguaje de programación) wikipedia , lookup

APL wikipedia , lookup

Programación funcional wikipedia , lookup

Common Lisp wikipedia , lookup

Transcript
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