vista aérea de los lenguajes de programación

Post on 14-Jul-2015

333 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Historia de los lenguajes

de programación

Eduard Tomàs i Avellana

@eiximenis

Inicios...

Charles Babbage

(1791 – 1871)

Ada Lovelace

(1815 – 1852)

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

El primer bug

Se encontró una

arna atrapada en

una válvula del

Mark 2

Primeros ordenadores

• 1943 Colossus Mark 1,2,3

• 1946 ENIAC• Primer Turing completo

• 1960 Circuito integrado

• 1971 Microprocesador

• 1981 IBM PC

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)

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

70’s segunda generación

• Pascal (1970)

• C (1972)

• Prolog (1972)

• ML (1973)

• Scheme (1975)

• SQL (1978)

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)

90’s – Auge funcional

• Haskell (1990)

• Python (1991)

• Ruby (1993)

• CLOS (1994)

• Java (1995)

• JavaScript (1995)

• C# (2000)

Actualidad...

Mezca de paradigmas, metaprogramación,

programación distribuída...

• F# (2002)

• Groovy, Scala (2003)

• Clojure (2007)

• Dart (2011)

• Swift (2014)

Vista aérea de lenguajes

de desarrollo

Eduard Tomàs i Avellana

@eiximenis

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

Según paradigma

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

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

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

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

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

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

Según tipado

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

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

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

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

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

top related