Intro_PyL

38
P P Pa a ar r ra a ad d di i ig g gm m ma a as s s y y y L L Le e en n ng g gu u ua a aj j je e es s s I I n n t t r r o o d d u u c c c c i i ó ó n n Lic. Ricardo Monzón Ing. Rubén Bernal

description

program

Transcript of Intro_PyL

PPPaaarrraaadddiiigggmmmaaasss yyy LLLeeennnggguuuaaajjjeeesss

IInnttrroodduucccciióónn

Lic. Ricardo Monzón

Ing. Rubén Bernal

Parte 1: Introducción Paradigmas y Lenguajes

Página 2

PARADIGMAS Y LENGUAJES

LICENCIATURA EN SISTEMAS DE INFORMACION FACULTAD DE CIENCIAS EXACTAS Y NATURALES Y

AGRIMENSURA-UNNE

2DO. AÑO PRIMER CUATRIMESTRE

PROFESORES TEORIA:

LIC. RICARDO MONZON

ING. RUBEN BERNAL PROFESORES DE PRACTICO

EXP. LAURA MACIEL

LIC. SONIA CORRALES

LIC. MONICA RINGA

LIC. MARIELA FERRARI AYUDANTES DE PRACTICA

Carlos Romero

Leandro Rodríguez HORARIOS DE CLASES TEORICAS:

LUNES DE 18:00 a 20:00

SABADOS DE 09:30 A 12:30. HORARIOS DE CLASES PRACTICAS:

Grupo M-Z: LUNES DE 14:00 A 16:00. MIERCOLES DE 15:00 A 17:00 AULA MAGNA.

Grupo A-L: LUNES DE 16:00 A 18:00. MIERCOLES DE 13:00 A 15:00 AULA MAGNA.

HORARIOS DE LABORATORIO:

A confirmar.

Parte 1: Introducción Paradigmas y Lenguajes

Página 3

PARTE I: INTRODUCCION.

TEMA 1: PARADIGMAS y Paradigmas de Programación

Definición Teórica

Un paradigma está constituido por los supuestos teóricos generales, las leyes y las técnicas para su aplicación que adoptan los miembros de una determinada comunidad científica.

Las leyes explícitamente establecidas y los supuestos teóricos. Por ejemplo, las leyes de movimiento de Newton forman parte del paradigma newtoniano y las ecuaciones de Maxwell forman parte del paradigma que constituye la teoría electromagnética clásica.

El instrumental y las técnicas instrumentales necesarios para hacer que las leyes del paradigma se refieran al mundo real. La aplicación en astronomía del paradigma newtoniano requiere el

uso de diversos telescopios, junto con técnicas para su utilización y diversas técnicas para corregir los datos recopilados.

Un componente adicional de los paradigmas lo constituyen algunos principios metafísicos muy generales que guían el trabajo dentro del paradigma.

Podemos decir que, los paradigmas son marcos de referencia que imponen reglas sobre cómo se deben hacer las cosas, indican qué es válido dentro del paradigma y qué está fuera de sus límites.

Un paradigma distinto implica nuevas reglas, elementos, límites y

maneras de pensar, o sea implica un cambio.

Los paradigmas pueden ser considerados como patrones de pensamiento para la resolución de problemas. Desde luego siempre teniendo en cuenta los lenguajes de programación, según nuestro interés de estudio.

Un paradigma de programación es entonces una forma de representar y manipular el conocimiento. Representa un enfoque particular o filosofía para la construcción del software. No es mejor uno que otro sino que cada uno tiene

ventajas y desventajas. También hay situaciones donde un paradigma resulta más apropiado que otro.

Parte 1: Introducción Paradigmas y Lenguajes

Página 4

Tipos de Paradigmas de Programación

1. Paradigmas Imperativo: Modelo abstracto que consiste en un gran almacenamiento de memoria donde la computadora almacena una representación codificada de un cálculo y ejecuta una secuencia de comandos que modifican el contenido de ese almacenamiento. Algoritmos + Estructura de Datos = Programa.

Son aquellos que facilitan los cálculos por medio de cambios de estado, entendiendo como estado la condición de una memoria de

almacenamiento. Los lenguajes estructurados en bloques, se refieren a los ámbitos anidados, es decir los bloques pueden estar anidados dentro de otros bloques y contener sus propias variables. La RAM representa una pila con una referencia al bloque que está actualmente activo en la parte superior.

2. Paradigmas Procedimentales - Modelos de Desarrollo: Orientado a Eventos y a Agentes. Secuencia computacional realizada etapa a etapa para resolver el problema. Su mayor

dificultad reside en determinar si el valor computado es una solución correcta del problema.

3. Paradigmas Declarativos. - Modelos de Desarrollo: Funcional, Lógico y de Flujo de Datos. Se construye señalando hechos, reglas, restricciones, ecuaciones, transformaciones y otras propiedades derivadas del conjunto de valores que configuran la solución.

3.1 Paradigma Funcional: Modelo matemático de composición funcional donde el resultado de un cálculo es la

entrada del siguiente, y así sucesivamente hasta que una composición produce el valor deseado.

Como su nombre lo dice operan solamente a través de funciones. Cada función devuelve un solo valor, dada una lista de parámetros. No se permiten asignaciones globales, llamados efectos colaterales. La programación funcional proporciona la capacidad para que un programa se modifique así mismo, es decir que pueda aprender.

3.2. Paradigma lógico: Esta programación se basada en un

subconjunto del cálculo de predicados, incluyendo instrucciones escritas en formas conocidas como cláusulas de Horn. Este paradigma puede deducir nuevos hechos a partir

Parte 1: Introducción Paradigmas y Lenguajes

Página 5

de otros hechos conocidos. Un sistema de cláusulas de Horn permite un método particularmente mecánico de demostración llamado resolución.

La programación lógica, la otra variedad de la programación declarativa, usa como base sentencias de lógica de primer orden, en concreto las cláusulas de Horn (restricción del Cálculo de Predicados de Primer Orden) y su forma de ejecución es el principio de resolución de Robinsón.

Trata de representar conocimiento mediante relaciones

(predicados) entre objetos (datos).

Un programa lógico consiste en un conjunto de relaciones, y su ejecución vendrá a demostrar que una nueva relación se sigue se las que constituía el programa. Las relaciones serán especificadas con reglas y hechos.

La ejecución de programas lógicos consiste en la demostración de hechos sobre las relaciones por medio de preguntas.

4. Paradigmas Demostrativos.- Modelos de Desarrollo:

Genético. Cuando se programa bajo un paradigma demostrativo (también llamada programación por ejemplos), el programador no especifica procedimentalmente cómo construir una solución sino que presentan soluciones de problemas similares.

5. Paradigma Orientado a Objeto: disciplina de ingeniería de desarrollo y modelado de software que permite construir más fácilmente sistemas complejos a partir de componentes individuales. Objetos + Mensajes = Programa.

Describen los lenguajes que soportan objetos en interacción. Un objeto es un grupo de procedimientos que comparten un estado. El término de orientado a objetos fue utilizado originalmente para distinguir aquellos lenguajes basados en objetos que soportaban clases de objetos y la herencia de atributos de un objeto padre por parte de sus hijos.

Parte 1: Introducción Paradigmas y Lenguajes

Página 6

Ejemplos de paradigmas de programación:

El paradigma imperativo es considerado el más común y está representado, por ejemplo, por el C o por BASIC..

El paradigma funcional está representado por la familia de lenguajes LISP, en particular Scheme.

El paradigma lógico, un ejemplo es PROLOG.

El paradigma orientado a objetos. Un lenguaje completamente orientado a objetos es Smalltalk.

Entonces:

La Programación Declarativa, o bien un Paradigma declarativo, es un paradigma de programación que está basado en el desarrollo de programas especificando o "declarando" un conjunto de condiciones, proposiciones, afirmaciones, restricciones, ecuaciones o transformaciones que describen el problema y detallan su solución. La solución es obtenida mediante mecanismos internos de control, sin especificar exactamente cómo encontrarla.

Diferencia entre imperativo y declarativo

En la programación imperativa se describe paso a paso un conjunto de instrucciones que deben ejecutarse para variar el estado del programa y hallar la solución, es decir, un algoritmo en el que se describen los pasos necesarios para solucionar el problema.

En la programación declarativa las sentencias que se utilizan lo que hacen es describir el problema que se quiere solucionar, pero no

las instrucciones necesarias para solucionarlo. Esto último se realizará mediante mecanismos internos de inferencia de información a partir de la descripción realizada.

Parte 1: Introducción Paradigmas y Lenguajes

Página 7

TEMA 2: LENGUAJES DE PROGRAMACION

INTRODUCCIÓN

¿Qué es un lenguaje de programación?

Un conjunto de sintaxis y reglas semánticas que definen los programas del computador. Es una técnica estándar de comunicación para entregarle instrucciones al computador.

Un lenguaje le da la capacidad al programador de especificarle al computador, qué tipo de datos actúan y que acciones tomar bajo una variada gama de circunstancias, utilizando un lenguaje relativamente próximo al lenguaje humano.

Un programa escrito en un lenguaje de programación necesita pasar por un proceso de compilación, interpretación o intermedio, es decir, ser traducido al lenguaje de máquina para que pueda ser

ejecutado por el ordenador.

Los lenguajes de programación pueden ser clasificados de acuerdo a diversos criterios:

Lenguajes interpretados (Interpretes) como Basic, Dbase.

Lenguajes compilados (Compiladores) como C, C++, Clipper.

Lenguajes interpretados con recolectores de basura (Maquina Virtual) como Smalltalk, Java, Ocaml.

Lenguajes Scripts (Motor de ejecución) como Perl, PhP.

Parte 1: Introducción Paradigmas y Lenguajes

Página 8

Clasificación de los Lenguajes de Programación

Declarativos: en ciencias computacionales son aquellos lenguajes de programación en los cuales se le indica a la computadora que es lo que se desea obtener o que es lo que se esta buscando.

Por ejemplo: Obtener los nombres de todos los empleados que

tengan más de 32 años. Algunos ejemplos de lenguajes declarativos son el Datatrieve, SQL y las expresiones regulares.

Siglas de Structured Query Language (Lenguaje Estructurado de Consultas). Es un lenguaje declarativo que aúna características del Álgebra y el Cálculo Relacionales que nos permite lanzar consultas contra una Base de Datos para recuperar información de nuestro interés, almacenada en ella.

El concepto de expresiones regulares (Regular expressions en inglés) se refiere a una familia de lenguajes compactos y potentes para la descripción de conjuntos de cadenas de caracteres. Numerosos editores de texto y otras utilidades (especialmente en el sistema operativo UNIX), como por ejemplo sed y awk, utilizan estos lenguajes para buscar ciertas estructuras en el texto y, por ejemplo, remplazarlas con alguna otra cadena de caracteres.

Imperativos: En ciencias de la computación se llama lenguajes imperativos a aquellos en los cuales se le ordena a la computadora cómo realizar una tarea siguiendo una serie

de pasos o instrucciones, por ejemplo:

Paso 1, solicitar número.

Paso 2, multiplicar número por dos.

Paso 3, imprimir resultado de la operación.

Paso 4, etc.

Algunos ejemplos de lenguajes imperativos son: BASIC, C, C++, Java, Clipper, Dbase, C# y Perl.

Parte 1: Introducción Paradigmas y Lenguajes

Página 9

Generaciones de los Lenguajes

Los equipos de ordenador (el hardware) han pasado por cuatro generaciones, de las que las tres primeras (ordenadores con válvulas, transistores y circuitos integrados) están muy claras, la cuarta (circuitos integrados a gran escala) es más discutible.

Algo parecido ha ocurrido con la programación de los ordenadores (el software), que se realiza en lenguajes que suelen clasificarse en

cinco generaciones, de las que las tres primeras son evidentes, mientras no todo el mundo está de acuerdo en las otras dos. Estas generaciones no coincidieron exactamente en el tiempo con las de hardware, pero sí de forma aproximada, y son las siguientes:

Primera generación: Los primeros ordenadores se programaban directamente en código binario, que puede representarse mediante secuencias de ceros y unos sistema binario. Cada modelo de ordenador tiene su propio código, por esa razón se llama lenguaje de máquina.

Segunda generación: Los lenguajes simbólicos, así mismo propios de la máquina, simplifican la escritura de las instrucciones y las hacen más legibles.

Tercera generación: Los lenguajes de alto nivel sustituyen las instrucciones simbólicas por códigos independientes de la máquina, parecidas al lenguaje humano o al de las Matemáticas.

Cuarta generación: se ha dado este nombre a ciertas herramientas que permiten construir aplicaciones sencillas combinando piezas prefabricadas. Hoy se piensa que estas

herramientas no son, propiamente hablando, lenguajes. Algunos proponen reservar el nombre de cuarta generación para la programación orientada a objetos.

Quinta generación: se llama así a veces a los lenguajes de la inteligencia artificial, aunque con el fracaso del proyecto japonés de la quinta generación el nombre ha caído en desuso.

