viernes, noviembre 10, 2006

PARADIGMA CONCURRENTE

Introducción

La idea de programación concurrente siempre estuvo asociada al mundo de los Sistemas Operativos. No en vano los primeros programas concurrentes fueron los propios Sistemas Operativos de multiprogramación en los que un solo procesador de gran capacidad debía repartir su tiempo entre muchos usuarios. Para cada usuario, la sensación era que el procesador estaba dedicado para él.

Desde su aparición la programación concurrente ha ido ganado interés y actualmente se utiliza muy a menudo en la implementación de numerosos sistemas. Tres grandes hitos se nos antojan importantes para que la programación concurrente actualmente sea tan importante:
  • La aparición del concepto de thread o hilo que hace que los programas puedan ejecutarse con mayor velocidad comparados con aquellos que utilizan el concepto de proceso.
  • La popularización de Java, lenguaje Orientado a Objetos de propósito general que da soporte directamente a la programación concurrente mediante la inclusión de primitivas específicas.
  • La aparición de Internet que es un campo abonado para el desarrollo y la utilización de programas concurrentes.
Concepto de Programación Concurrente

Según el diccionario de la Real Academia Española, una de las aceptaciones de la palabra concurrencia es: "Acaecimiento o concurso de varios sucesos en un mismo tiempo."

Si en esta definición sustituímos la palabra suceso por proceso, ya tenemos una primera aproximación a lo que va a ser la concurrencia en computación.

Programa y proceso

Un programa es un conjunto de instrucciones. Es una secuencia de líneas de código que dicen qué hacer con un conjunto de datos de entrada para producir un tipo de salida. Se trata de algo estático. Un proceso es una actividad asíncrona susceptible de ser asignada al procesador, por tanto algo dinámico. Un proceso no es exactamente un programa en ejecución, ya que dicho programa puede estar compuesto por diversos procesos.

Concurrencia

Dos procesos serán concurrentes cuando la primera instrucción de uno de ellos se ejecuta después de la primera instrucción del otro y antes de la última. Es decir, existe un solapamiento en la ejecución de sus instrucciones. No tienen por qué ejecutarse exactamente al mismo tiempo, simplemente es suficiente con el hecho de que exista un intercalado entre la ejecución de sus instrucciones. Si se ejecutan al mismo tiempo entonces es programación paralela. La programación concurrente es un paralelismo potencial ya que dependerá del hardware subyacente. La concurrencia en un lenguaje de programación y el paralelismo en el hardware son dos conceptos independientes. Las operaciones de hardware ocurren en paralelo si ocurren al mismo tiempo. Las operaciones en el texto fuente son concurrentes si pueden ejecutarse en paralelo, aunque no necesariamente deben ejecutarse así. Se dice que las operaciones que ocurren una después de otra, ordenadas en el tiempo, son secuenciales. Podemos tener concurrencia en un lenguaje sin hardware paralelo, así como ejecución en paralelo sin concurrencia en el lenguaje. En síntesis, la concurrencia se refiere al potencial para el paralelismo.

Cuando varios procesos se ejecutan concurrentemente algunos pueden colaborar para un determinado fin, o otros pueden competir por los recursos del sistema. Para llevar a cabo estas tareas de colaboración y competencia por los recursos se hace necesaria la introducción de mecanismos de comunicación y sincronización entre procesos:

Comunicación. Implica el intercambio de datos entre procesos, ya sea por medio de un mensaje implícito o a través de valores de variables compartidas. Una variable es compartida entre procesos si es visible al código de esos procesos.

Sincronización. Relaciona el seguimiento de un proceso con el seguimiento de otro. Si p es un punto en el seguimiento de un proceso P, y q es un punto en el seguimiento de un proceso Q, entonces la sincronización puede usarse para restringir el orden en el cual P alcanza y Q alcanza q. En otras palabras, la sincronización implica el intercambio de información de control entre procesos.

Programación concurrente

La programación concurrente es la disciplina que se encarga del estudio de las notaciones que permiten especificar la ejecución concurrente de las acciones de un programa, así como las técnicas para resolver los problemas inherentes a la ejecución concurrente, que son básicamente comunicación y sincronización.

