Vista aérea de los lenguajes de programación

26
Historia de los lenguajes de programación Eduard Tomàs i Avellana @eiximenis

Transcript of Vista aérea de los lenguajes de programación

Page 1: Vista aérea de los lenguajes de programación

Historia de los lenguajes

de programación

Eduard Tomàs i Avellana

@eiximenis

Page 2: Vista aérea de los lenguajes de programación

Inicios...

Charles Babbage

(1791 – 1871)

Ada Lovelace

(1815 – 1852)

Page 3: Vista aérea de los lenguajes de programación

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

Page 4: Vista aérea de los lenguajes de programación

El primer bug

Se encontró una

arna atrapada en

una válvula del

Mark 2

Page 5: Vista aérea de los lenguajes de programación

Primeros ordenadores

• 1943 Colossus Mark 1,2,3

• 1946 ENIAC• Primer Turing completo

• 1960 Circuito integrado

• 1971 Microprocesador

• 1981 IBM PC

Page 6: Vista aérea de los lenguajes de programación

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)

Page 7: Vista aérea de los lenguajes de programación

Lenguajes “padre”

1. Fortran (1957) Algol, BASIC

2. ALGOL(1958) Pascal, Modula 2, Simula

3. LISP (1958) Clojure, Scheme

4. COBOL (1959)

5. Simula (1962, 67) Smalltalk, C++

6. CPL (1963) C, C++, Java, C#, ObjectiveC

Page 8: Vista aérea de los lenguajes de programación

70’s segunda generación

• Pascal (1970)

• C (1972)

• Prolog (1972)

• ML (1973)

• Scheme (1975)

• SQL (1978)

Page 9: Vista aérea de los lenguajes de programación

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)

Page 10: Vista aérea de los lenguajes de programación

90’s – Auge funcional

• Haskell (1990)

• Python (1991)

• Ruby (1993)

• CLOS (1994)

• Java (1995)

• JavaScript (1995)

• C# (2000)

Page 11: Vista aérea de los lenguajes de programación

Actualidad...

Mezca de paradigmas, metaprogramación,

programación distribuída...

• F# (2002)

• Groovy, Scala (2003)

• Clojure (2007)

• Dart (2011)

• Swift (2014)

Page 12: Vista aérea de los lenguajes de programación

Vista aérea de lenguajes

de desarrollo

Eduard Tomàs i Avellana

@eiximenis

Page 13: Vista aérea de los lenguajes de programación

Una clasificación de lenguajes...

Con / Sin tipos

Estáticos / Dinámicos

Fuerte / Débil

Nominal / DuckTyping / StructuralTyping

TipadoImperativo

Secuencial

Estructurado

Procedural

OOP

Declarativo

Lógico

Funcional

Paradigma

Page 14: Vista aérea de los lenguajes de programación

Según paradigma

Page 15: Vista aérea de los lenguajes de programación

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

Page 16: Vista aérea de los lenguajes de programación

Imperativos estructurados

Basados en los secuenciales añaden secuenciasbásicas de estructura:

Secuencias

Bucles (for, while, loop)

Condicionales (if/switch)

No hay encapsulación de ningún tipo

Ejemplo: Basic

Page 17: Vista aérea de los lenguajes de programación

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

Page 18: Vista aérea de los lenguajes de programación

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, ...)

Page 19: Vista aérea de los lenguajes de programación

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

Page 20: Vista aérea de los lenguajes de programación

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

Page 21: Vista aérea de los lenguajes de programación

Según tipado

Page 22: Vista aérea de los lenguajes de programación

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

Page 23: Vista aérea de los lenguajes de programación

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

Page 24: Vista aérea de los lenguajes de programación

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 punterosvoid, ...)

Algunos lenguajes con tipado estático ofrecen características de tipadodinámico (C# con dynamic, Objective-C con id, Swift con Any, ...).

Page 25: Vista aérea de los lenguajes de programación

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

Page 26: Vista aérea de los lenguajes de programación

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