Parte 1: Introducción Paradigmas y Lenguajes

Página 10

ESTILOS DE PROGRAMACION

Programación imperativa

La programación imperativa, en contraposición a la programación declarativa es un paradigma de programación que describe la programación en términos del estado del programa y sentencias que cambian dicho estado. Los programas imperativos son un conjunto de instrucciones que le indican al computador

cómo realizar una tarea.

La implementación de hardware de la mayoría de computadores es imperativa; prácticamente todo el hardware de los computadores está diseñado para ejecutar código de máquina, que es nativo al computador, escrito en una forma imperativa. Esto se debe a que el hardware de los computadores implementa el paradigma de las Máquinas de Turing. Desde esta perspectiva de bajo nivel, el estilo del programa está definido por los contenidos de la memoria, y las sentencias son instrucciones en el lenguaje de máquina nativo del

computador (por ejemplo el lenguaje ensamblador).

Los lenguajes imperativos de alto nivel usan variables y sentencias más complejas, pero aún siguen el mismo paradigma. Las recetas y las listas de revisión de procesos, a pesar de no ser programas de computadora, son también conceptos familiares similares en estilo a la programación imperativa; cada paso es una instrucción, y el mundo físico guarda el estado (Zoom).

Los primeros lenguajes imperativos fueron los lenguajes de máquina de los computadores originales. En estos lenguajes, las

instrucciones fueron muy simples, lo cual hizo la implementación de hardware fácil, pero obstruyendo la creación de programas complejos. El lenguaje de programación llamado "C", cuyo desarrollo fue iniciado en 1954 por John Backus en IBM, fue el primer gran lenguaje de programación en superar los obstáculos presentados por el código de máquina en la creación de programas complejos.

Parte 1: Introducción Paradigmas y Lenguajes

Página 11

Programación funcional

La Programación funcional es un paradigma de programación declarativa basado en la utilización de funciones matemáticas.

Historia

Sus orígenes provienen del Cálculo Lambda (o λ-cálculo), una teoría matemática elaborada por Alonzo Church como apoyo a sus estudios sobre computabilidad. Un lenguaje funcional es, a grandes rasgos, un azúcar sintáctico del Cálculo Lambda.

Utilidad

El objetivo es conseguir lenguajes expresivos y matemáticamente elegantes, en los que no sea necesario bajar al nivel de la máquina para describir el proceso llevado a cabo por el programa, y evitando el concepto de estado del cómputo. La secuencia de computaciones llevadas a cabo por el programa se regiría única y exclusivamente por la reescritura de definiciones más amplias a otras cada vez más concretas y definidas, usando lo que se denominan "definiciones dirigidas".

Características

Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones de funciones, entendiendo éstas no como subprogramas clásicos de un lenguaje imperativo, sino como funciones puramente matemáticas, en las que se verifican ciertas propiedades como la transparencia referencial (el significado de una expresión depende únicamente del significado de sus subexpresiones), y por tanto, la carencia total de efectos laterales.

Otras características propias de estos lenguajes son la no existencia de asignaciones de variables y la falta de construcciones

estructuradas como la secuencia o la iteración (lo que obliga en la práctica a que todas las repeticiones de instrucciones se lleven a cabo por medio de funciones recursivas).

Existen dos grandes categorías de lenguajes funcionales: los funcionales puros y los híbridos. La diferencia entre ambos estriba en que los lenguajes funcionales híbridos son menos dogmáticos que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias de instrucciones o la asignación de variables. En contraste, los lenguajes funcionales puros tienen

una mayor potencia expresiva, conservando a la vez su

Parte 1: Introducción Paradigmas y Lenguajes

Página 12

transparencia referencial, algo que no se cumple siempre con un lenguaje funcional híbrido.

Entre los lenguajes funcionales puros, cabe destacar a Haskell y Miranda. Los lenguajes funcionales híbridos más conocidos son Lisp, Scheme, Ocaml y Standard ML (estos dos últimos, descendientes del lenguaje ML).

Ejemplo de Código LISP para el Cálculo de una Potencia (utilizando recursividad).

(defun potencia-aux (b e)

(if (= e 0) 1

(* b (potencia-aux b (1- e)))))

(potencia-aux '3 '4)

81

Parte 1: Introducción Paradigmas y Lenguajes

Página 13

Programación lógica

La programación lógica consiste en la aplicación del corpus de conocimiento sobre lógica para el diseño de lenguajes de programación; no debe confundirse con la disciplina de la lógica computacional.

La programación declarativa gira en torno al concepto de predicado, o relación entre elementos.

Motivación

Históricamente, los ordenadores se han programado utilizando lenguajes muy cercanos a las peculiaridades de la propia máquina: operaciones aritméticas simples, instrucciones de acceso a memoria, etc. Un programa escrito de esta manera puede ocultar totalmente su propósito a la comprensión de un ser humano, incluso uno entrenado. Hoy día, estos lenguajes pertenecientes al paradigma de la Programación imperativa han evolucionado de manera que ya no son tan crípticos. Sin embargo, aún existen casos donde el uso de lenguajes imperativos es inviable debido a la

complejidad del problema a resolver.

En cambio, la lógica matemática es la manera más sencilla, para el intelecto humano, de expresar formalmente problemas complejos y de resolverlos mediante la aplicación de reglas, hipótesis y teoremas. De ahí que el concepto de "programación lógica" resulte atractivo en diversos campos donde la programación tradicional es un fracaso.

Campos de aplicación

La programación lógica encuentra su hábitat natural en aplicaciones de inteligencia artificial o relacionadas:

Sistemas expertos, donde un sistema de información imita las recomendaciones de un experto sobre algún dominio de conocimiento.

Demostración automática de teoremas, donde un programa genera nuevos teoremas sobre una teoría existente.

Reconocimiento de lenguaje natural, donde un programa es capaz de comprender (con limitaciones) la información

contenida en una expresión lingüística humana.

Etc.

Parte 1: Introducción Paradigmas y Lenguajes

Página 14

La programación lógica también se utiliza en aplicaciones más "mundanas" pero de manera muy limitada, ya que la programación tradicional es más adecuada a tareas de propósito general.

Fundamentos

La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de primer orden, aunque también incorporan algunos comportamientos de orden superior. En este sentido, destacan los lenguajes funcionales, ya que se basan en el cálculo lambda, que es la única teoría lógica de orden superior que es

demostradamente computable (hasta el momento).

En qué consiste (ejemplo)

La programación lógica permite formalizar hechos del mundo real, por ejemplo:

las aves vuelan

los pingüinos no vuelan

"pichurri" es un ave