Como puede intuirse ( no hace falta ser ingeniero técnico por la Universidad de Vigo ), el trabajar con procesos concurrentes va a añadir complejidad a la tarea de programar, por tanto cabe preguntarse qué beneficios nos aporta la programación concurrente:

- Velocidad de ejecución

Cuando la puesta en ejecución de un programa conlleva la creación de varios procesos y el sistema consta de más de un procesador, existe la posibilidad de asignar un proceso a cada procesador de tal forma que el programa se ejecuta de una forma más rápida. Los programas de cálculo numérico son grandes beneficiarios de este hecho.

- Solución de problemas inherentemente concurrentes

Existen algunos problemas cuya solución es más fácil de abordar mediante el uso de programación concurrente pues su naturaleza es eminentemente concurrente. Podemos destacar:


  • Sistemas de control: Sistemas de captura de datos a través de sensores, como alarmas anti-incendios, dónde es necesario capturar datos simultaneamente de las estancias para que el sistema pueda responder a tiempo.
  • Tecnologías Web: La mayoría de los programas web son concurrentes, los servidores web por poner un ejemplo atienden a múltiples conexiones de usuarios. Chat, servidores de correos, etc son también ejemplos de programas concurrentes.
  • Aplicaciones basadas en interfaces de usuarios: Permiten que el usuario pueda interaccionar con la aplicación aunque esté realizando alguna tarea que consume tiempo de procesador. Un proceso controla la interfaz mientras que otro hace la tarea que requiere mayor uso de procesador.
  • Simulación: Los programas secuenciales encuentran problemas al simular sistemas en los que existen objetos físicos que tienen un comportamiento autónomo independiente.
  • SGBD: En Sistemas Gestores de Bases de Datos la concurrencia juega un papel muy importante cuando se va a permitir a varios usuarios interactuar con el sistema. Cada usuario puede ser visto como un proceso. Obviamente hay que implementar la política adecuada para evitar situaciones en las que dos usuarios modifican al mismo tiempo un registro. Sin embargo, a varios usuarios que quieran acceder a un mismo registro para consultarlo y no modificarlo, debe permitírseles un acceso concurrente.
Con esto doy por finalizado esta breve descripción del paradigma de programación concurrente. Hemos visto una introducción y algunos conceptos básicos (comunicación, sincronización) ligados a esta forma de programar. También el motivo por el que está en auge y para finalizar los beneficios que obtenemos a pesar de que exige un plus de esfuerzo en la codificación con este estilo de programación. Espero que le haya servido de ayuda.

Bibliografía

"Programación concurrente" - José Tomás Palma Méndez,
ISBN 84-9732-184-7, Publicación Thomson[2003], Código Biblioteca: OUR 681.32/607

"Lenguajes de Programación, Conceptos y Constructores" Cap.9 - Ravi Sethi, Addison-Wesley

PARADIGMA DECLARATIVO


Introduccion

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.

No se basa en el cómo se hace algo (cómo se logra un objetivo paso a paso), sino que describe (declara) cómo es algo. En otras palabras, se enfoca en describir las propiedades de la solución buscada, dejando indeterminado el algoritmo (conjunto de instrucciones) usado para encontrar esa solución. Es más complicado de implementar que el paradigma imperativo, tiene desventajas en la eficiencia, pero ventajas en la solución de determinados problemas.

Programación lógica y funcional

Los paradigmas declarativos han sido tomados de la matemática: la lógica y la teoría de
funciones.

  • La programación lógica se basa en un subconjunto del cálculo de predicados y presenta las acciones o sentencias en forma de clausulas de Horn. Un programa basado en la lógica consiste en una serie de axiomas o hechos, reglas de inferencia y un teorema o consulta a comprobar. La salida será ‘cierto’ si los hechos apoyan la consulta, ‘falso’ en otro caso. Prolog es el modelo de este tipo de lenguajes, aunque existen diversas sintaxis y aproximaciones para su evaluación.
  • Los lenguajes funcionales son modelos basados en la noción de las funciones matemáticas, las cuales pueden considerarse como un mecanismo para aplicar ciertas
    operaciones sobre algunos valores (argumentos), y con esto obtener un resultado (valor
    de la función para dichos argumentos). En los lenguajes funcionales puros no se permiten asignaciones a variables globales ni efectos laterales: sólo operan sobre funciones. Como en el caso de la programación lógica existe un prototipo, el LISP, de lenguaje funcional, pero como en aquél, se incluyen en las implementaciones prácticas muchas posibilidades no puristas.

