You are on page 1of 93

Tema 1: Introduccin

Lenguajes, Tecnologas y Paradigmas de


Programacin

Indice
1.
2.
3.

4.

Motivacin.
Conceptos esenciales en lenguajes de programacin.
Principales paradigmas de programacin: imperativo,
funcional, lgico, OO, concurrente.
Otros paradigmas. Basado en interaccin,
emergentes.

Objetivos

Conocer la evolucin de los lenguajes de programacin y cules han sido sus


aportaciones ms importantes en cuanto al impacto en el diseo de otros lenguajes.
Entender los principales paradigmas de programacin disponibles hoy en da y sus
principales caractersticas: imperativo, funcional, lgico, OO, concurrente,
paradigmas emergentes.
Comprender los distintos mecanismos de abstraccin (genericidad, herencia y
modularizacin) y paso de parmetros.
Identificar aspectos fundamentales en la implementacin de los lenguajes de
programacin: alcance esttico/dinmico, gestin de memoria.
Entender los criterios que permiten elegir el paradigma/lenguaje de programacin
ms adecuado en funcin de la aplicacin, envergadura y metodologa de
programacin.
Entender las caractersticas de los lenguajes de programacin en relacin al modelo
subyacente (paradigma) y a sus componentes fundamentales (sistemas de tipos y
clases, modelo de ejecucion, abstracciones).
Entender las implicaciones de los recursos expresivos de un lenguaje de
programacin en cuanto a su implementacin y costes de ejecucin.

1. Motivacin
Una historia que empez en 1950

AOS 50:

Tiempo programador barato, mquinas caras ->


keep the machine busy

Cuando no se programaba directamente el hardware, el programa se compilaba a mano para


obtener la mxima eficiencia, para un hardware concreto
conexin directa entre lenguaje y hardware

ACTUALIDAD:

Tiempo programador caro, mquinas baratas ->


keep the programmer busy

El programa se construye para ser eficiente y se compila automticamente


para generar cdigo portable que sea, a la vez, eficiente
conexin directa entre diseo del programa y lenguaje: objetos, concurrencia, etc.

1. Motivacin

Enseanza de los LPs: tres aproximaciones

1. Programacin como un oficio

Se estudia en un paradigma nico y con un nico lenguaje


Es contraproducente:
por ejemplo, aprender a manipular listas en ciertos lenguajes puede llevar a la conclusin
errnea de que el manejo de listas es siempre tan complicado y costoso

EJEMPLO:
ZIP lists en Java

ZIP lists en Haskell

1. Motivacin

Enseanza de los LPs: tres aproximaciones

2. Programacin como una rama de las matemticas


O bien se estudia en un lenguaje ideal, restringido (Dijkstra)
o resulta demasiado terico, alejado de la prctica
EJEMPLO: Verificacin formal (de un programa de 1 lnea!)

1. Motivacin

Enseanza de los LPs: tres aproximaciones

3. Programacin en trminos de conceptos


Estudiar un conjunto de conceptos semnticos y estructuras de implementacin en trminos
de las cuales se describen de forma natural diferentes lenguajes y sus implementaciones

Lenguaje 'kernel'
Abstraccin de Datos
Recursin...
Lenguaje lgico
No determinismo
Variables lgicas
Unificacin

Lenguaje Funcional
Polimorfismo
Estrategias
Orden Superior

Lenguaje OO
Clases
Herencia

Lenguaje imperativo
Estados explcitos
Modularidad
Componentes

Lenguaje 'dataflow'
Concurrencia

Conceptos: tipos y sistemas de tipos


Un tipo representa el conjunto de valores que puede
adoptar una variable o expresin. Los tipos:
Ayudan detectar errores de programacin
Solo los programas que utilizan las expresiones segn el tipo
que tienen aplicando las funciones permitidas son legales

Ayudan a estructurar la informacin


Los tipos pueden verse como colecciones de valores
que comparten ciertas propiedades

Ayudan a manejar estructuras de datos


Los tipos indican cmo utilizar las estructuras de datos que
comparten el mismo tipo mediante ciertas operaciones

Conceptos: tipos y sistemas de tipos