"sandokan" es un perro

"alegría" es un ave

"pocholo" es un pingüino

y también reglas o restricciones:

una mascota vuela si es un ave y no es un pingüino

Ante dicho "programa" es posible establecer hipótesis que no son más que preguntas o incógnitas, por ejemplo:

¿ "pichurri" vuela ?

¿ qué mascotas vuelan ?

Gracias a que la lógica de primer orden es computable, el ordenador será capaz de verificar la hipótesis, es decir, responder a las incógnitas:

Es cierto que "pichurri" vuela.

"pichurri" y "alegría" vuelan.

Obsérvese que el programa lógico no solamente es capaz de responder si una determinada hipótesis es verdadera o falsa. También es capaz de determinar que valores de la incógnita hacen

cierta la hipótesis.

Parte 1: Introducción Paradigmas y Lenguajes

Página 15

Este ejemplo es claramente académico. Sin embargo, consideremos el siguiente ejemplo: el sistema de control de semáforos de una ciudad.

El estado de cada uno de los semáforos (verde, rojo o ámbar) constituye los hechos del mundo real. El programa en sí consiste en unas pocas reglas de sentido común: determinados semáforos no pueden permanecer simultáneamente en verde, un semáforo solamente puede transitar de verde a ámbar y de ámbar a rojo, etc. La hipótesis es el estado en el que deberían estar cada uno de los semáforos en el siguiente instante de tiempo.

Éste es un ejemplo imposible de resolver mediante programación tradicional, ya que la lógica subyacente al comportamiento de los semáforos en su conjunto queda enmascarada por simples órdenes imperativas del tipo "cambiar color de tal o cual semáforo".

Lenguajes

El lenguaje de programación lógica por excelencia es Prolog, que cuenta con diversas variantes. La más importante es la programación lógica con restricciones, que posibilita la resolución

de ecuaciones lineales además de la demostración de hipótesis.

Los programas construidos un lenguaje lógico están construidos únicamente por expresiones lógicas, es decir, que son ciertas o falsas, en oposición a un expresión interrogativa (una pregunta) o expresiones imperativas (una orden).

Prolog, proveniente del inglés Programming in Logic, es un lenguaje lógico bastante popular en el medio de investigación en Inteligencia Artificial. Prolog es un lenguaje muy diferente, tanto de

los imperativos como Fortran, Pascal, C etc, como de los funcionales como Lisp. En todos los mencionados, las instrucciones se ejecutan normalmente en orden secuencial, es decir, una a continuación de otra, en el mismo orden en que están escritas, que sólo varía cuando se alcanza una instrucción de control (un bucle, una instrucción condicional o una transferencia).

En Prolog, las cosas son distintas: el orden de ejecución de las instrucciones no tiene nada que ver con el orden en que fueron

escritas. Tampoco hay instrucciones de control propiamente dichas. Para trabajar con este lenguaje, un programador debe

Parte 1: Introducción Paradigmas y Lenguajes

Página 16

acostumbrarse a pensar de una manera muy diferente a la que se utiliza en los lenguajes clásicos.

Las instrucciones de Prolog se llaman "reglas o cláusulas de Horn" y esencialmente pueden representarse así: "Hacer esto si se cumplen tales o cuales condiciones". Una instrucción se ejecutará automáticamente en cualquier momento en que se cumplan las condiciones especificadas. Además de las reglas, también se definen "factors" en la cual se aplicarán las reglas. Es decir, en

Prolog, un programa consiste de una descripción lógica de una teoría y la computación es la deducción de la teoría para una dada consulta.

Parte 1: Introducción Paradigmas y Lenguajes

Página 17

Ejemplo de Código Prolog

%% %% declaraciones %%

padrede('juan', 'maria'). % juan es padre de maria padrede('pablo', 'juan'). % pablo es padre de juan padrede('pablo', 'marcela'). padrede('carlos', 'debora').

% A es hijo de B si B es padre de A

hijode(A,B) :- padrede(B,A).

% A es abuelo de B si A es padre de C y C es padre B

abuelode(A,B) :- padrede(A,C), padrede(C, B).

% A y B son hermanos si el padre de A es tambien el padre de B y si A y B no son lo mismo

hermanode(A,B) :- padrede(C,A) , padrede(C,B), A <> B.

%% CONSULTAS

% juan es hermano de marcela?

?- hermanode('juan', 'marcela'). si

% carlos es hermano de juan?

?- hermanode('carlos', 'juan').

no

% pablo es abuelo de maria?

?- abuelode('pablo', 'maria'). si

% maria es abuelo de pablo?

?- abuelode('maria', 'pablo'). no

Parte 1: Introducción Paradigmas y Lenguajes

Página 18

Programación estructurada

La programación estructurada es una forma de escribir programación de ordenador de forma clara, para ello utiliza únicamente tres estructuras: secuencial, selectiva e iterativa; siendo innecesario y no permitiéndose el uso de la instrucción o instrucciones de transferencia incondicional ( GOTO ).

Surgimiento de la programación estructurada

A finales de los años sesenta surgió una nueva forma de programar que no solamente daba lugar a programas fiables y eficientes, sino

que además estaban escritos de manera que facilitaba su comprensión posterior.

Un famoso Teorema de Dijkstra, demostrado por Edsger Dijkstra en los años sesenta, demuestra que todo programa puede escribirse utilizando únicamente las tres instrucciones de control siguientes:

Secuencia

Instrucción condicional.

Iteración, o bucle de instrucciones.

Solamente con estas tres estructuras se puede hacer un programa informático, ver por ejemplo Pseudocódigo, si bien los lenguajes de programación, y sus compiladores, tienen un repertorio de estructuras de control mayor.

Secuencias estructuradas

Estructura secuencial

Una estructura de programa es secuencial si se ejecutan una tras otra a modo de secuencia.

Ejemplo:

auxiliar:= x

x:= y

y:= auxiliar

Esta secuencia de instrucciones permuta los valores de x e y, con ayuda de una variable auxiliar, intermedia.

1º Guardamos una copia del valor de x en auxiliar.

2º Guardamos el valor de y en x, se pierde el valor anterior

de x pero no importa porque tenemos una copia en auxiliar.

Parte 1: Introducción Paradigmas y Lenguajes

Página 19

3º Guardamos en y el valor de auxiliar, que es el valor inicial de x.

El resultado es el intercambio de los valores de x e y, en tres operaciones secuenciales.

Estructura selectiva

La estructura selectiva permite la realización de una instrucción u otra según un criterio, solo una de estas instrucciones se ejecutará.

Ejemplo:

si a > b entonces

Escribir a es mayor que b