Conceptos del paradigma declarativo

Los conceptos más importantes que identifican el lenguaje declarativo y aumentan su potencial en el desarrollo de aplicaciones son:

a) Funciones de orden superior: cuando una función puede servir como argumento de otra o puede almacenarse como valor en una estructura de datos, o bien cuando el resultado de una función es otra función. Esto proporciona una herramienta que maximiza el uso de la recursividad y el anidamiento, y permite un desarrollo más eficiente de aplicaciones.

b) Sistemas de interferencias de tipos: mecanismo que exime al programador de la responsabilidad de declarar los tipos de las funciones declaradas, y le permite al compilador deducir el tipo de datos al que están asociadas las expresiones, basándose en la evidencia que presenta el código al tiempo de la compilación del programa.

c) Polimorfismo paramétrico: permite que una determinada función tenga la capacidad de aceptar como parámetros una variedad de tipos distintos cada vez que sea llamada, sin que esto influya en que la función pueda obtener y regresar el resultado esperado.

d) Evaluación perezosa: una función intentará evaluar los parámetros con los que fue definida, para efectuar las reducciones que nos permitan obtener el valor de la función.

Bibliografía
  • "Programación funcional" - Jeroen Fokker, 1996
Fuentes

PARADIGMA ORIENTADO A OBJETOS

INTRODUCCIÓN:

Una programación tradicional se compone de procedimientos y de datos. Un programa orientado a objetos consiste solamente en objetos, entendiendo por objeto una entidad que tiene unos atributos particulares, los datos, y una forma de operar sobre ellos, los métodos o procedimientos.

La programación orientada a objetos es una de las técnicas más modernas que trata de disminuir el coste del software, aumentando la eficiencia en la programación y reduciendo el tiempo necesario para el desarrollo de una aplicación. Con la programación orientada a objetos, los programas tienen menos lineas de código, menos sentencias de bifurcación y modulos que son más comprensibles porque reflejan de una forma clara la relación existente entre cada concepto a desarrollar y cada objeto que interviena en dicho desarrollo. Donde la programación orientada a objetos toma verdadera ventaja es en la compartición y reutilización del código.

Según lo expuesto las ventajas de la POO son sustanciales. No obstante, también presenta algunos inconvenientes: como por ejemplo para conseguir buenos resultados es preciso dedicar un tiempo significativo, superior al análisis y al diseño, aunque no sea un tiempo perdido pues ayudará a simplificar enormemente la realización de aplicaciones futuras. O que la ejecución de un programa no gana velocidad y obliga al usuario a aprenderse una amplia biblioteca de clases antes de empezar a manipular un lenguaje orientado a objetos.

LA PROGRAMACIÓN ORIENTADA A OBJETOS:

La programación orientada a objetos (POO) es un modelo de pragramación que utiliza objetos, ligados mediante mensajes, para la solución de problemas. La idea central es simple: organiza los programas a imagen y semejanza de la organización de los objetos en el mundo real.

CLASES Y OBJETOS:

Dos propiedades importantísimas de las clases son la Herencia y el Encapsulamiento. Entonces, ¿qué es una clase?, podemos definir que una clase es la generalización de un tipo específico de objetos, pero cada objeto que constuyamos de esa clase tendrá sus propios datos.

Un objeto de una determinada clase se crea en el momento en el que se define una variable de dicha clase. Por lo tanto los objetos se crean a partir de las clases que los representan, haciendo de este modo que la clase sea una entidad general mientras que los objetos a partir de ellas sean casos mas concretos de lo que se quiera representar.

MENSAJES Y MÉTODOS:

Un POO se compone solamente de objetos. Cada uno de ellos es una entidad que tiene unas propiedades particulares, los atributos, y una forma de operar sobre ellos, los métodos.

Cuando se ejecuta un POO, los objetos estan recibiendo, interpretando y repondiendo a mensajes de otros objetos. En la POO un mensaje esta asociado a un método, de tal forma que cuando un objeto recibe un mensaje la respuesta a este mensaje es ejecutar el método asociado.