En los lenguajes tipificados, las variables tienen un
tipo asociado (ej. C, C++, C#, Haskell, Java).
El valor asociado a la variable debe tener el tipo
de sta (e.g., C, Haskell), pero a veces puede tener
otros tipos relacionados con el tipo de la variable
(ej. C++, C#, Java) que pueden cambiar en tiempo
de ejecucin
Los lenguajes que no restringen el rango de valores
que pueden adoptar las variables son no
tipificados (ej. Lisp, Prolog)

Conceptos: tipos y sistemas de tipos


En los lenguajes con tipificacin explcita, los tipos
forman parte de la sintaxis
En los lenguajes con tipificacin implcita, los tipos no
forman parte de la sintaxis

Lenguajes
Expresiones
Sistema de
=
+
tipificados
de programa
tipos

Conceptos: tipos y sistemas de tipos

Ejemplo de lenguaje no tipificado:

Prolog
objeto(llave).
objeto(pelota).

La variable X no ha sido declarada. La variable X


no tiene un tipo asociado

cosa(X) <= objeto(X).

Ejemplo de lenguaje con tipificacin implcita:

Haskell
fac 0 = 1
fac x = x * fac (x-1)

La variable x no ha sido declarada. Sin embargo el


sistema infiere automticamente su tipo y determina que
es un nmero

Ejemplo de lenguaje con tipificacin explcita:

Java
int x;
x = 42;

Todas las variables deben ser declaradas, y en la


declaracin se debe especificar su tipo explcitamente.
10

Conceptos: tipos y sistemas de tipos


Los tipos se describen mediante un lenguaje
de expresiones de tipo:
Tipos bsicos o primitivos: Bool, Char, Int, ...
Variables de tipo: a, b, c, ...
Constructores de tipo: (funcin), (par), [ ]
(lista), ...
Reglas de construccin de las expresiones:
::= Bool | Char | Int | | t | | | [ ] |

Conceptos: tipos y sistemas de tipos


Los tipos en cuya expresin de tipo no aparecen
variables de tipo se denominan monotipos o tipos
monomrficos
Los tipos en cuya expresin de tipo aparecen
variables se denominan politipos o tipos
polimrficos (polimorfismo paramtrico)
Un tipo polimrfico representa un nmero infinito de
monotipos

12

Conceptos: tipos y sistemas de tipos

Tipos predefinidos, funcionales y parametrizados


Tipos bsicos: Bool, Int,
w Bool, es el tipo de los valores booleanos

Tipos
monomrficos

True y False
w Int -> Int, es el tipo de la funcin fact, que
devuelve el factorial de un nmero

Tipos
w [ a ] -> Int,
polimrficos
que calcula

es el tipo de la funcin length,


la longitud de una lista
Constructores de tipo

Variable
de tipo

-> es el constructor del tipo funcional


[_] es el constructor del tipo lista
13

Conceptos: polimorfismo

POLIMORFISMO
Es

una caracterstica de los lenguajes que permite


manejar valores de distintos tipos usando una interfaz
uniforme.
Se aplica tanto a funciones como a tipos:
n Una

funcin puede ser polimrfica con respecto a uno o


varios de sus argumentos. Ejemplo: la + puede aplicarse a
valores de diferentes tipos, como enteros, reales,
n Un tipo de datos puede ser polimrfico con respecto a los
tipos de los elementos que contiene. Ejemplo: una lista con
elementos de tipo arbitrario.
14

Conceptos: polimorfismo

Tipos de Polimorfismo

Ad-Hoc

o aparente: trabaja sobre un nmero finito de tipos


no relacionados
Sobrecarga (overloading)
n Coercion
n

Universal

o verdadero: trabaja sobre un nmero


potencialmente infinito de tipos con cierta estructura comn.
Polimorfismo de inclusin (herencia)
n Polimorfismo paramtrico (genericidad)
n

15

Conceptos: polimorfismo ad-hoc


Ad-hoc

Ejemplo: los operadores aritmticos (+), (-), (*), (/), ..., suelen estar
sobrecargados:
(+) :: Int -> Int -> Int
(+) :: Float -> Float -> Float
(+) :: Complex -> Complex -> Complex
corresponden a distintos usos de (+). Otro:
(+) :: Int -> Float -> Float
El operador (+) no puede recibir el politipo
(+) :: a -> a -> a
porque implicara dotar de significado (e implementacin) a la suma de
caracteres, funciones, listas, etc., lo cual puede interesarnos o no
16

Conceptos: polimorfismo ad-hoc

Ad-hoc
n Sobrecarga:

existencia de distintas funciones con el mismo

nombre.
Ejemplo: el operador + denota funciones distintas, con
implementaciones diferentes, segn se aplique a enteros, reales
n En

Java la sobrecarga explcita de mtodos se realiza


cambiando el tipo de los parmetros:
/* overloaded methods */ !
int myAdd(int x, int y, int z){ !
... !
} !
double myAdd(double x, double y, double z){ !
... !
} !
17

Conceptos: polimorfismo ad-hoc

Ad-hoc
public class Overload {
public void numbers(int x, int y){
System.out.println(Method that gets integer numbers");
}
public void numbers (double x, double y, double z){
System.out.println("Method that gets real numbers");
}
public int numbers (String st){
System.out.println(The length of" + st+ " is" + st.length() + " characters");#
return st.length();#
}
#
public static void main (String... args){
Overload s = new Overload();
int a = 1;
int b = 2;
s.numbers(a,b);#
s.numbers(3.2,5.7,0.0);#
a = s.numbers(Madagascar");
}
}#

18

Conceptos: polimorfismo ad-hoc

Ad-hoc
n Coercin:

conversin (implcita o explcita) de argumentos


de un tipo en otro.
nCuando

es implcita suele hacerse usando una jerarqua de


tipos o de su representacin.
Ejemplo: en la mayora de lenguajes para los argumentos de
los operadores aritmticos existe coercin entre valores enteros
y reales.
nAlgunos

lenguajes permiten forzar una coercin explcita:


n Lenguajes de la familia de C: sentencia cast
n En Java es posible transformar:
- Una variable primitiva de un tipo bsico en otro
19
- Un objeto de una clase a una superclase

Conceptos: polimorfismo ad-hoc

Ad-hoc

Ejemplo: conversin implcita en Java

int num1 = 100 // 4 bytes


long num2 = num1 // 8 bytes

Ejemplo: conversin explcita en Java

int num1 = 100 // 4 bytes


short num2 = (short) num1 // 2 bytes
char c = (char) num1 // 2 bytes
String s = Integer.toString(num1)

20

Conceptos: polimorfismo universal

Universal
n Genericidad:

la definicin de una funcin o la declaracin de una


clase presenta una estructura que es comn a un nmero
potencialmente infinito de tipos.
Ejemplo (Haskell): Definimos una estructura de datos para
representar y manipular las entradas de un diccionario
nUn

tipo genrico (renombramiento del tipo predefinido tupla)

nUna

funcin genrica

Otro ejemplo:

a puede ser
de cualquier
tipo

length :: [a] -> Integer


length [] = 0
length (x:xs) = 1 + length xs
21

Conceptos: polimorfismo universal


GENERICIDAD EN JAVA
Una clase genrica es una clase convencional, salvo que dentro
de su declaracin utiliza una variable de tipo (parmetro), que
ser definido cuando sea utilizada.
public class Container<T> {
private T content;
public void setContent (T content){
this.content=content;
}
public T getContent() {
return content;
}
}

22

Conceptos: polimorfismo universal


GENERICIDAD EN JAVA
La parametrizacin de una clase genrica se realiza en la
declaracin de una variable y en la construccin.
La variable de tipo debe ser un objeto (no se aceptan tipos bsicos como int, bool, etc.)

Container<String> container =
new Container<String>();
container.setContent(hello);

23

Conceptos: polimorfismo universal


GENERICIDAD EN JAVA
Dentro de una clase genrica se pueden utilizar otras clases
genricas.
Una clase genrica puede tener varios parmetros.
public class DoubleContainer<T,K> {
private String name;
private Container<T> key;
private K value; }
DoubleContainer<String, Integer> container =
24

Conceptos: polimorfismo universal


GENERICIDAD EN JAVA
Al igual que se definen clases genricas, es posible definir
mtodos genricos (incluso en clases no genricas o
parametrizadas con una variable de tipo diferente)
public class GenericMethodTest!
{
!
// generic method printArray
!
public static < E > void printArray( E[] inputArray )!
{ !
// Display array elements
!
for ( E element : inputArray ){
!
System.out.printf( "%s ", element );!
}!
System.out.println();!
}!
25

Conceptos: polimorfismo universal


public static void main(String args[]) {!
// create arrays of Integer, Double and Character!
Integer[] integerArray = { 1, 2, 3, 4, 5, 6 };!
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };!
Character[] characterArray = { 'H', 'E', 'L', 'L', 'O' };!
!
System.out.println("Array integerArray contains:");!
printArray(integerArray); // pass an Integer array!
System.out.println("\nArray doubleArray contains:");!
printArray(doubleArray); // pass a Double array!
System.out.println("\nArray characterArray contains:");!
printArray(characterArray); // pass a Character array!
} // end main!
Array integerArray contains:!
1 2 3 4 5 6 !
!
Array doubleArray contains:!
1.1 2.2 3.3 4.4 5.5 6.6 7.7 !
!
Array characterArray contains:!
H E L L O!

26

Conceptos: polimorfismo universal


Ejemplo (diccionario):
nUna

nUn

clase genrica

mtodo genrico
public static <T> Entry<T,T> twice(T value) {!
!
return new Entry<T,T> (value, value);!
}

27

Conceptos: polimorfismo universal

Universal
n Herencia:

la definicin de una funcin trabaja sobre tipos


que estn relacionados siguiendo una jerarqua de inclusin.

n En

la orientacin a objetos la herencia es el mecanismo ms


utilizado para permitir la reutilizacin y extensibilidad.

n Pero

tambin puede tener desventajas:

el comportamiento de un objeto de la clase hija puede ser


inconsistente con lo esperado de un objeto de la clase padre
n un cambio en la clase padre puede tener efectos imprevistos en
las clases hijas
n un cambio en el criterio con el que se ha construido la jerarqua
puede acarrear muchas modificaciones.
n

28

Conceptos: polimorfismo universal


HERENCIA EN JAVA
La herencia organiza las clases en una
estructura jerrquica formando jerarquas
de clases.
La base de cualquier jerarqua es la clase
Object. En la imagen se ve parte de la
jerarqua para el diseo de interfaces
grficas (los objetos de tipo JFrame son visualizados
por pantalla y pueden contener componentes grficas
distribuidas en contenedores).

Si una clase se declara como final, no se


puede heredar de ella

java.lang.Object
|
+-java.awt.Component
|
+-java.awt.Container
|
+-java.awt.Window
|
+-java.awt.Frame
|
+-javax.swing.JFrame
29

Conceptos: polimorfismo universal


HERENCIA EN JAVA

Si una clase B hereda de otra clase A entonces:

incorpora la estructura (atributos) y comportamiento


(mtodos) de la clase A
B puede:
n aadir

nuevos atributos
n aadir nuevos mtodos
n redefinir mtodos

Java solo tiene herencia simple (slo se puede


heredar de una nica clase).

30

Conceptos: polimorfismo universal


HERENCIA EN JAVA
public class Bicycle {
protected int cadence;
instance
protected int gear;
fields
protected int speed;
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
constructor
speed = startSpeed;
}
public void setCadence(int newValue) { cadence = newValue; }
public void setGear(int newValue) { gear = newValue; }
methods
public void applyBrake(int decrement) { speed -= decrement; }
public void speedUp(int increment) { speed += increment; }
}

31

Conceptos: polimorfismo universal


HERENCIA EN JAVA
En Java para definir qu variables de instancia y mtodos de los objetos
de una clase son visibles se usa:
Private: ningn miembro o atributo privado de la superclase es visible en
la subclase. Si se usa para los atributos de la clase padre hay que
proporcionar mtodos de acceso a los mismos.
Ejemplo:

public class NobodyCanSeeAtt{


private float x;
public float getX() { return x;} .}

Protected: los miembros protegidos de la superclase son visibles en la


subclase, pero no visibles para el exterior. Se suele usar para los atributos
de la clase padre.

Public: los miembros pblicos de la superclase siguen siendo pblicos en


la subclase.
32

Conceptos: polimorfismo universal


HERENCIA EN JAVA

Las subclases se definen usando extends.

public class MountainBike extends Bicycle {}

Se pueden aadir atributos y/o mtodos y redefinir


mtodos (pero no atributos).

public class MountainBike extends Bicycle {


public int seatHeight;
public MountainBike(int startHeight, int startCadence, int startSpeed,
int startGear) {
super(startCadence, startSpeed, startGear); Es el constructor de
seatHeight = startHeight;
la clase padre
}
33

Conceptos: polimorfismo universal


HERENCIA EN JAVA
A una variable de la superclase se le puede asignar una referencia a
cualquier subclase derivada de dicha superclase, pero no al contrario.
Bicycle b;
MountainBike m = new MountainBike (75, 90, 25, 8);
b=m;
****************************************************
Bicycle b = new Bicycle (90, 25, 8);
MountainBike m = b;
compilation error.
34

Conceptos: polimorfismo universal


Ejemplo de redefinicin de mtodos
class Employee {
String name;
int noEmployee , salary;
static private int counter= 0;
Empleado(String name, int salary) {
this.name=name;
this.salary=salary;
noEmployee =++counter;
}
public void increaseSalary (int wageRaise){
salary+= (int) (salary* wageRaise/ 100);
}
public String toString() {
return Num. Employee + noEmployee + Name: + name+
Salary: + salary;
} }

35

Conceptos: polimorfismo universal


class Executive extends Employee {
int budget;
void assignBudget (int b) {
budget=b;
}
public String toString() {
String s = super.toString();
s = s + Budget: + budget;
return s; }
}
Executive boss = new Executive (Thomas Turner, 1000);
boss.assignBudget(1500);
boss.increaseSalary(5);

Cuando se invoque boss.toString() se usar el mtodo toString de


la clase Executive, y mediante super.toString() se invoca el
mtodo toString de la clase Employee.
36

Conceptos: polimorfismo universal

Sobreescribiendo y ocultando mtodos


(Overriding/hiding)
Un

mtodo instancia en una subclase con la misma signatura


(nombre, nmero y tipo de sus parmetros) y que devuelve
el mismo tipo que el mtodo instancia de la superclase
sobreescribe el mtodo de la superclase.

Si

una subclase define un mtodo clase (static) con la misma


signatura que un mtodo clase de la superclase, el mtodo
en la subclase oculta el de la superclase.

37

Conceptos: polimorfismo universal


Ejemplo de sobreescritura y ocultacin
public class Animal {
public static void testClassMethod() {
System.out.println("The class" + " method in Animal.");
}
public void testInstanceMethod() {
System.out.println("The instance " + " method in Animal.");
}
}
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}

La salida de este programa es


The class method in Animal.
The instance method in Cat.

public static void main(String[] args) {


Cat myCat = new Cat();
Animal myAnimal = myCat;
Animal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
38

Conceptos: polimorfismo universal


Clase Abstracta (public abstract class .)
Una clase abstracta es la que no implementa alguno de sus
mtodos. Los mtodos para los que no aporte una
implementacin sern declarados a su vez abstract.
Una clase abstracta no puede instanciarse.
Si una clase tiene un mtodo abstract es obligatorio que la
clase sea abstract.
Todas las subclases que hereden de una clase abstracta
tendrn que redefinir los mtodos abstractos dndoles una
implementacin excepto que la clase se declare abstracta.

39

Conceptos: polimorfismo universal


public abstract class Shape {
private float x, y; // Position of the shape
public Shape(float initX, float initY) { // Constructor
x=initX; y = initY;
}
public void move(float incX, float incY) { // Method
x = x+incX; y = y+incY;
}
public float getX() { return x; }
public float getY() { return y; }
public abstract float perimeter(); // Abstract method
public abstract float area(); // Abstract method

}
40

Conceptos: polimorfismo universal


public class Square extends Shape {
private float side;
public Square(float initX, float initY, float initSide) {
super(initX, initY); // Call to super constructor method
side = initSide;
}
public float perimeter() { return 4*side; }
public float area() { return side*side; }
}

public class Circle extends Shape {


private float radius;
public Circle(float initX, float initY, float initRadius) {
super(initX, initY); // Call to super constructor method
radius = initRadius;
}
public float perimeter() { return 2*pi*radius; }
public float area() { return pi*radius*radius; }
}
41

Y si quisiramos extender esta clase con otra forma como el tringulo, qu hay que hacer?#

Conceptos: polimorfismo universal


INTERFACES

Una interfaz es parecida a una clase abstracta pura


donde todos los mtodos son abstractos y pblicos (sin
necesidad de declararlos como tal) y sus atributos son
estticos y finales (constantes)
Una interfaz no implementa ninguno de los mtodos
que declara.

public interface NameOfClass{!


public type nameMethod1(list of parameters);!
...!
public type nameMethodN(list of parameters);}!
42

Conceptos: polimorfismo universal


INTERFACES

En Java, una clase puede implementar varias interfaces


usando la palabra reservada implements.
Sirve para simular cierta forma de herencia mltiple

Una

interfaz puede heredar de una o varias interfaces (con la


palabra reservada extends)
Una clase (abstracta o no) puede implementar una o ms
interfaces pero slo heredar de una clase.
Una interfaz NO puede heredar de una clase

Los tipos abstractos de datos se definen en Java como


interfaces.

43

Conceptos: polimorfismo universal


EJEMPLO (Tipo abstracto de datos conjunto)
!
public interface Conjunto<E>{!
public int size(); //nmero de elementos en el conjunto!
public boolean contains(E e); //pertenece e al conjunto?!
!
public void add(E e); //aade e al conjunto!
public void remove(E e); //elimina e del conjunto!
}!
!
public class ConjuntoEnt implements Conjunto<Integer> {!
!... //implementamos el mtodo constructor y, al !
!
}!
!

//menos, los cuatro mtodos de la interfaz!


44

Conceptos: reflexin
REFLEXIN
Qu es la reflexin?
Cuando te miras en un espejo, puedes

ver tu reflejo y
reaccionar ante lo que ves (por ejemplo, anudarte la corbata o arreglarte
el pelo)

Anlogamente, en los lenguajes de programacin, la reflexin es la


infraestructura que permite a un programa:

ver su propia estructura y

manipularse a l mismo
45

Conceptos: reflexin

En otras palabras, la reflexin permite que un programa en


ejecucin observe (instrospectivamente) y modifique su propia
estructura y comportamiento de forma dinmica, durante su propia
ejecucin.
En un lenguaje con reflexin se puede por ejemplo construir
programas capaces de monitorizar su propia ejecucin y
modificarse, en tiempo de ejecucin, para adaptarse
dinmicamente a distintas situaciones.
La reflexin se introdujo en el lenguaje LISP y est presente en
algunos lenguajes de script. No hay forma de hacer algo similar en
Pascal, Fortran, C o C++.
46

Conceptos: reflexin
La reflexin resulta muy til en tareas de metaprogramacin (o
construccin de programas que escriben o manipulan otros
programas -o a ellos mismos- como datos).
Ejemplo (metaprograma)
#!/bin/bash
# metaprogram
echo '#!/bin/bash' >program
for ((I=1; I<=999 I++)) do
echo "echo $I" >>program
done
chmod +x program

47

Conceptos: reflexin

En general los lenguajes con reflexin se caracterizan porque las


propias instrucciones del lenguaje son tratadas como valores de un
tipo de datos especfico, que es un tipo de primera clase dentro del
lenguaje (cuando en lenguajes sin reflexin se veran como simples
cadenas de texto).
Se llama metalenguaje al lenguaje que permite escribir
metaprogramas
-> La reflexin puede verse como la capacidad de un lenguaje para
ser su propio metalenguaje.
Muy til para escribir compiladores, analizadores de programas,
ofuscadores de cdigo, manipular y optimizar bytecode, etc.
48

Conceptos: reflexin

La reflexin se puede utilizar en Java a travs de una


biblioteca especfica (java.lang.reflect).
La reflexin en Java permite inspeccionar clases, interfaces,
atributos y mtodos en tiempo de ejecucin sin conocer los
nombres de las interfaces, atributos y mtodos en tiempo de
compilacin.
Haciendo uso de ella, es posible:

obtener y mostrar, durante la ejecucin del programa, el nombre de


todas las instancias de la clase que se han creado en ejecucin
leer de teclado un string y usarlo para

crear un objeto dndole como nombre el string leido o

invocar a un mtodo con ese nombre


49

Conceptos: reflexin
Ejemplo:
import java.lang.reflect.*;

class Class {

public class DumpMethods {

Constructor[] getConstructors();

public static void main(String args[])

Field[]

getDeclaredFields();

Method[]

getDeclaredMethods();

try {

Class c = Class.forName(args[0]);

Method m[] = c.getDeclaredMethods();


for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
}catch(Exception e){}
}
}
50

Conceptos: reflexin

51

Conceptos: reflexin

Algunos peligros:
Mal usada puede afectar al rendimiento, a la seguridad y
exponer detalles comprometidos del cdigo en ciertos
contextos.
Es una caracterstica avanzada pero no complicada,
especialmente en lenguajes funcionales, gracias a la dualidad
natural entre datos/programas existente en estos lenguajes,
conocida como homoiconicidad.

52

CUESTIONES
1.

Dadas las siguientes clases:

class Shape { /* ... */ }


class Circle extends Shape { /* ... */ }
class Rectangle extends Shape { /* ... */ }
class Node<T> { /* ... */ }

Compila sin error el siguiente fragmento de cdigo? Si no, indica el porqu.


Node<Circle> nc = new Node<Circle>();
Node<Shape> ns = nc;
53

1. Motivacin

CUESTIONES
2.

Qu est mal en la siguiente interfaz?

public interface SomethingIsWrong {


void aMethod(int aValue){
System.out.println("Hi Mom");
}
}
3.

La siguiente interfaz, es vlida?

public interface Marker {


}
54

1. Motivacin

CUESTIONES
4.

Considera las siguientes clases:

public class ClassA {


public void methodOne(int i) {
}
public void methodTwo(int i) {
}
public static void methodThree(int i) {
}
public static void methodFour(int i) {
}
}
public class ClassB extends ClassA {
public static void methodOne(int i) {
}
public void methodTwo(int i) {
}
public void methodThree(int i) {
}
public static void methodFour(int i) {
}
}

a. Qu mtodo sobreescribe un mtodo en la superclase?


b. Qu mtodo oculta un mtodo en la superclase?
c. Qu hacen los otros mtodos?
55

Cules son los factores del xito de un LP?

Potencia expresiva: para generar cdigo claro, conciso


y fcil de mantener.
Fcil de aprender (el core).
Portable y con garantas para la seguridad.
Soportado por mltiples plataformas y herramientas de
desarrollo.
Respaldo econmico.
Fcil migracin de aplicaciones escritas en otros
lenguajes (C++ Java).
Mltiples libreras para gran variedad de aplicaciones.
Disponibilidad de descarga de cdigo abierto escrito
en el lenguaje.
56

3. Paradigmas de programacin

Definicin de paradigma de programacin


modelo bsico de diseo y desarrollo de programas, que proporciona un
conjunto de mtodos y tcnicas para producir programas con unas directrices
especficas (estilo y forma de plantear la solucin a un problema)

Principales Paradigmas
Imperativo
Declarativo

Funcional
n Lgico
n

Orientado

a objetos
Concurrente
Emergentes

57

3. Paradigmas de programacin

Paradigma Imperativo
Describe la programacin como una secuencia de instrucciones o
comandos que cambian el estado de un programa.
el cmo proceder Algoritmo
El concepto bsico es el estado de la mquina, el cual se define
por los valores de las variables involucradas y que se almacenan en
la memoria.
Las instrucciones suelen ser secuenciales y el programa consiste en
construir la secuencia de estados de la mquina que conduce a la
solucin.
Este modelo est muy vinculado a la arquitectura de la mquina
convencional (Von Neumann).
Programa estructurado en bloques y mdulos.
Eficiente, difcil de modificar y verificar, con efectos laterales.
Establece

58

3. Paradigmas de programacin

Paradigma Imperativo

Ejemplo length en Pascal

59

Paradigma Imperativo
(caractersticas)

3. Paradigmas de programacin

EFECTOS LATERALES (dos llamadas a una funcin con el mismo


argumento da resultados diferentes)
program proof;
variable
var
global
flag: boolean;
function f (x: integer): integer;
begin
f cambia el valor de la
flag:= not flag;
variable global
if flag then f:=x
else f:=x+1;
end;
begin
flag:=false;
write(f(1));
write(f(1));
end.

60

3. Paradigmas de programacin

Paradigma Imperativo
(caractersticas)

EFECTOS LATERALES (dos llamadas a una funcin con el mismo


argumento da resultados diferentes)
program proof;
variable
var
global
flag: boolean;
function f (x: integer): integer;
begin
f cambia el valor de la
flag:= not flag;
variable global
if flag then f:=x
else f:=x+1;
end;
begin
flag=false
flag:=false;
write(f(1));
flag=true
write(f(1));
end.

Ejemplo de ejecucin:
> proof

1
2
61

3. Paradigmas de programacin

Paradigma declarativo
Describe las propiedades de la solucin buscada, dejando
indeterminado el algoritmo (conjunto de instrucciones) usado para
encontrar esa solucin.
Responde

a la idea propuesta por Kowalski:


PROGRAMA = LGICA + CONTROL
n LGICA: se relaciona con el establecimiento del QU
n CONTROL: se relaciona con el establecimiento del CMO
El programador se centra en aspectos lgicos de la solucin y deja
los aspectos de control al sistema
Fcil de verificar y modificar, conciso y claro

62

3. Paradigmas de programacin

Paradigma declarativo
Un programa declarativo puede entenderse como una
ESPECIFICACIN EJECUTABLE
Lenguaje declarativo = Lenguaje de ESPECIFICACIN (ejecutable)
= Lenguaje de PROGRAMACIN (alto nivel)
ESPECIFICACIN

P
R
O
G
R
A
M
A
C
I

D
E
C
L
A
R
A
T
I
V
A

PROGRAMACIN

63

3. Paradigmas de programacin

Paradigma declarativo
Ejemplo: Los nmeros de Fibonacci
Especificacin
(definicin de la funcin matemtica):
fib(0)=1
fib(1)=1
fib(n)=fib(n-1) + fib(n-2)

64

3. Paradigmas de programacin

Paradigma declarativo
Ejemplo: Los nmeros de Fibonacci
Especificacin
(definicin de la funcin matemtica):
fib(0)=1
fib(1)=1
fib(n)=fib(n-1) + fib(n-2)

Programa:!
(una versin eficiente de la especificacin
!(directamente la especificacin)
usando un parmetro acumulador)

! !
!
!!
fib(0)=1!
!
fib(1)=1!
!fib(n)=fib(n-1) + fib(n-2) !

fib(0)=1!
fib(1)=1!
fib(n)=fib_aux(1,1,n)!
fib_aux(x,y,0)=x!
fib_aux(x,y,n)= fib_aux(y,x+y,n-1)!
65

3. Paradigmas de programacin

Paradigma declarativo

Paradigma Funcional (basado en el -clculo)


n
n
n

definicin de estructuras de datos y funciones que manipulan las


estructuras mediante ecuaciones (s=t)
polimorfismo
orden-superior

Paradigma Lgico (basado en la lgica de primer orden)


n

definicin de relaciones mediante reglas:


Si C1 y C2 yCn entonces A: (A C1,... ,Cn)
adecuadas para la representacin del conocimiento
mujer(eva).
mujer(marisa).
madre(valentina, eva).

mujer(laura).
madre(valentina, laura).

hermanas(X,Y) mujer(X), mujer(Y), madre(Z,X), madre(Z,Y).

n
n

variables lgicas
indeterminismo
66

3. Paradigmas de programacin

Paradigma declarativo

Ejemplo: funcin length


Haskell

Prolog

67

3. Paradigmas de programacin

P. Declarativa vs P. Imperativa

Programacin Imperativa

PROGRAMA
INSTRUCCIONES
MODELO DE COMPUTACIN
VARIABLES

Transcripcin de un algoritmo
rdenes a la mquina
Mquina de estados
Referencias a memoria

68

3. Paradigmas de programacin

P. Declarativa vs P. Imperativa

Caratersticas de la Programacin Imperativa

Pone el nfasis en cmo resolver un problema.


Las sentencias de los programas se ejecutan en el mismo orden en que estn escritas y
dicho orden de ejecucin es crucial.
Asignacin destructiva (el valor asignado a una variable destruye el valor anterior de
dicha variable) Efectos laterales que oscurecen el cdigo.
El control es responsabilidad del programador.
Ms compleja de lo que parece (as lo demuestra la complejidad de sus definiciones
semnticas o la dificultad de las tcnicas asociadas, e.g., de las tcnicas de verificacin
formal de programas).
Difcil de paralelizar.
Los programadores estn mejor dispuestos a sacrificar las caractersticas avanzadas y
ventajas asociadas a lenguajes de ms alto nivel a cambio de poder obtener mayor
velocidad de ejecucin.
69

3. Paradigmas de programacin

P. Declarativa vs P. Imperativa
Programacin Declarativa =
LGICA
como lenguaje de programacin
PROGRAMA
INSTRUCCIONES
MODELO DE COMPUTACIN
VARIABLES

Especificacin de un problema
Frmulas lgicas
Mquina de inferencias
Variables lgicas
70

Qu hace este programa?

71

Sort en Haskell

Sin asignacin de variables


Sin ndices de vector
Sin gestin de memoria (!)
72

3. Paradigmas de programacin

P. Declarativa vs P. Imperativa

Caractersticas del Paradigma Declarativo

Expresa qu es la solucin a un problema.


El orden de las sentencias y expresiones no afecta a la semntica del
programa.
Una expresin denota un valor independiente del contexto Transparencia
referencial.
Nivel ms alto de programacin:
n semntica ms sencilla
n control automtico
n ms fcil de paralelizar
n mayor potencia expresiva
n menor tamao del cdigo
n mayor productividad
n mejor mantenimiento
Eficiencia comparable a la de lenguajes como Java.
La curva de aprendizaje es ms lenta cuando se aprendi a programar en otro
paradigma de programacin ms convencional.
Las impurezas de sistemas reales son difciles de modelar de manera
73
declarativa (por ejemplo, la I/O).

3. Paradigmas de programacin

Paradigma Orientado a Objetos


Basado en la idea de encapsular estado y operaciones en
objetos.
Objeto:

estado + operaciones
Concepto de clase, instancia, subclases y herencia
Elementos fundamentales: abstraccin, encapsulamiento,
modularidad y jerarqua

74

3. Paradigmas de programacin

Paradigma Orientado a Objetos


Ejemplo: length en Java (OO)
public interface ListaConPI<T> {
void inicio();

/*Lista con Punto de Inters*/

// Sita el PI sobre el primer elemento

void siguiente(); // Si !esFin(), mueve el PI al siguiente elemento


boolean esFin(); // Comprueba si el PI est al final de la lista
}
public abstract classmyListConPI<T> implements ListaConPI<T> {
publicint myLength(){
intlong=0;
for(inicio(); |esFin(); siguiente()) long++;
return long;
}
75

3. Paradigmas de programacin

Programacin Concurrente y Paralela

Los lenguajes de programacin concurrentes se utilizan para programar la


ejecucin simultnea de mltiples tareas interactivas.
Dichas tareas pueden consistir en un conjunto de procesos creados por un
nico programa (ejemplos: acceso concurrente en bases de datos, uso de
recursos de un sistema operativo, etc.)
El inicio de la Programacin Concurrente est en la invencin de la
interrupcin a finales de los 50. Se trata de un mecanismo hardware que
interrumple el programa en ejecucin y hace que la unidad de proceso
bifurque el control a una direccin dada, donde reside otro programa que
tratar el evento asociado a la interrupcin.
76

3. Paradigmas de programacin

Programacin Concurrente
La concurrencia introdujo numerosos problemas:

Corrupcin de los datos compartidos (por ejemplo cuando dos programas escriben
concurrentemente en una misma impresora puede producirse una mezcla incomprensible)

Interbloqueos (supongamos por ejemplo un proceso A que necesita dos recursos compartidos,
R1 y R2 y, para evitar el problema anterior, trata de capturarlos en exclusiva solicitando
primero R1 y luego R2. Mientras tanto, otro proceso B, con las mismas necesidades, hace la
solicitud inversa.
El resultado es que cada proceso obtiene un recurso quedando bloqueado en espera del
recurso asignado al otro).

Inanicin: El SO organiza una cola de procesos cuando quieren acceder a un recurso comn,
concediendo los permisos por orden de prioridad. Si varios procesos prioritarios se alternan
en el uso de un recurso, un proceso menos prioritario podra no obtener acceso nunca.

Indeterminismo: El orden e instantes concretos en que ocurren las interrupciones pueden variar
de una ejecucin a otra, por lo que errores que no suceden en una ejecucin podran ocurrir
77
en otra, lo cul dificulta la depuracin.

3. Paradigmas de programacin

Programacin Concurrente

La manera primitiva de definir un lenguaje concurrente consisti en aadir a un


lenguaje secuencial (Simula) primitivas suministradas por el sistema operativo para la
creacin de procesos (corutinas) problema: bajo nivel y falta de portabilidad.
Entre 1965-71 Dijkstra introdujo las primeras abstracciones, definiendo un programa
concurrente como un conjunto de procesos secuenciales asncronos que no deban hacer
suposiciones sobre las velocidades relativas con las que progresan otros procesos,
introduciendo mecanismos de sincronizacin explcitos los semforos (variable entera
compartida que tiene asociada una cola de procesos).
Hoare complet el mecanismo de semforos con la nocin de regin crtica para evitar
interbloqueos, pero su gestin era ineficiente y poco modular.
En 1974 se introdujo una nueva construccin para encapsular los recursos compartidos
-el monitor, inspirado en los TADs de la programacin secuencial. El primer lenguaje
concurrente de alto nivel con monitores fue Pascal concurrente (1975), despus
incorporado a Modula-2.
78

3. Paradigmas de programacin

Programacin Paralela

El objetivo de la Programacin Paralela es la aceleracin de algoritmos que consumen


muchas horas de proceso dividiendo el tiempo de ejecucin por un factor lo mayor posible,
utilizando para ello varios procesadores. El nfasis se desplaza a aspectos no
contemplados en la PC, como la distribucin de los datos y el reparto de la carga.
Con la aparicin de los primeros microprocesadores en 1975, los procesos pasaron a
ejecutarse concurrentemente en distintos procesadores, lo cul invalidaba el principio
implcito en monitores y semforos- de la existencia de una memoria comn donde residen
las variables compartidas. As surgieron nuevas construcciones que pudieran implementarse
mediante el paso de mensajes entre procesadores: rendez-vous.
Los primeros lenguajes paralelos fueron lenguajes secuenciales (Fortran, C), extendidos con
libreras de paso de mensajes proporcionadas por el fabricante, aunque pronto surgieron
nuevos modelos, independientes de la arquitectura, que permitieron abordar el estudio de
la correccin de los sistemas concurrentes (CSP, CCS, pi-clculo, redes de Petri, PVM) y
nuevas construcciones concurrentes ligadas a dichos modelos, en distintos lenguajes.
Por ejemplo, CSP influy en los canales de Occam y las llamadas remotas de Ada.
79

3. Paradigmas de programacin

Concurrencia en Java

Java soporta de forma nativa la programacin concurrente gracias a la clase Thread,


que permite ejecutar cdigo en un hilo de ejecucin independiente. Existen funciones
propias para crear (y arrancar, suspender, reanudar, abortar, priorizar, sincronizar,
etc) los hilos, encargndose la JVM de organizarlos pero siendo responsabilidad del
programador evitar situaciones indeseadas (interbloqueo, inanicin, etc).
La comunicacin concurrente se realiza mediante memoria compartida: los
componentes concurrentes (hilos) se comunican alterando el contenido de posiciones de
memoria compartidas, lo cul requiere usar algn mecanismo de bloqueo para la
coordinacin de los hilos. De hecho, cada objeto lleva implcitamente un bloqueo si
est siendo utilizado por un hilo.
Informalmente, un hilo es muy similar a un proceso con la diferencia de que los hilos
dependen siempre de un programa padre en lo que se refiere a recursos de
ejecucin, mientras los procesos pueden mantener su propio espacio de direcciones y
entorno de ejecucin.
80

3. Paradigmas de programacin

Crear un Hilo en Java

Basta 1) implementar la interfaz Runnable (o heredar de la clase Thread)


y 2) definir el mtodo run().

Class MiHilo extends Thread


// Class MiHilo implements Runnable
{
public void run()
{
// Cdigo de la tarea
}
};
q

Despus se instancia esta clase y se llama al mtodo start() para que


arranque el hilo. ...

MiHilo elHilo = new MiHilo();


elHilo.setPriority();
elHilo.start();
System.out.println("Yo sigo a lo mio");

81

A qu paradigma pertenecen los


lenguajes actuales?
La mayora son multi-paradigma:
CoffeeScript

(2009): lenguaje de programacin que se


compila a JavaScript (OO-basado en prototipos,
funcional, imperativo)
Scala (2003): orientado a objetos, imperativo y
funcional (usado junto con Ruby por Twitter)
Erlang (1986): funcional y concurrente (HP, Amazon,
Ericsson, Facebook,). Enlace al ErlangCamp de 2012
http://www.erlangcamp.com/.
Python: PF (listas intensionales, abstraccin lambda,
fold, map) + POO (herencia mltiple, mixings)
82

4. Otros Paradigmas de Programacin


Paradigmas
n
n

basados en Interaccin

Introduccin a la interaccin
Programacin por eventos

Emergentes

83

4. Otros paradigmas de programacin: basado en interaccin

Paradigma basado en Interaccin.

En programacin tradicional, un
programa describe la secuencia de
pasos necesarios para producir la
salida a partir de las entradas,
siguiendo un flujo de control que
est prefijado por el propio cdigo
(programacin como clculo en el
estilo Von Neumann).
Sin embargo, este modelo no se
adapta a las necesidades de
algunas reas: HCI, robtica,
agentes software, IA, aplicaciones
orientadas a servicios,
En estas reas los programas se ajustan mejor a un modelo de
computacin como interaccin, en el que las entradas se
monitorizan y las salidas son acciones que se llevan a cabo
dinmicamente mientras se ejecuta el proceso.

4. Otros paradigmas de programacin: basado en interaccin

Introduccin

Un programa interactivo es una comunidad de entidades (agentes,


bases de datos, servicios de red, etc) que interactan siguiendo ciertas
reglas de interaccin.
Las reglas de interaccin pueden estar restringidas por interfaces,
protocolos y ciertas garantas de servicio -restricciones temporales de
respuesta, confidencialidad de los datos, etcEl modelo de programacin interactiva tiene distintas
materializaciones populares como
programacin conducida por eventos
n sistemas reactivos, sistemas empotrados
n arquitecturas cliente/servidor
n software basado en agentes
n

Este modelo est en la base de las aplicaciones distribuidas, el diseo


de interfaces de usuario, la programacin Web y el diseo incremental
de programas en el que se refinan partes de un programa mientras est
en ejecucin (sin detenerlo).

4. Otros paradigmas de programacin: basado en interaccin

Programacin por eventos

Es un paradigma de programacin en el que el flujo del


programa est determinado por eventos (seales de sensores
o, mas comnmente, acciones de usuario como clicks de ratn,
pulsacin de botones o teclas, etc) o mensajes desde otros
programas o procesos.
La arquitectura tpica de una aplicacin event-driven (o eventbased) consiste en un bucle principal dividido en dos secciones
independientes:

la primera seccin est dedicada a la deteccin o seleccin de


eventos (event detection)
la segunda consiste en el manejo de los eventos (event handling).

(en el caso de software empotrado, la primera seccin reside en el hardware y se


gestiona mediante interrupciones sin que exista un bucle principal).

4. Otros paradigmas de programacin: basado en interaccin

Se puede usar cualquier lenguaje de alto nivel para escribir


programas en el estilo event-driven, siempre que sean capaces
de:

detectar seales, interrupciones al procesador o, en el caso de


aplicaciones GUI, clicks de ratn
gestionar una cola de eventos para reaccionar a ellos en el orden en
que han sido recibidos.

El desarrollo de programas basados en eventos se simplifica


utilizando patrones de diseo, que son catlogos de elementos
reusables en el diseo de sistemas software. Concretamente, se
utiliza el patrn de interaccin event-handler.

4. Otros paradigmas de programacin: basado en interaccin

El patrn event-handler consta de:

una

secuencia de eventos
un dispatcher que procesa la secuencia
un conjunto de manejadores

4. Otros paradigmas de programacin: basado en interaccin

Pseudo-cdigo para un
dispatcher tipico con:

bucle principal,
operacin salir,
determinacin del tipo de
evento y seleccin del
manejador apropiado segn
el tipo
gestin de los eventos.

do forever:

# the event loop

get an event from the input stream


if
if

event type == EndOfEventStream :


quit # break out of event loop

event type == ... :


call the appropriate handler, passing
it event information as an argument
elif event type == ... :
call the appropriate handler, passing
it event information as an argument
else: # handle an unrecognized type of event
ignore the event, or raise an
exception

4. Otros paradigmas de programacin: basado en interaccin

Algunas consideraciones finales:

La programacin basada en eventos puede o no ser orientada a


objetos.
La programacin basada en eventos no implica tampoco
programacin concurrente.

La programacin basada en eventos se usa masivamente en la


programacin de GUIs al haber sido adoptada como modelo de
interaccin en la mayora de herramientas comerciales, que
proporcionan una implementacin por defecto para el bucle principal y
la cola de eventos, aliviando el trabajo del programador. Sin embargo,
n
n
n
n

promueve un modelo evento-accin excesivamente simple


difcil de extender
propenso a errores
complejidad de cdigo

4. Otros paradigmas de programacin

Otros paradigmas emergentes

Los modelos de computacin inspirados en la biologa utilizan tcnicas


que se emplean en sistemas que ocurren en la naturaleza (por ejemplo
mecanismos propios de los seres vivos) como base para desarrollar
nuevas tcnicas de programacin (BIO-COMPUTACIN).
COMPUTACIN CUNTICA: La principal idea de la computacin
cuntica es reemplazar los circuitos clsicos de los computadores
tradicionales por otros que utilizan puertas de quantums (en vez de
puertas lgicas).
Mas informacin: en poliformat
Recursos/Teoria/Tema 1/Bibliografia-T1/Emergentes

91

LTPP: Bibliografa
BSICA

Cortazar, Francisco. Lenguajes de programacin y procesadores. Editorial Cera,


2012.
Pea, Ricardo. De Euclides a Java: historia de algoritmos y lenguajes de
programacion, Editorial Nivola, 2006.
Pratt, T.W.; Zelkowitz, M.V. Programming Languages: design and implementation,
Prentice-Hall, 2001 (versin de 1998 en castellano)
Scott, M.L. Programming Language Pragmatics, Morgan Kaufmann Publishers,
2008 (versin revisada).
Schildt, Herbert. Java. The Complete Reference. Eight Edition. The McGraw-Hill
eds. 2011

ESPECFICA

Ver descripcin de actividades no presenciales.

You might also like