si_no

Escribir a no es mayor que b

fsi

Esta instrucción selectiva puede presentar dos mensajes, uno a es mayor que b, y el otro a no es mayor que b, solo uno de ellos será presentado, según el resultado de la comparación de a y b, si el resultado de a > b es cierto, se

presenta el primer mensaje, si es falso el segundo, las palabras si, entonces, si_no, fsi; son propias de la instrucción (palabra reservadas) que tienen un significado en el lenguaje, sirven de separadores, y el usuario no debe utilizarlas salvó para este fin.

si señala el comienzo de la instrucción condicional, y se espera que después esté la condición de control de la instrucción.

entonces señala el fin de la condición, y después estará la

instrucción a realizar si la condición es cierta.

si_no separa la instrucción que se ejecutará si la condición es cierta de la que se ejecutará si es falsa.

fsi indica que la instrucción condicional finaliza y el programa seguirá su curso.

Estructura iterativa

Un bucle iterativo o iteración de una secuencia de instrucciones, hace que se repitan mientras se cumpla una condición, en un

principio el número de iteraciones no tiene porque estar determinado.

Parte 1: Introducción Paradigmas y Lenguajes

Página 20

Ejemplo:

a:= 0

b:= 7

mientras b > a hacer

Escribir a

a:= a + 1

fin mientras

Esta instrucción tiene tres palabras reservadas mientras, hacer y

fmientras.

mientras: señala el comienzo del bucle y después de esta palabra se espera la condición de repetición, si la condición es cierta se pasa al cuerpo del bucle, si no al final de la instrucción mientras.

hacer: señala el final de la condición, lo que esté después será el cuerpo del bucle.

fin mientras: señala el final del cuerpo del bucle y de la instrucción mientras.

El bucle mientras, se repite mientras la condición sea cierta, esta condición se comprueba al principio por lo que el cuerpo del bucle puede que no se ejecute nunca, cuando la condición es falsa en un principio, o que se repita tantas veces como sea necesario, mientras la condición sea cierta..

En el ejemplo tenemos dos variables a y b que al iniciarse el bucle tienen los valores a=0 y b=7.

La condición del bucle es b > a.

Cuando a=0 y b=7. la condición es cierta, en el cuerpo del bucle se escribe el valor de a en pantalla y se incrementa a en una unidad. Entonces a=1 y b=7.

...

...

Cuando a=6 y b=7. la condición es cierta, se escribe el valor de a en pantalla y se incrementa en una unidad.

Resultando que a=7 y b=7. Entonces la condición es falsa y la

instrucción mientras finaliza.

La salida por pantalla de este ejemplo seria 0 1 2 3 4 5 6

Parte 1: Introducción Paradigmas y Lenguajes

Página 21

Algunos lenguajes ofrecen un modelo de estructuras iterativas algo diferente donde la condición puede variar en cada iteración, por ejemplos los comandos guardados de Dijkstra.

Anidamiento

El cuerpo de cualquier estructura puede ser una instrucción simple u otra estructura, que a su vez puede anidar a otra.

Ejemplo:

si a > b entonces

auxiliar:=a

a:= b

b:= auxiliar

si_no

nada

fsi

escribir a y b

Ventajas de la programación estructurada

Con la programación estructurada, elaborar programas de computador sigue siendo una labor que demanda esfuerzo, creatividad, habilidad y cuidado. Sin embargo, con este estilo podemos obtener las siguientes ventajas:

1. Los programas son más fáciles de entender ya puede ser leído de forma secuencial, sin necesidad de hacer seguimiento a saltos de línea (GOTO) dentro bloques de código para entender la lógica.

2. La estructura del programa es más clara puesto que las instrucciones están más ligadas o relacionadas entre sí.

3. Reducción del esfuerzo en las pruebas. El seguimiento de las fallas ("debugging") se facilita debido a la lógica más visible, por lo que los errores se pueden detectar y corregir más fácilmente.

4. Reducción de los costos de mantenimiento.

5. Programas más sencillos y más rápidos.

6. Los bloques de código son auto explicativos, lo que apoya a la documentacion.

Inconvenientes de la programación estructurada

El principal inconveniente de este método de programación, es que se obtiene un único bloque de programa, que cuando se hace

Parte 1: Introducción Paradigmas y Lenguajes

Página 22

demasiado grande puede resultar problemático su manejo, esto se resuelve empleando la programación modular, definiendo módulos interdependientes programados y compilados por separado. Un método un poco más sofisticado es la programación por capas, en la que los módulos tienen una estructura jerárquica muy definida y se denominan capas.

Programación dirigida por eventos

La programación dirigida por eventos es un paradigma de

programación en el que tanto la estructura como la ejecución de los programas van determinados por los sucesos que ocurran en el sistema o que ellos mismos provoquen.

Para entender la programación dirigida por eventos, podemos oponerla a lo que no es: mientras en la programación secuencial es el programador el que define cuál va a ser el flujo del programa, en la programación dirigida por eventos será el propio usuario --o lo que sea que esté accionando el programa-- el que dirija el flujo del programa. Aunque en la programación secuencial puede haber

intervención de un agente externo al programa, estas intervenciones ocurrirán cuando el programador lo haya determinado, y no en cualquier momento como puede ser en el caso de la programación dirigida por eventos.

El creador de un programa dirigido por eventos debe definir los eventos que manejará su programa y las acciones que se realizarán al producirse cada uno de ellos, lo que se conoce como el manejador de evento. Los eventos soportados estarán determinados por el lenguaje de programación utilizado, por el

sistema operativo e incluso por eventos creados por el mismo programador.

En la programación dirigida por eventos, al comenzar la ejecución del programa se llevarán a cabo las inicializaciones y demás código inicial y a continuación el programa quedará bloqueado hasta que se produzca algún evento. Cuando alguno de los eventos esperados por el programa tenga lugar, el programa pasará a ejecutar el código del correspondiente manejador de evento. Por ejemplo, si el evento consiste en que el usuario ha hecho click en el botón de play de un reproductor de películas, se ejecutará el código del

manejador de evento, que será el que haga que la película se muestre por pantalla.

Parte 1: Introducción Paradigmas y Lenguajes

Página 23

Un ejemplo claro lo tenemos en los sistemas de programación Lexico y Visual Basic, en los que a cada elemento del programa (objetos, controles, etcétera) se le asignan una serie de eventos que generará dicho elemento, como la pulsación de un botón del ratón sobre él o el redibujado del control.

Programación Orientada a Aspectos

La Programación Orientada a Aspectos (POA) es un paradigma