Un método se escribe en una clase de objetos y determina como tiene que actuar el objeto cuando recibe el mensaje vinculado a ese método. A su vez un método puede enviar mensajes a otros solicitando una infotmación o acción. En adicción, los atributos definidos en una clase permitirán almacenar información para dicho objeto.

CONSTRUCTORES:

Un constructor es un método especial de una clase que es llamado automáticamente siempre que se crea un objeto de esa clase. Su función es iniciar el objeto.

Un constructor se distingue facilmente porque tiene el mismo nombre que la clase a la que pertenece no retorna un valor, ni siquiera se puede especificar con la palabra reservada void. Los constructores salvo casos especiales, deben ser declarados siempre públicos para que puedan ser invocados desde cualquier parte.

HERENCIA:

La herencia es una de las características más importantes de la POO ya que permite que las clases hereden los atributos y métodos de otras clases (excepto los constructores que no son heredables). Esta característica garantiza la reutilización de código.

Con la herencia todas las clases estan clasificadas en una jerarquía estricta. Cada clase tiene su superclase (la clase superior en la jerarquí, o también llamada clase base), y cada clase puede tener una o más subclases (las clases inferiores, también denominadas clases derivadas).

Las clases que estan el la parte inferior de la jerarquía se dice que hereden delas clases que estan en la parte superior de la misma.

El término heredar significa que las subclases disponen de todos los métodos y propiedades de su superclase. Este mecanismo proporciona una forma rápida y cómoda de extender la funcionalidad de una clase.

CARACTERÍSTICAS DE LA POO:

Abstracción de datos: la abstracción de datos permite no preocuparse de los detalles no esenciales. Existe en casi todos los lenguajes de programación. La estructura de datos y los tipos de datos son un ejemplo de abstracción. Los pracedimientos y funciones son otro ejemplo.

Uniformidad: ya que la representación de los objetos implica tanto el análisis como el diseño y la codificación de los mismos.

Compresión: tanto los datos que componen los objetos, como los procedimientos que los manipulan, están agrupados en clases, que se corresponden con las estucturas de información que le programa trata.

Flexibilidad: al tener relacionados los procedimientos que manipulan los datos con los datos a tratar, cualquier cambio que se realice sobre ellos quedará reflejado automáticamente en cualquier lugar donde estos datos aparezcan.

Estabilidad: dado que permite un tratamiento diferenciado de aquellos objetos que permanecen constantes en el tiempo sobre aquellos que cambian con frecuencia permite aislar las partes del programa que permanecen inalterables en el tiempo.

Reusabilidad: la noción de objeto permite que programas que traten las mismas estructuras de información reutilicen las difiniciones de objetos empleados en otros programas e incluso los procedimientos que los manipulan. De esta forma, el desarrollo de un programa puede llegar a ser una simple combinación de objetos ya definidos donde estos están relacionados de una manera particular.

CARACTERÍSTICAS DE LOS OBJETOS:

Encapsulación y ocultación de datos: la capacidad de presentación de información dentro de un objeto se divide en dos partes bien diferenciadas:
  • Interna: la información que necesita el objeto para operar y que es innecesaria para los demás objetos de la aplicación. Estos atributos se denominan privados y tienen como marco de aplicación unicamente a las operaciones asociadas al objeto.
  • Externa: la que necesitan el resto de los objetos para interactuar con el resto de los objetos que definamos. Estas propiedades se denominan públicas y corresponden a la información que necesitan conocer los restantes objetos de la aplicación.
Mantenibilidad: cualidad que indica que un programa o sistema debe ser facilmente modificable. El concepto de mantenibilidad implica que un programa, al igual que un se vivo, debe ser capaz de adaptarse a un medio ambiente que siempre es cambiante.

Polimorfismo: es una nueva característica aportada por la POO. Indica la posibilidad de definir varias operaciones con el mismo nombre, diferenciandolas unicamente en los parámetros de entrada.

CONCLUSIÓN:

Podemos decir que nos escontramos con un lenguaje muy versátil y que nos brinda un sinfin de posibilidades a la hora de programar nuestras aplicaciones. Un lenguaje que acerca dichas aplicaciones a una estructura más típica del mundo real, potente y fácil de programar. A si mismo podemos encontrar multitud de plataformas que hoy en día utilizan la orientación a objetos, como por ejemplo las bases de datos orientadas a objetos.

