PPT de la última clase del curso de "Introducción a la programación" impartido por EscuelaIT.
Un repaso rápido a la historia de los lenguajes de programación y su clasificación según paradigma (procedurales, estructurados, orientados a objetos, funcionales,...) y su sistema de tipos (dinámicos, estáticos).
3. Grace Murray Hopper
1906 - 1992
Inventó el primer
compilador (A0) para el
UNIVAC 1 en 1951
Popularizó la idea de
lenguajes independientes
de la máquina
4. El primer bug
Se encontró una
arna atrapada en
una válvula del
Mark 2
5. Primeros ordenadores
• 1943 Colossus Mark 1,2,3
• 1946 ENIAC
• Primer Turing completo
• 1960 Circuito integrado
• 1971 Microprocesador
• 1981 IBM PC
6. Turing completo
Un ordenador es “turing completo” si tiene un poder computacional
equivalente a la máquina universal de Turing
• Si tuviese memória infinita
• Si tuviese almacenamiento infinito
Tesis Church-Turing: Todo algoritmo puede ser descrito mediante una
máquina universal de Turing.
Es el inicio de los ordenadores programables (arquitectura de Von
Neumann)
8. 70’s segunda generación
• Pascal (1970)
• C (1972)
• Prolog (1972)
• ML (1973)
• Scheme (1975)
• SQL (1978)
9. 80’s – Imperativos al poder
Se mejoran y combinan los paradigmas
inventados en las décadas 60-70.
• C++ (1980)
• MATLAB (1984)
• Eiffel (1985)
• Erlang (1986)
• Perl (1987)
15. Imperativos secuenciales
El código se ejecuta en el orden en que está
escrito
Control de flujo muy reducido (salta x líneas, salta
a la línea x)
No hay encapsulación de ningún tipo (todas las
variables globales)
Ejemplo: Ensamblador
16. Imperativos estructurados
Basados en los secuenciales añaden secuencias
básicas de estructura:
Secuencias
Bucles (for, while, loop)
Condicionales (if/switch)
No hay encapsulación de ningún tipo
Ejemplo: Basic
17. Imperativos procedurales
Código es básicamente un conjunto de procedimientos
(funciones).
Un procedimiento concreto es el “inicial”
El programa consiste en una secuencia de llamadas a
procedimientos
Encapsulación de estado de procedimiento (variables
locales)
Ejemplo: C, Pascal
18. Imperativos orientados a objetos
Código consiste en un conjunto de objetos que colaboran entre ellos.
Objeto consiste en identidad, estado y funcionalidad
Encapsulación a nivel de objeto (estado)
Basados en clases (Smalltalk, Java, C#, C++, Ruby)
Usan clases para definir la funcionalidad y posibles valores de los estados de los
objetos
Basados en objetos (JavaScript)
Se definen objetos y se especifica su funcionalidad y estado ad-hoc para cada
objeto
Todos ellos soportan las características “básicas” de la OOP (herencia,
polimorfismo, ...)
19. Declarativos lógicos
Lenguajes basados en la lógica formal
Programa es un conjunto de sentencias en
lógica formal indicando hechos y reglas
sobre un determinado problema
Ejemplo: Prolog
20. Declarativos funcionales
Código basado en funciones entendiendo por
función el concepto matemático de ella: sin
cambios de estado, inmutabilidad, sin efectos
colaterales (función “pura”)
Muy basados en recursión y en tratamiento de
listas (influencia matemática)
Ejemplos: Scala, F#, LISP, Scheme, Haskell
22. Tipado estático vs dinámico
En tipado estático...
1. El tipo de una variable es fijo e inmutable
2. El tipo de una variable es conocido en algun momento antes de
usarse
En tipado dinámico...
1. El tipo de una variable es mutable
2. El tipo de una variable no tiene por que ser declarado ni conocido
de antemano
23. Tipado fuerte vs tipado débil
No hay definición clara sobre lo que es tipado fuerte y tipado débil.
En general decimos que un lenguaje tiene tipado débil si las reglas sobre lo
que se puede hacer con los tipos no son estrictas. Variables de distintos tipos
pueden ser mezcladas en distintas operaciones. En caso contrario decimos
que el lenguaje tiene un tipado fuerte.
Pero muchos lenguajes ofrecen comportamientos mixtos.
No debe confundirse nunca con lenguajes dinámicos o estáticos
24. Primera clasificación...
Tipado estático Tipado dinámico
Tipado fuerte Scala, Haskell, Java, C++, Java, C# Ruby
Tipado débil Objective-C, Visual Basic (variant) JavaScipt
Algunos lenguajes con tipado estático fuerte ofrecen características de
tipado estático débil (C# con conversiones de tipo, C/C++ con punteros
void, ...)
Algunos lenguajes con tipado estático ofrecen características de tipado
dinámico (C# con dynamic, Objective-C con id, Swift con Any, ...).
25. Duck typing
Paradigma típico de algunos lenguajes en el que la presencia de
determinados métodos y propiedades en un objeto determina su
validez semántica, en lugar de la relación de herencia que pueda tener
con otros objetos.
Se resume en la frase: “Si camina como un pato y grazna como un
pato, entonces es un pato”.
Muy común en lenguajes dinámicos
26. Structural typing
Sistema de tipos estático en el que la presencia de determinados
métodos y propiedades en una clase determina su validez semántica.
Dos tipos se consideran “iguales” si tienen las mismas propiedades y
métodos con independencia de donde se declaran.
Viene a ser el “equivalente” al Duck Typing para lenguajes con tipado
estático.
Ejemplo: C++ a través de templates, Ocaml, Scala