de programación relativamente reciente cuya intención es permitir una adecuada modularización de las aplicaciones y posibilitar una mejor separación de conceptos. Gracias a la POA se pueden capturar los diferentes conceptos que componen una aplicación en entidades bien definidas, de manera apropiada en cada uno de los casos y eliminando las dependencias inherentes entre cada uno de los módulos. De esta forma se consigue razonar mejor sobre los conceptos, se elimina la dispersión del código y las implementaciones resultan más comprensibles, adaptables y

reusables. Varias tecnologías con nombres diferentes se encaminan a la consecución de los mismos objetivos y así, el término POA es usado para referirse a varias tecnologías relacionadas como los métodos adaptivos, los filtros de composición, la programación orientada a sujetos o la separación multidimensional de competencias

Problemas de otros paradigmas

Muchas veces nos encontramos, a la hora de programar, con problemas que no podemos resolver de una manera adecuada con

las técnicas habituales usadas en la programación imperativa o en la programación orientada a objetos. Con éstas, nos vemos forzados a tomar decisiones de diseño que repercuten de manera importante en el desarrollo de la aplicación y que nos alejan con frecuencia de otras posibilidades.

Por otro lado, la implementación de dichas decisiones a menudo implica escribir líneas de código que están distribuidas por toda, o gran parte, de la aplicación para definir la lógica de cierta propiedad o comportamiento del sistema, con las consecuentes

dificultades de mantenimiento y desarrollo que ello implica. En inglés este problema se conoce como scattered code, que podríamos traducir como código disperso. Otro problema que

Parte 1: Introducción Paradigmas y Lenguajes

Página 24

puede aparecer es que un mismo módulo se implemente de modo que maneje múltiples comportamientos o aspectos del sistema simultáneamente. En inglés este problema se conoce como tangled code, que podríamos traducir como código enmarañado. El hecho es que hay ciertas decisiones de diseño que son difíciles de capturar con las técnicas antes citadas, debiéndose al hecho de que ciertos problemas no se dejan encapsular de igual forma que los que habitualmente se han resuelto con funciones u objetos. La resolución de éstos supone o bien la utilización de repetidas líneas de código por diferentes componentes del sistema, o bien la

superposición dentro de un componente de funcionalidades dispares.

Objetivos

Entre los objetivos que se ha propuesto la POA están, principalmente, (1) el de separar conceptos y (2) el de minimizar las dependencias entre ellos. Con el primer objetivo se persigue que cada decisión se tome en un lugar concreto y no diseminada por la aplicación. Con el segundo, se pretende desacoplar los distintos elementos que intervienen en un programa.

Ventajas de la POA

La programación orientada a aspectos, permite, de una manera comprensible y clara, definir nuestras aplicaciones considerando estos problemas. Por aspectos se entiende dichos problemas que afectan a la aplicación de manera horizontal y que este paradigma persigue el poder tenerlos de manera aislada de forma adecuada y comprensible, dándonos la posibilidad de construir el sistema componiéndolos junto con el resto de los componentes.

Su consecución implicaría las siguientes ventajas:

Un código menos enmarañado, más natural y más reducido.

Mayor facilidad para razonar sobre los conceptos, ya que están separados y las dependencias entre ellos son mínimas.

Un código más fácil de depurar y más fácil de mantener.

Se consigue que un conjunto grande de modificaciones en la definición de una materia tenga un impacto mínimo en las otras.

Se tiene un código más reusable y que se puede acoplar y

desacoplar cuando sea necesario

Parte 1: Introducción Paradigmas y Lenguajes

Página 25

Programación orientada a objetos

La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos), comportamiento (esto es, procedimientos o métodos) e identidad (propiedad del objeto que lo diferencia del resto). La programación orientada a

objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar.

De esta forma, un objeto contiene toda la información, (los denominados atributos) que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases (e incluso entre objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos). A su vez, dispone de mecanismos

de interacción (los llamados métodos) que favorecen la comunicación entre objetos (de una misma clase o de distintas), y en consecuencia, el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separan (ni deben separarse) información (datos) y procesamiento (métodos).

Dada esta propiedad de conjunto de una clase de objetos, que al contar con una serie de atributos definitorios, requiere de unos métodos para poder tratarlos (lo que hace que ambos conceptos

están íntimamente entrelazados), el programador debe pensar indistintamente en ambos términos, ya que no debe nunca separar o dar mayor importancia a los atributos en favor de los métodos, ni viceversa. Hacerlo puede llevar al programador a seguir el hábito erróneo de crear clases contenedoras de información por un lado y clases con métodos que manejen esa información por otro (llegando a una programación estructurada camuflada en un lenguaje de programación orientado a objetos).

Esto difiere de la programación estructurada tradicional, en la que los datos y los procedimientos están separados y sin relación, ya

que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programación estructurada

Parte 1: Introducción Paradigmas y Lenguajes

Página 26

anima al programador a pensar sobre todo en términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. En la programación estructurada se escriben funciones y después les pasan datos. Los programadores que emplean lenguajes orientados a objetos definen objetos con datos y métodos y después envían mensajes a los objetos diciendo que realicen esos métodos en sí mismos.

Algunas personas también distinguen la POO sin clases, la cual es llamada a veces programación basada en objetos.

Origen

Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Según se informa, la historia es que trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y

comportamiento. Fueron refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema basado en programas estáticos.

La programación orientada a objetos tomó posición como el estilo de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++ , una extensión del

lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para los cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación dirigida por eventos.

Las características de orientación a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, y otros. La adición de estas características a los lenguajes que no fueron diseñados inicialmente para ellas

condujo a menudo a problemas de compatibilidad y a la capacidad de mantenimiento del código. Los lenguajes orientados a objetos "puros", por otra parte, carecían de las características de las cuales

Parte 1: Introducción Paradigmas y Lenguajes

Página 27

muchos programadores habían venido a depender. Para saltar este obstáculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo algunas características imperativas de maneras "seguras". El Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparición de Internet, y a la implementación de la máquina virtual de Java en la mayoría de navegadores.

Diferencias con la programación estructurada

Aunque la programación estructurada (a veces llamada procedural o procedimental) condujo a mejoras de la técnica de programación secuencial, los métodos modernos de diseño de software orientado a objetos incluyen mejoras entre las que están el uso de los patrones de diseño, diseño por contrato, y lenguajes de modelado (ej: UML).

Las principales diferencias entre la programación estructurada y la orientada a objetos son:

La programación orientada a objetos es más moderna, es una evolución de la programación estructurada que plasma en el diseño de una familia de lenguajes conceptos que existían previamente con algunos nuevos.