Sin mas dilación termino este articulo que espero que sea de agrado y ayude a la hora de introducirse en el mundo de la POO.

BIBLIOGRAFÍA:

Programacón Orientada a Objetos con C++; Por Fco Javier Ceballos, Editorial Ra-Ma.

WEBBIOGRAFÍA:

http://www.monografias.com/trabajos14/progorie/progorie.shtml
http://www.webcontenido.com/computadores/45

Realizado por: Diego Garcia Saborido

PARADIGMA IMPERATIVO


Es un paradigma de programación que describe los programas como una lista de instrucciones elementales que se ejecutan secuencialmente, una tras otra, en el orden en que aparecen.
Toda la información de un programa está contenida en memoria, gracias al uso de variables. Estas actuan como almacenes de información que contienen los datos que maneja el programa.
Para la realización de cualquier cálculo sobre los datos, se obtienen estos de memoria, se opera sobre ellos y luego se devuelven a memoria, mediante asignaciones.

Estructura secuencial: El orden del programa está establecido por el orden en que las operaciones aparecen en el "texto" del programa. Estas instrucciones se ejecutan una tras otra; y es condición indispensable que para que una orden comience a ejecutarse, su predecesora debe haber concluido.

Descomposición funcional: El código se puede dividir en módulos que se pueden agrupar jerarquicamente. Estos módulos o funciones son como un conjunto de sentencias que se utilizan generalmente juntas (para alcanzar cierto objetivo) a las que se podrá acceder con solo invocar al módulo por su nombre. Se permite el paso de parámetros a estos módulos, con lo que se consigue comunicación con el programa principal. El hecho de que sólo se escriba una vez el código de los módulos no significa que se rompa la secuencia del programa; pues esto sólo es una manera de facilitar la labor del programador, ya que durante la transcripción a código máquina en cada invocación se copia todo el código del módulo.

Uso de variables como reflejo del estado del programa: Las variables no son más que nombres asignados a determiandas posiciones de memoria, para acceder a ellas con facilidad. Toda la información del programa está contenida en memoria, por lo que las variables son un mecanismo muy ventajoso para el manejo de esta. Se puede conocer el estado actual del programa observando los valores que toman sus variables. Este estado varía según la ejecución de las distintas instrucciones.

Secuencia, decisión e iteración:Son los tres tipos fundamentales de instrucciones de un programa imperativo. La secuencia es la pauta que se sigue, marcada por la ejecución de las instrucciones una a una en el orden dado. La decisión permite saltos de instrucciones en función de una condición (se elige entre dos grupos de acciones) y la iteracion es la posibilidad de crear ciclos de repetición de un grupo de instrucciones un número determiado de veces.

Bibliografía
Lenguajes de programación. Conceptos y constructores - Ravi Sethi

PRESENTACIÓN

Lenguajes de Programación es un weblog que tiene como finalidad dar cabida a una serie de prácticas para la asignatura de Lenguajes de Programación, perteneciente al 3er curso de Ingenería Técnica en Informática de Gestión por la Universidad de Vigo.

Así mismo será punto de reunión para interesados en todo lo relacionado con los lenguajes de programación. Características de los distintos paradigmas, conceptos asociados, enlaces de interés y la posibilidad de añadir comentarios serán el nutriente de contenidos del weblog.

STAFF

Los integrantes del GRUPO 35 responsables de la administración de este blog somos:

Diego García Saborido - dgsaborido@correo.ei.uvigo.es
Vanesa López Lorenzo - vllorenzo@correo.ei.uvigo.es
Cristina Durán Viñas - cdvinas@correo.ei.uvigo.es
Julio Sebastián Figueiras Varela - jfvarela@correo.ei.uvigo.es

OBJETIVOS

Para esta primera práctica y ya que somos cuatro los componentes de este grupo los temas a tratar serán:

  • 4 conceptos propios del paradigma Imperativo. Realizado por Cristina Durán.
  • 4 conceptos propios del paradigma de Orientación a Objetos. Realizado por Diego García.
  • 4 conceptos propios del paradigma Declarativo. Realizado por Vanesa López.
  • 2 conceptos propios del paradigma Concurrente. Realizado por Julio Figueiras.
Así mismo añadir una breve descripción de cada concepto elegido.

Sin más, feliz lectura.