720 likes | 1.23k Views
Paradigmas de Programación. Departamento de Informática Universidad de Valladolid Curso 2010-11 Grado en Ingeniería Informática Grado en Ingeniería Informática de Sistemas. Definición.
E N D
Paradigmas de Programación Departamento de Informática Universidad de Valladolid Curso 2010-11 Grado en Ingeniería Informática Grado en Ingeniería Informática de Sistemas César Vaca Rodríguez, Dpto. de Informática, UVa
Definición • “Un paradigma de programación indica un método de realizar cómputos y la manera en que se deben estructurar y organizar las tareas que debe llevar a cabo un programa ” • Los paradigmas fundamentales están asociados a determinados modelos de cómputo. • Tambien se asocian a un determinado estilo de programación • Los lenguajes de programación suelen implementar, a menudo de forma parcial, varios paradigmas. César Vaca Rodríguez, Dpto. de Informática, UVa
Tipos de paradigmas • Los paradigmas fundamentales están basados en diferentes modelos de cómputo y por lo tanto afectan a las construccio-nes más básicas de un programa. • La división principal reside en el enfoque imperativo (indicar el cómose debe calcular) y el enfoque declarativo (indicar el qué se debe calcular). • El enfoque declarativo tiene varias ramas diferenciadas: el paradigma funcional, el paradigma lógico, la programación reactiva y los lenguajes descriptivos. • Otros paradigmas se centran en la estructura y organización de los programas, y son compatibles con los fundamentales: • Ejemplos: Programación estructurada, modular, orientada a objetos, orientada a eventos, programación genérica. • Por último, existen paradigmas asociados a la concurrencia y a los sistemas de tipado. César Vaca Rodríguez, Dpto. de Informática, UVa
El zoo de los paradigmas Modular Imperativo Código Procedimental Módulos Declarativo Estructurado Procedimientos Funcional Control de flujo Acciones elementales Orientado a Eventos Relación Lógico Orientado a Objetos Reactivo Datos Programación Genérica Programación Concurrente César Vaca Rodríguez, Dpto. de Informática, UVa
Paradigma Imperativo • Describe cómo debe realizarse el cálculo, no el porqué. • Un cómputo consiste en una serie de sentencias, ejecutadas según un control de flujo explícito, que modifican el estado del programa. • Las variables son celdas de memoria que contienen datos (o referencias), pueden ser modificadas, y representan el estado del programa. • La sentencia principal es la asignación. • Es el estándar ‘de facto’. • Asociados al paradigma imperativo se encuentran los paradigmas procedural, modular, y la programación estructurada. • El lenguaje representativo sería FORTRAN-77, junto con COBOL, BASIC, PASCAL, C, ADA. • También lo implementan Java, C++, C#, Eiffel, Python, ... César Vaca Rodríguez, Dpto. de Informática, UVa
Paradigma Declarativo • Describe que se debe cálcular, sin explicitar el cómo. • No existe un orden de evaluación prefijado. • Las variables son nombres asociados a definiciones, y una vez instanciadas son inmutables. • No existe sentencia de asignación. • El control de flujo suele estar asociado a la composición funcional, la recursividad y/o técnicas de reescritura y unificación. • Existen distintos grados de pureza en las variantes del paradigma. • Las principales variantes son los paradigmas funcional, lógico, la programación reactivay los lenguajes descriptivos. César Vaca Rodríguez, Dpto. de Informática, UVa
Programación Funcional • Basado en los modelos de cómputo cálculo lambda (Lisp, Scheme) y lógica combinatoria (familia ML, Haskell) • Las funciones son elementos de primer orden • Evaluación por reducción funcional. Técnicas: recursividad, parámetros acumuladores, CPS, Mónadas. • Familia LISP (Common-Lisp, Scheme): • Basados en s-expresiones. • Tipado debil. • Meta-programación • Familia ML (Miranda, Haskell, Scala): • Sistema estricto de tipos (tipado algebraico) • Concordancia de patrones. • Transparencia referencial • Evaluación perezosa (estruct. de datos infinitas) César Vaca Rodríguez, Dpto. de Informática, UVa
Programación Lógica • Basado en la lógica de predicados de primer orden • Los programas se componen de hechos, predicados y relaciones. • Evaluación basada en resolución SLD: unificación + backtracking. • La ejecución consiste en la resolución de un problema de decisión, los resultados se obtienen mediante la instanciación de las variables libres. • Lenguaje representativo: PROLOG César Vaca Rodríguez, Dpto. de Informática, UVa
Programación Reactiva (Dataflow) • Basado en la teoria de grafos. • Un programa consiste en la especificación del flujo de datos entre operaciones. • Las variables se encuentran ligadas a las operaciones que proporcionan sus valores. Un cambio de valor de una variable se propaga a todas las operaciones en que participa. • Las hojas de cálculo se basan en este modelo. • Lenguajes representativos: Simulink, Oz, Clojure. A := 10 B := A + 1 print B A := 3 print B 11 4 César Vaca Rodríguez, Dpto. de Informática, UVa
Ejemplo: Algoritmo de Euclides • Cálculo del máximo común divisor • Primer algoritmo no trivial. Euclides, año 300 A.C. • donde a | d significa que a es divisible exactamente por d: • si a y b son divisibles por d, y a > b, entonces: • y por lo tanto (restar sucesivamente b es equivalente a hallar el resto de dividir a por b): César Vaca Rodríguez, Dpto. de Informática, UVa
Diagrama de flujo #1 #2 #1 #2 resto mcd A Entrada #1 B Entrada #2 A Entrada #1 B Entrada #2 A B B C A > B C resto(A,B) NO C = 0 SI NO A A - B SI Salida #1 A Salida #1 B #1 #1 César Vaca Rodríguez, Dpto. de Informática, UVa
FORTRAN-77 • Imperativo, procedural, no estructurado FUNCTION MCD(NA, NB) IA = NA IB = NB 1 IF (IB.NE.0) THEN ITMP = IA IA = IB IB = MOD(ITMP, IB) GOTO 1 END IF MCD = IA RETURN END Paso por referencia Tipado implícito Saltos César Vaca Rodríguez, Dpto. de Informática, UVa
PASCAL • Imperativo, procedural, estructurado function MCD(a,b: integer): integer; var c: integer; begin whileb <> 0 do begin c := a; a := b; b := c mod b end; MCD := b end; Paso por valor Tipado explícito César Vaca Rodríguez, Dpto. de Informática, UVa
SCHEME, HASKELL, PROLOG • Lenguajes funcionales y lógicos (recursividad) • Scheme • Haskell • Prolog (define (mcd a b) (if (= b 0) a (mcd b (modulo a b)))) s-expresiones tipado estricto mcd :: Int -> Int -> Int mcd a 0 = a mcd a b = mcd b (rem a b) concordancia de patrones predicados, unificación mcd(A,0,D) :- A = D. mcd(A,B,D) :- B > 0, C is A mod B, mcd(B,C,D). César Vaca Rodríguez, Dpto. de Informática, UVa
Modelos de Cómputo Mundo Externo Sensores Máquina de Cómputo Actuadores Mundo Externo Datos Resultados Secuencias de bits • Números • Texto • Símbolos • Imágenes • Sonido • Medidas • ... Contexto César Vaca Rodríguez, Dpto. de Informática, UVa
Modelos de cómputo • El concepto de cómputo puede modelizarse por el concepto matemático de función: • “Aplicación de un dominio de valores a un rango de resultados donde cada valor puede estar asociado como máximo a un resultado” • Usamos el modelo “caja de conexiones” para las funciones • Ejemplo: función que devuelve el día de la semana. 1/1/1930 2/1/1930 31/2/1930 ... 14/2/2010 15/2/2010 ... 31/12/2099 Lunes Martes Miércoles Jueves Viernes Sábado Domingo César Vaca Rodríguez, Dpto. de Informática, UVa
Máquinas y modelos de cómputo • Jerarquía de niveles según capacidad expresiva y poder de cómputo : • Circuitos combinacionales • Máquinas de estado finito / Autómatas secuenciales • Máquinas de Turing / Máquinas de registros (RAM) • Modelos formales • Funciones parciales recursivas • Cálculo lambda / Lógica combinatoria • Lógica de predicados + unificación • Sistemas de reescritura • Arquitecturas • Modelo Von-Neumman • Modelo Harvard • Paralelismo César Vaca Rodríguez, Dpto. de Informática, UVa
Circuitos combinacionales • Basados en la lógica booleana • Las entradas y los resultados no se pueden secuenciar • Conjunto minimalista de elementos: reles, puertas NAND, etc. AND XOR César Vaca Rodríguez, Dpto. de Informática, UVa
Máquina de Antikythera • La máquina calculadora (no trivial) más antigua: Año 150 A.C. • Video: http://www.youtube.com/watch?v=MqhuAnySPZ0 César Vaca Rodríguez, Dpto. de Informática, UVa
Máquinas secuenciales(maq. estado finito / autómatas) • Circuito combinacional + memoria (estado) + reloj • Se pueden secuenciar los datos de entrada y salida • Los datos de entrada pueden controlar el flujo de ejecución • Memoria • (estados) • Reloj • Controlador • (circuito combinacional • o similar) • Entrada • Salida César Vaca Rodríguez, Dpto. de Informática, UVa
Sumador secuencial Memoria César Vaca Rodríguez, Dpto. de Informática, UVa
Reloj del Castillo • El autómata programable más antiguo: Al-Jazari, año 1206 D.C. • Video: http://www.youtube.com/watch?v=0pGXL5OKGqs César Vaca Rodríguez, Dpto. de Informática, UVa
Máquina Analítica • La primera máquina computadora universal (si se hubiera construido) • Charles Baggage, 1837 • Primer programa de la historia: Ada Lovelace • Video: http://www.youtube.com/watch?v=88GYbyMaaN8&NR=1 César Vaca Rodríguez, Dpto. de Informática, UVa
Máquinas de Turing Cinta infinita entrada / salida marcada con 0 y 1 • Alan Turing, 1936 – Modelo abstracto de cómputo • Existen muchas MT distintas, definidas por su lista de transiciones, cada una resuelve un problema particular. • Video máquina real: http://aturingmachine.com/ Lista de transiciones Registro de estado Controlador Motor izda/dcha Cabeza lectora / escritora César Vaca Rodríguez, Dpto. de Informática, UVa
Máquinas de Turing(versión de Penrose) • Cinta de entrada: • Alfabeto de sólo dos símbolos: 0 (blanco) y 1 (punto) • Al comienzo la entrada se situa a la derecha de la cabeza • Al finalizar la salida se encuentra a la izquierda de la cabeza • Controlador: • Cada máquina tiene nestados posibles (numerados 0..n-1) • La máquina comienza siempre en el estado 0 • Dispone de un único registro que almacena el estado actual • La lista de transiciones tiene n filas, una por cada estado, y dos columnas, una por cada valor posible de la celda actual (0 ó 1) • Cada transición indica lo siguiente: • Nuevo estado al que pasa la máquina • Símbolo (0 ó 1) que se escribe en la celda actual • Movimiento de la cabeza: I (izquierda), D (derecha), S (derecha y parada) César Vaca Rodríguez, Dpto. de Informática, UVa
Máquinas de Turing • Codificación unaria: • La máquina recibe una lista de enteros positivos no nulos • Cada número se separa del siguiente por el símbolo 0 (blanco) • El valor del entero es el número de 1 consecutivos • Ejemplo: Entradas (2,5,1): ..011011111010.. • Codificación general: • Es un proceso de dos etapas de traducción • La máquina recibe una secuencia de números enteros positivos y símbolos cualesquiera (un número finito de posibles símbolos). • Los números se codifican en binario(números 0 y 1) • El resto de símbolos se indexan por números del 2 en adelante. • Esta secuencia de números se convierte a binario expandido: 0 0, 1 01, 2 011, 3 0111, 4 01111, ... César Vaca Rodríguez, Dpto. de Informática, UVa
Máquinas de Turing • Ejemplo: La entrada es la cadena -44.13,a • Si la tabla de conversión es: - 2, . 3, , 4, a 5 • Primera etapa de conversión: (enteros a binario) 21011003110145 • Segunda etapa de conversión (binario expandido) 01101001010001110101001011110111110 | | || | ||| | | || | | | 2 1 0 1 1 0 0 3 1 1 0 1 4 5 César Vaca Rodríguez, Dpto. de Informática, UVa
Máquinas de Turing – INC, DUP • Incremento en uno (unaria) • Multiplicar por 2 (unaria) • 3 0 0 • 0 • 1 1 1 1 0 0 1 1 1 1 1 0 • 0 0 • 1 1 • 2 0 • 4 1 • 5 0 1 0 0 1 César Vaca Rodríguez, Dpto. de Informática, UVa
Máquina de Turing - MCD • Cálculo del máximo común divisor (unaria) • 10 0 0 0 0 1 1 1 0 1 0 • 0 • 1 1 • 2 0 • 3 • 4 1 0 1 0 1 0 • 6 1 1 • 5 0 1 • 9 0 • 8 • 7 0 1 César Vaca Rodríguez, Dpto. de Informática, UVa
Máquina de Turing – INC • Incremento (general) • El algoritmo se basa en que para incrementar un número en binario basta con localizar el último 0 y cambiarlo por 1 y todos los siguientes 1 por 0: 10100111 + 1 = 10101000 0 0 1 1 • 0 • 1 • 2 • 3 0 • 4 1 0 0 1 1 0 1 1 1 0 • 7 • 6 0 • 5 0 1 0 César Vaca Rodríguez, Dpto. de Informática, UVa
Máquina de Turing Universal • Cada máquina de Turing realiza un determinado cómputo (resuelve un determinado problema) • Cada máquina de Turing esta completamente determinada por su tabla de transiciones. • Es posible codificar en binario la tabla de transiciones de una máquina de Turing: • Pasamos los estados a binario, elegimos la codificación para movimientos D 2, I 3, S 4 • Para ahorrar espacio quitamos la primera transición y convertimos las transiciones (0,0,x) x, (0,1,x) 1x • Pasamos la secuencia a binario expandido y eliminamos el 110 final. • ¡Cada máquina de Turing está representada por un número entero positivo! César Vaca Rodríguez, Dpto. de Informática, UVa
Máquina de Turing Universal • Ejemplo: Máquina INC unaria: • Tabla de transiciones, en secuencia: 00D11D01S11D • Quitando primera transición y convirtiendo 01S en 1S: 11214112 • Conviertiendo a binario expandido: 0101011010111101010110 • Quitando los tres dígitos finales y traduciendo a decimal: • La máquina de Turing INC unaria es la 177.642-ava máquina de Turing César Vaca Rodríguez, Dpto. de Informática, UVa
Máquina de Turing Universal • Máquina de Turing Universal: Recibe como parámetro el número de otra máquina de Turing y una lista de parámetros. • Devuelve como resultado el cálculo que hubiera realizado la otra máquina si se hubiera ejecutado con esos parámetros. • Sea TU la máquina universal, y Tn la máquina con número n: • TU(n,p1..pm) = Tn(p1..pm) • La máquina universal es capaz de simular cualquier otra máquina de Turing. • La máquina universal tiene su propio número: César Vaca Rodríguez, Dpto. de Informática, UVa
Máquina de Turing Universal 7244855335339317577198395039615711237952360672556559631108144796606505059404241090310483613632359365644443458382226883278767626556144692814117715017842551707554085657689753346356942478488597046934725739988582283827795294683460521061169835945938791885546326440925525505820555989451890716537414896033096753020431553625034984529832320651583047664142130708819329717234151056980262734686429921838172157333482823073453713421475059740345184372359593090640024321077342178851492760797597634415123079586396354492269159479654614711345700145048167337562172573464522731054482980784965126988788964569760906634204477989021914437932830019493570963921703904833270882596201301773727202718625919914428275437422351355675134084222299889374410534305471044368695876405178128019437530813870639942772823156425289237514565443899052780793241144826142357286193118332610656122755531810207511085337633806031082361675045635852164214869542347187426437544428790062485827091240422076538754264454133451748566291574299909502623009733738137724162172747723610206786854002893566085696822620141982486216989026091309402985706001743006700868967590344734174127874255812015493663938996905817738591654055356704092821332221631410978710814599786695997045096818419062994436560151454904880922084480034822492077304030431884298993931352668823496621019471619107014619685231928474820344958977095535611070275817487333272966789987984732840981907648512726310017401667873634776058572450369644348979920344899974556624029374876688397514044516657077500605138839916688140725455446652220507242623923792115253181625125363050931728631422004064571305275802307665183351995689139748137504926429605010013651980186945639498 César Vaca Rodríguez, Dpto. de Informática, UVa
Computabilidad • Algoritmo: Procedimiento sistemático que permite resolver un problema en un número finito de pasos, cada uno de ellos especificado de manera efectiva y sin ambigüedad. • Función computable: Aquella que puede ser calculada mediante un dispositivo mecánico dado un tiempo y espacio de almacenamiento ilimitado (pero finito) • No importa la eficiencia, sino la posibilidad de ser calculada. • ¿Existen funciones no computables? • Entscheidungsproblem: Décima pregunta de Hilbert (Bolonia, 1928): ¿Existe un procedimiento mecánico (algorítmico) general para resolver toda cuestión matemática bien definida? César Vaca Rodríguez, Dpto. de Informática, UVa
Computabilidad • Algoritmo: Procedimiento sistemático que permite resolver un problema en un número finito de pasos, cada uno de ellos especificado de manera efectiva y sin ambigüedad. • Función computable: Aquella que puede ser calculada mediante un dispositivo mecánico dado un tiempo y espacio de almacenamiento ilimitado. • No importa la eficiencia, sino la posibilidad de ser calculada. • Entscheidungsproblem: Décima pregunta de Hilbert (Bolonia, 1928): ¿Existe un procedimiento mecánico (algorítmico) general para resolver toda cuestión matemática bien definida? NO (Gödel, 1931) (Turing, 1937) César Vaca Rodríguez, Dpto. de Informática, UVa
Tesis Church-Turing • Existen problemas bien definidos para los cuales no es posible encontrar un procedimiento mecánico que devuelva una solución en un tiempo finito. • El problema de la detención • El problema del castor afanoso • Tesis Church-Turing: Toda función computable es calculable mediante una máquina de Turing. • Indemostrable, pero considerada cierta por la mayoría. • Equivalencia entre distintos sistemas formales: • Máquina de Turing ↔ Cálculo lambda • Calculo lambda ↔ Funciones recursivas • etc. César Vaca Rodríguez, Dpto. de Informática, UVa
¿Super-Turing? • Posibilidades de superar al modelo de Turing: • Múltiples cintas • Cintas en 2D, 3D, nD • Controlador trabajando en paralelo con varias cintas • Acceso directo a posición en cinta (modelo RAM) • ... • Todas tienen un poder equivalente al de una máquina normal (pueden ser simuladas). • Las alternativas mejoran la eficiencia, pero no amplian el conjunto de lo que es computable. César Vaca Rodríguez, Dpto. de Informática, UVa
Máquinas de Registros (RAM) • Derivadas del modelo de Turing, pero en vez de cinta secuencial con una memoria de acceso directo. • El controlador dispone de un número finito de registros internos, que definen su estado. • Un programa consiste en una serie de instrucciones, leidas de memoria, entre las cuales existen los tipos: • Copia de datos entre dirección de memoria y registros. • Operaciones aritméticas en registros • Salto condicional según valor de registro • Indirección (contenido de registros son direcciones de memoria) • Es el modelo en que se basan la gran mayoria de computadoras. César Vaca Rodríguez, Dpto. de Informática, UVa
Arquitectura Von-Neumman • El programa y los datos se almacenan juntos en memoria. • Existe un registro que indica la posición de memoria donde se encuentra la instrucción actual. • Arquitectura Harvard: código y datos se almacenan en memorias separadas. César Vaca Rodríguez, Dpto. de Informática, UVa
RAM minimalista • Es posible tener una RAM con un sólo tipo de instrucción: subleq a,b,c • Esta instrucción resta el contenido de las posiciones de memoria a y b, almacena el resultado en b, y si es negativo salta a la instrucción situada en c. • Se necesita que una posición de memoria (Z) almacene 0 • Cualquier otra instrucción puede sintetizarse a partir de subleq: MOV a,b ≡ subleq b,b,c c : subleq a,Z,d d : subleq Z,b,e e : subleq Z,Z,f f : ... SALTO c ≡ subleq Z,Z,c SUMA a,b ≡ subleq a,Z,c c : subleq Z,b,d d : subleq Z,Z,e e : ... César Vaca Rodríguez, Dpto. de Informática, UVa
Funciones Primitivas Recursivas • Kurt Gödel, 1931 • Modelo de cómputo formal, basado en la reducción al mínimo de los posibles elementos que se pueden usar para definir una función: • Se restringen las funciones a aquellas cuyos argumentos y único resultado son números naturales. • Se puede utilizar el valor constante 0 (función cero) • Se puede usar +1(función sucesor) • Se puede acceder a un argumento (funciones proyectoras) • Composición: • El resultado de una función puede servir de argumento de otra • Recursión primitiva: César Vaca Rodríguez, Dpto. de Informática, UVa
Funciones Primitivas Recursivas • Suma: • Predecesor, Resta (resta(a,b) = b-a si b > a, 0 si b ≤ a) • Condicional, Máximo Común Divisor: César Vaca Rodríguez, Dpto. de Informática, UVa
Funciones Primitivas Recursivas • Son finitas: Su evaluación requiere un número finito de pasos. • Son equivalentes a un lenguaje de programación donde los bucles tengan un número máximo de iteraciones. • Por ejemplo, Pascal sólo con bucles for (se permite sentencia break para salida anticipada) y sin llamadas recursivas. • No pueden calcular todas las funciones computables. • Para ello necesitan el operador μFunciones Recursivas Generales • Equivalentes a lenguajes con bucles tipo while. César Vaca Rodríguez, Dpto. de Informática, UVa
Función de Ackermann • Ejemplo de función computable no primitiva recursiva: César Vaca Rodríguez, Dpto. de Informática, UVa
Cálculo lambda • Alonzo Church, 1936 • El “lenguaje de programación” más sencillo (salvo quizás la lógica combinatoria) • Simplificación extrema del cálculo: • No importa el nombre de las funciones ni de los argumentos: f(x,y) = x2 + y2y g(a,b) = a2 + b2son la misma función. • Toda función de más de un argumento se puede considerar como una función de un solo argumento que devuelve no un valor sino una función: Currificación • No se necesitan números: Todo puede ser representado únicamente mediante funciones. César Vaca Rodríguez, Dpto. de Informática, UVa
Cálculo lambda - Notación • Una expresión lambda puede ser: • Una variable (a, b, c ...) • Una abstracción: (donde x es una variable y t es una expresión lambda) • Una aplicación: (donde f y g son expresiones lambda) • Convenciones: • Las variables representan funciones. • Se pueden usar paréntesis para indicar el orden de evaluación. • Las aplicaciones son asociativas hacia la izquierda: • Las abstracciones se extienden todo lo posible hacia la derecha • Dentro del término de una abstracción, la variable de la abstracción se denomina ligada (el resto son variables libres). • Las abstracciones se pueden contraer: César Vaca Rodríguez, Dpto. de Informática, UVa
Cálculo lambda - Reducciones • Las operaciones que permiten manipular expresiones lambda son: • La α-reducción (renombrado): Es posible cambiar el nombre de las variables ligadas. • La β-reducción: Al aplicar una abstracción a otra expresión, podemos sustituir la expresión por el término de la abstracción donde se han sustituido todas las apariciones de la variable ligada por la expresión aplicada: • La η-reducción: Si el término de una abstracción es una aplicación donde en la primera expresión no aparece la variable ligada y la segunda expresión es la variable, se puede sustituir la abstracción por la expresión: César Vaca Rodríguez, Dpto. de Informática, UVa
Cálculo lambda - Representación • Representación de los números naturales, incremento, suma, producto, predecesor, resta: 0 º l f x . x 1 º l f x . f x 2 º l f x . f (f x) 3 º l f x . f (f (f x)) 4 º l f x . f (f (f (f x))) Succ º l n f x . f (n f x) Sum º l m n . m Succ n Mul º l m n . m (Sumn) 0 Pred º l n f x . n (l g h . h (g f)) (l n . x) (l n . n) Sub º l n m . n Pred m César Vaca Rodríguez, Dpto. de Informática, UVa
Cálculo lambda - Representación • Representación de los valores lógicos, condicional, test si valor nulo, test menor o igual: T º l x y . x F º l x y . y If º l p a b . p a b Is0 º l n . n (l x . F) T Leq º l n m . Is0 (Sub n m) • Recursividad (combinador Y): Y º l g . (l x . g (x x)) (l x . g (x x)) Yf =(l x . f (x x)) (l x . f (x x)) • = f ((l x . f (x x)) (l x . f (x x))) • = f ( Y f ) César Vaca Rodríguez, Dpto. de Informática, UVa