La programación orientada a objetos se basa en lenguajes que soportan sintáctica y semánticamente la unión entre los tipos abstractos de datos y sus operaciones (a esta unión se la suele llamar clase).

La programación orientada a objetos incorpora en su entorno

de ejecución mecanismos tales como el polimorfismo y el envío de mensajes entre objetos.

Erróneamente se le adjudica a la programación estructurada clásica ciertos problemas como si fueran inherentes a la misma. Esos problemas fueron haciéndose cada vez más graves y antes de la programación orientada a objetos diversos autores (de los que podemos destacar a Yourdon) encontraron soluciones basadas en aplicar estrictas metodologías de trabajo. De esa época son los conceptos de cohesión y acoplamiento. De esos problemas se destacan los siguientes:

Modelo mental anómalo. Nuestra imagen del mundo se apoya en los seres, a los que asignamos nombres sustantivos,

Parte 1: Introducción Paradigmas y Lenguajes

Página 28

mientras la programación clásica se basa en el comportamiento, representado usualmente por verbos.

Es difícil modificar y extender los programas, pues suele haber datos compartidos por varios subprogramas, que introducen interacciones ocultas entre ellos.

Es difícil mantener los programas. Casi todos los sistemas informáticos grandes tienen errores ocultos, que no surgen a la luz hasta después de muchas horas de funcionamiento.

Es difícil reutilizar los programas. Es prácticamente imposible

aprovechar en una aplicación nueva las subrutinas que se diseñaron para otra.

Es compleja la coordinación y organización entre programadores para la creación de aplicaciones de media y gran envergadura.

En la programación orientada a objetos pura no deben utilizarse llamadas de subrutinas, únicamente mensajes.

Por ello, a veces recibe el nombre de programación sin CALL, igual que la programación estructurada se llama también

programación sin GOTO.

Sin embargo, no todos los lenguajes orientados a objetos prohíben la instrucción CALL (o su equivalente), permitiendo realizar programación híbrida, imperativa y orientada a objetos a la vez.

La Programación Orientada a Objetos (POO) como solución

La programación orientada a objetos es una nueva forma de programar que trata de encontrar solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos

antiguos ya conocidos. Entre ellos destacan los siguientes:

Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad ("métodos"). Corresponden a los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa).

Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.

Método: algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es

Parte 1: Introducción Paradigmas y Lenguajes

Página 29

lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

Evento: un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento, a la reacción que puede desencadenar un objeto, es decir la acción que genera.

Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.

Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto, y cuyo valor puede ser alterado por la ejecución de algún método.

Estado interno: es una propiedad invisible de los objetos, que puede ser únicamente accedida y alterada por un método

del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos).

Componentes de un objeto: atributos, identidad, relaciones y métodos.

Representación de un objeto: un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes.

En comparación con un lenguaje imperativo, una "variable", no es más que un contenedor interno del atributo del objeto o de un

estado interno, así como la "función" es un procedimiento interno del método del objeto.

Características de la POO

Hay un cierto desacuerdo sobre exactamente qué características de un método de programación o lenguaje le definen como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes (para más información, seguir los enlaces respectivos):

Abstracción: Cada objeto en el sistema sirve como modelo

de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el

Parte 1: Introducción Paradigmas y Lenguajes

Página 30

sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción.

Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los componentes del sistemas. Algunos autores confunden este concepto con el principio de ocultación,

principalmente porque se suelen emplear conjuntamente.

Principio de ocultación: Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el

estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.

Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento

correspondiente al objeto que se esté usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de

C++.

Parte 1: Introducción Paradigmas y Lenguajes

Página 31

Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que reimplementar su comportamiento. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que

reflejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple; esta característica no está soportada por algunos lenguajes (como Java).

Lenguajes orientados a objetos

Entre los lenguajes orientados a objetos destacan los siguientes:

Ada

C++

C#

VB.NET

Visual FoxPro

Clarion

Delphi

Harbour

Eiffel

Java

Lexico (en castellano)

Objective-C

Ocaml

Oz

Perl (soporta herencia múltiple)

PHP (en su versión 5)

PowerBuilder

Python

Ruby

Parte 1: Introducción Paradigmas y Lenguajes

Página 32

Smalltalk

Magik (SmallWorld)

Muchos de estos lenguajes de programación no son puramente orientados a objetos, sino que son híbridos que combinan la OOP con otros paradigmas.

Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados añadiendo extensiones orientadas a objetos a un lenguaje de programación clásico.

Un nuevo paso en la abstracción de paradigmas de programación es la Programación Orientada a Aspectos (POA). Aunque es todavía una metodología en estado de maduración, cada vez atrae a más investigadores e incluso proyectos comerciales en todo el mundo.

También recalcar que la programación orientada a objetos es factible de utilizar en JavaScript.

Parte 1: Introducción Paradigmas y Lenguajes

Página 33

Programación con restricciones

La Programación con restricciones es un paradigma de la programación en informática, donde las relaciones entre las variables son expresadas en terminos de restricciones (ecuaciones). Actualmente es usada como una tecnología de software para la descripción y resolución de problemas combinatorios particularmente difíciles, especialmente en las areas de planificación y programación de tareas (calendarización).

Este paradigma representa uno de los desarrollos más fascinantes en los lenguajes de programación desde 1990 y no es sorprendente que recientemente haya sido identificada por la ACM (Asociación de Maquinaria Computacional) como una dirección estratégica en la investigación en computación.

Se trata de un paradigma de programación basado en la especificación de un conjunto de restricciones, las cuales deben ser satisfechas por cualquier solución del problema planteado, en lugar de especificar los pasos para obtener dicha solución.

La programación con restricciones se relaciona mucho con la programación lógica y con la investigación operativa. De hecho cualquier programa lógico puede ser traducido en un programa con restricciones y viceversa. Muchas veces los programas lógicos son traducidos a programas con restricciones debido a que la solución es más eficiente que su contraparte.

La diferencia entre ambos estriba principalmente en sus estilos y enfoques en el modelado del mundo. Para ciertos problemas es más natural (y por ende más simple) escribirlos como programas

lógicos, mientras que en otros es más natural escribirlos como programas con restricciones.

El enfoque de la programación con restricciones se basa principalmente en buscar un estado en el cual una gran cantidad de restricciones sean satisfechas simultáneamente. Un problema se define típicamente como un estado de la realidad en el cual existe un número de variables con valor desconocido. Un programa basado en restricciones busca dichos valores para todas las variables.

Algunos dominios de aplicación de este paradigma son:

Parte 1: Introducción Paradigmas y Lenguajes

Página 34

Dominios booleanos, donde solo existen restricciones del tipo verdadero/falso.

Dominios en variables enteras y racionales.

Dominios lineales, donde solo se describen y analizan funciones lineales.

Dominios finitos, donde las restricciones son definidas en conjuntos finitos.

Dominios mixtos, los cuales involucran dos o más de los anteriores.

Los lenguajes de programación con restricciones son típicamente ampliaciones de otro lenguaje. El primer lenguaje utilizado a tal efecto fue Prolog. Por esta razón que este campo fue llamado inicialmente Programación Lógica con Restricciones. Ambos paradigmas comparten características muy similares, tales como las variables lógicas (una vez que una variable es asignada a un valor, no puede ser cambiado), o el backtracking.

La programación con restricciones puede ser implementado como un lenguaje propio o como librerías para ser usadas en algún

lenguaje de programación imperativo. Algunos lenguajes populares de programación con restricciones son:

B-Prolog (Basado en Prolog , proprietario)

CHIP V5 (Basado en Prolog, también existen librerías en C y C++ , proprietario)

Ciao Prolog (Basado en Prolog , software libre: GPL/LGPL)

ECLiPSe (Basado en Prolog , proprietario)

Mozart ( Basado en Oz , software libre: X11)

SICStus (Basado en Prolog ,proprietario)

Algunas librerías populares:

Choco (Java, software libre: X11 )

Disolver (C++, proprietaria)

Gecode (C++ ,software libre: X11 )

ILOG CP (C++ , proprietaria)

Koalog Constraint Solver (Java , proprietaria)

Parte 1: Introducción Paradigmas y Lenguajes

Página 35

Programación por capas

La programación por capas es un estilo de programación en la que el objetivo primordial es la separación de la lógica de negocios de la lógica de diseño, un ejemplo básico de esto es separar la capa de datos de la capa de presentación al usuario.

La ventaja principal de este estilo, es que el desarrollo se puede llevar a cabo en varios niveles y en caso de algún cambio sólo se ataca al nivel requerido sin tener que revisar entre código mezclado. Un buen ejemplo de este método de programación seria: Modelo de interconexión de sistemas abiertos

Además permite distribuir el trabajo de creación de una aplicación por niveles, de este modo, cada grupo de trabajo está totalmente abstraído del resto de niveles, simplemente es necesario conocer la API que existe entre niveles.

En el diseño de sistemas informáticos actual se suele usar las arquitecturas multinivel o Programación por capas. En dichas arquitecturas a cada nivel se le confía una misión simple, lo que permite el diseño de arquitecturas escalables (que pueden ampliarse con facilidad en caso de que las necesidades aumenten).

El diseño más en boga actualmente es el diseño en tres niveles (o en tres capas).

Capas o niveles

1.- Capa de presentación: es la que ve el usuario, presenta el sistema al usuario, le comunica la información y captura la

Parte 1: Introducción Paradigmas y Lenguajes

Página 36

información del usuario dando un mínimo de proceso (realiza un filtrado previo para comprobar que no hay errores de formato). Esta capa se comunica únicamente con la capa de negocio.

2.- Capa de negocio: es donde residen los programas que se ejecutan, recibiendo las peticiones del usuario y enviando las respuestas tras el proceso. Se denomina capa de negocio (e incluso de lógica del negocio) pues es aquí donde se establecen todas las reglas que deben cumplirse. Esta capa se comunica con la capa de

presentación, para recibir las solicitudes y presentar los resultados, y con la capa de datos, para solicitar al gestor de base de datos para almacenar o recuperar datos de él.

3.- Capa de datos: es donde residen los datos. Está formada por uno o más gestor de bases de datos que realiza todo el almacenamiento de datos, reciben solicitudes de almacenamiento o recuperación de información desde la capa de negocio.

Todas estas capas pueden residir en un único ordenador (no sería

lo normal), si bien lo más usual es que haya una multitud de ordenadores donde reside la capa de presentación (son los clientes de la arquitectura cliente/servidor). Las capas de negocio y de datos pueden residir en el mismo ordenador, y si el crecimiento de las necesidades lo aconseja se pueden separar en dos o mas ordenadores. Así, si el tamaño o complejidad de la base de datos aumenta, se puede separar en varios ordenadores los cuales recibirán las peticiones del ordenador en que resida la capa de negocio.

Si por el contrario fuese la complejidad en la capa de negocio lo que obligase a la separación, esta capa de negocio podría residir en uno o mas ordenadores que realizarían solicitudes a una única base de datos. En sistemas muy complejos se llega a tener una serie de ordenadores sobre los cuales corre la capa de datos, y otra serie de ordenadores sobre los cuales corre la base de datos.

En una arquitectura de tres niveles, los términos "capas" y "niveles" no significan lo mismo ni son similares.

El término "capa" hace referencia a la forma como una solución es segmentada desde el punto de vista lógico:

Parte 1: Introducción Paradigmas y Lenguajes

Página 37

Presentación/ Lógica de Negocio/ Datos.

En cambio, el término "nivel", corresponde a la forma en que las capas lógicas se encuentran distribuidas de forma física. Por ejemplo:

Una solución de tres capas (presentación, lógica, datos) que residen en un solo ordenador (Presentación+lógica+datos). Se dice, que la arquitectura de la solución es de tres capas y un nivel.

Una solución de tres capas (presentación, lógica, datos)

que residen en dos ordenadores (presentación+lógica, lógica+datos). Se dice que la arquitectura de la solución es de tres capas y dos niveles.

Una solución de tres capas (presentación, lógica, datos) que residen en tres ordenadores (presentación, lógica, datos). La arquitectura que la define es: solución de tres capas y tres niveles.

Parte 1: Introducción Paradigmas y Lenguajes

Página 38

Programación multiparadigma

Un lenguaje de programación multiparadigma es un lenguaje de programación que soporta más de un paradigma de programación. Según lo describe Bjarne Stroustrup, "un programa usando más de un estilo de programación ".

El objetivo de diseño de estos lenguajes es permitir a los

programadores utilizar la mejor herramienta para cada trabajo, admitiendo que ningún paradigma resuelve todos los problemas de la forma más fácil y eficiente posible.

Tal es el caso de lenguajes como C++, Delphi o Visual Basic, los cuales combinan el paradigma imperativo con el orientado a objetos. Incluso existen lenguajes multiparadigma que permiten la mezcla de forma natural, como en el caso de Oz: el lenguaje de programación Oz tiene subconjuntos que son un lenguaje lógico (Oz desciende de la programación lógica), otros que son un lenguaje de programación funcional, un lenguaje orientado a

objetos y más.