jueves, enero 11, 2007

BIBLIOGRAFÍA
1. Estructuras de datos en Java.
Mark Allen Weiss.
Addison Wesley
2. Estructuras de datos. Realización en Pascal.
M. Collado Machuca. R. Morales Fernandez. J. Jose Moreno Navarro.
3. Estructuras de datos con Java. Diseño de estructuras y algoritmos.
John Lewis. Joseph Chase.
Addison Wesley.
4. Java. Como programar
Harvey M. Deitel. Paul J. Deitel
Prentice Hall.
5. Programación en Pascal.
Luis Joyanes Aguilar
McGrawHill
6. Programación estructurada y algoritmos en Pascal.
Jose María Valls. David Camacho.
7. Manual de Java.
Patrick Naughton.
McGrawHill.
8. Programación avanzada y resolución de problemas en Pascal.
G.M. Schneider. Steven C. Bruell.
ANAYA.
9. Aprendiendo Java en 21 días.
Laura Lemay. Charles L. Perkins.
10. Programando con Java.
Tim Ritchey.
11. Turbo PaSCAL 7. Manual de referencia.
Stephen K. O'Brien. Steve Nameroff.
McGrawHill.
12. Programación en Pascal.
Stanford Leestma. Larry Nyhoff.
Prentice Hall.

SIMILITUDES Y DIFERENCIAS
DIFERENCIAS
1. En Pascal se distingue entre funciones y procedimientos.
Java tiene un único formato: métodos.
2. Java. Se declaran dentro de una clase en cualquier parte
Pascal. Sólo pueden aparecer en la parte destinada a la declaración de subprogramas.
3. Pascal. Un subprograma debe estar declarado antes de utilizarlo.
Java. Esto no es necesariamente así. No existe esa secuencialidad, ya que forman parte de un objeto.
4. Pascal. Los parámetros se separan por ;
Java. Los parámetros se separan por ,
5. Pascal. Se puede especificar un solo tipo para varios parámetros.
Java. Cada parámetro debe llevar su tipo, aunque todos tengan el mismo.
6. Pascal. Se ejecuta SIEMPRE todo el código.
Java. Si se encuentra un return termina la ejecución del módulo. No tiene porque llegar hasta el final...
7. Pascal. Como tipo de retorno sólo se aceptan tipos simples.
Java. Como tipo de retorno se acepta cualquier tipo permitido del lenguaje (incluídos los objetos)
8. Pascal. Permite que un subprograma sea un parámetro de otro subprograma.
Java. No permite esto.
9. Pasca. Un subprograma puede contener en su interior la declaración de otros subprogramas.
Java. Esto no se permite, todos los métodos son independientes unos de otros.
SIMILITUDES
1. Ambos lenguajes permiten sobrecarga de subprogramas
2. El propósito de los subprogramas en los dos lenguajes es el mismo (realizar tareas concretas)
3. El número, tipo y orden de los parámetros formales y reales debe coincidir en los dos lenguajes, aunque en Pascal si el orden no coincide no da error (ni de compilación ni de ejecución), aunque los resultados obtenidos pueden ser "raros".
4. Soportan los mismos métodos de paso de parámetros (por valor o por referencia) aunque con distintos matices.

miércoles, enero 10, 2007

ABSTRACCIÓN FUNCIONAL
( PARTE III DE IV )


Abstracción Funcional en Java.

Fundamentos de los subprogramas.

En Java no existen distinciones entre funciones y procedimientos formalmente. En este lenguaje solo se tienen métodos, y según la situación, se comportarán como una función o como un procedimiento.
Lista de parámetros: la lista de parámetros (argumentos) es una lista de las declaraciones de parámetros que se pasan al método para su ejecución.

La lista puede estar vacía pero los paréntesis son obligados:

public void suficiente() // Correcto

public void pocaCosa // Error de sintaxis.


Es obligatorio indicar el tipo de cada parámetro:


double potencia (double x, double y) // Correcto

double potencia (double x, y) // Error de sintaxis


Parámetros formales y parámetros reales.


  • Parámetros formales: Los que se definen en la cabecera de la función.
  • Parámetros reales: Los que aparecen en la llamada a la función. Deben corresponderse con los parámetros formales definidos en la cabecera.






public static void main(String [] args)

{

int k = 3;

boolean flag = true;

// Llamadas correctas:

f(7, false);

f(0, flag);

f(k, flag);

// Llamadas inCorrectas:

// No concordancia entre parámetros reales y formales

f(true, d, flag);

f(false, 7);

}


El tipo retorno de un método puede ser cualquier tipo válido en el lenguaje, incluso los creados por el programador.
Un método tambien puede devolver objetos y recibirlos como parámetros.
Siempre hay que especificar un tipo de retorno del método, aunque queramos que este se comporte como un procedimiento (en cuyo caso no sería necesario), en este caso se pondrá como tipo de retorno void (que indica que no se devuelve nada).
El valor de retorno se determina (dentro del método) mediante la sentencia return. Se escribe return acompañado del valor a devolver cuando es una "función", y return "a secas" seguido de ; cuando se comporta como un "procedimiento".
El método en cuestión termina en cuanto se encuentre el primer return, sin continuar hasta el final del código de este.
Una curiosidad del lenguaje a destacar es que no se pueden pasar tipos simples como parámetros por referencia directamente, sino que hay que hacerlo como si un objeto se tratase gracias a las clases propias de Java que engloban cada tipo simple.


Procedimientos y funciones.


Se suele distinguir entre funciones y procedimientos:

Las funciones se corresponden con la noción matemática de función: producen un resultado que es función de los datos de entrada:

• y = f(x1, x2,...xn)

• Una función bien definida no modifica los parámetros de entrada.

• Se utilizan en expresiones.

Los procedimientos agrupan sentencias que realizan una tarea bien definida, pero no tienen por qué devolver un resultado.

• Se corresponden con el concepto de instrucción.

• Los procedimientos actúan sobre el entorno y pueden modificar los parámetros de entrada (efectos colaterales)

Los procedimientos pueden verse como una forma de extender las sentencias del lenguaje, mientras que las funciones pueden verse como una extensión de los operadores:

• Cuando se invoca una función se obtiene un valor a través de un valor de retorno.

• Cuando se invoca un procedimiento el efecto es una modificación del entorno del llamante, de la cual éste es advertido a través de los valores de los parámetros de salida.




Métodos de paso de parámetros.

Los parámetros de los métodos se pueden pasar por valor o por referencia.

En Java, los tipos primitivos siempre se pasan por valor y los objetos siempre por referencia.

Esto también ocurre para las variables de la sentencia return.



Ejemplo de paso por valor en Java:


void intercambio(int x, int y)

{

int auxiliar;

auxiliar = y;

y = x;

x = auxiliar;

}


Paso de arrays como parámetros en Java.


Los arrays son objetos y por tanto se pasan por referencia.

• La referencia se pasa por valor

• Para pasar un array como parámetro escribimos el nombre del array en la lista de parámetros (sin corchetes)

int temperaturasHorarias[] = new int[24];

modificarArray(temperaturasHorarias);

• El nombre del array es en realidad una referencia a un objeto que contiene los elementos del array.



class Paso_Arrays_1

{

static int a[] = {0, 1, 2, 3, 4};

public static void modificarArray(int b[])

{ // Por referencia

for (int j = 0; j<>

}

public static void modificarElemento(int e)

{ // Por valor

e *= 2;

}

public static void main(String [] args)

{

modificarArray(a); // después de llamada a = {0, 2, 4, 6}

modificarElemento(a[3]); // después de llamada a[3] = 6;

}

}


Sobrecarga de métodos en Java.


Sobrecarga de métodos: Java permite definir métodos con el mismo nombre siempre que difieran en los argumentos de entrada. Es una manera de aportar polimorfismo


  • Un método se distingue del resto por su firma.
  • Firma del método: nombre + argumentos de entrada.
  • Puesto que los métodos sobrecargados tienen el mismo nombre, los métodos sobrecargados se diferencian por el número, tipo y orden de los argumentos en su lista de parámetros.

Ejemplo:

public class utilidadesMatematicas

{

int square(int x) { return x*x; }

double square(double x) { return x*x; }

}


  • El prototipo de un método es la firma más el tipo devuelto.


Los métodos sobrecargados no se distinguen por el prototipo sino por la firma.





ABSTRACCIÓN FUNCIONAL ( Parte II de IV )


Abstracción Funcional en Pascal.
En Pascal se permiten dos tipos de subprogramas: funciones y procedimientos.

Procedimientos

Los procedimientos comienzan por la palabra reservada Procedure seguida de un identificador y un punto y coma. Después de la cabecera viene la parte de declaración. Al ejecutar un procedimiento se crean en memoria las constantes y variables de la parte de declaración, pero después de que se haya terminado el procedimiento desaparecen, lo cual supone un ahorro de memoria.

A continuación de la declaración están las sentencias, entre las palabras clave Begin y End y un punto y coma. Los procedimientos se activan en el programa principal dando su nombre como una sentencia simple.

Con frecuencia los procedimientos necesitan que se les dé uno o más valores, que se conocen como parámetros. Estos se incluyen en la cabecera, dentro de los paréntesis que siguen al identificador. Las declaraciones de parámetros son como las declaraciones de variables en la forma y propósito. Cada identificador se separa por punto y coma, cada uno se ha de definir como un tipo con nombre. A continuación se muestra un procedimiento que repite un carácter en pantalla, el número de veces que se quiera,

Procedure Repite(caracter; Car, conta: Integer);

Var i:Integer;

Begin

For i:=1 to conta Do

Write(caracter);

End;

y así para invocar que aparezca la letra A 80 veces seguida en pantalla,

Repite ("A",80)

donde se han pasado dos parámetros. Estos parámetros pueden ser de otro tipo, como variables, expresiones, como por ejemplo,

caracter:="A"; conta:=80;

Repite(LowerCase(caracter),conta);

donde LowerCase es una función que saca la letra minúscula de la indicada.

A su vez los parámetros se pueden pasar por valor o referencia. Si se pasa por valor, se transfiere una copia del valor del parámetro actual al procedimiento, el procedimiento no accede a la variable real y por lo tanto no puede modificarla. Un procedimiento puede cambiar el valor de un parámetro por valor, pero a la vuelta al programa queda sin modificar el valor actual del parámetro original. Se entiende que los parámetros por valor se utilizan para pasar información de entrada al subprograma. Este es el modo por defecto en pascal, no hay que indicarlo de ninguna manera. Lo que sucede es que internamente se crea una copia del parámetro real y se trabaja siempre con esta copia.

Si se desea pasar un parámetro por referencia, el parámetro actual debe ser una variable o una constante con tipo. Delante de la declaración del parámetro formal hay que poner la palabra clave Var.

Seguidamente se da un ejemplo para cada una de las dos formas de paso de parámetros,

a) Por valor

Procedure incrementa(mas_uno:Integer)

Begin

mas_uno:=mas_uno+1;

WriteLn(mas_uno);

End;

y al ejecutar las instrucciones siguientes,

avance:=1;

incrementa(avance);

WriteLn(avance)

la salida sería de 2 y 1.

b) Por referencia

Procedure incrementa(Var mas_uno:Integer)

Begin

mas_uno:=mas_uno+1;

WriteLn(mas_uno);

End; y al ejecutar las instrucciones siguientes,

avance:=1;

incrementa(avance);

WriteLn(avance)

la salida sería de 2 y 2.

Reglas para la asociación de parámetros.

1. Debe haber el mismo número de parámetros reales y formales

2. Los tipos de parámetros formales y reales deben concordar, sin embargo un parametro real integer puede estar asociado a un parámetro por valor real, pero no con un parámetro formal por variable de tipo real.

3. Un parámetro real asociado con un parámetro formal por variable debe ser una variable, no puede ser una constante o expresión, ya que su valor puede ser modificado.

Parámetros constantes. Se pasan por referencia pero indícandolos como const no se permite modificarlos. Esto se hace para no hacer copias de estructuras de datos muy pesadas.

Parámetros sin tipo. No se realizan las comprobaciones de tipo. Se asume que el programador asume la responsabilidad de no realizar operaciones no permitidas para el tipo concreto que se pase al parámetro sin tipo. Deben ser pasados por referencia. Se necesita otra variable declarada dentro del subprograma que tenga un tipo concreto y sea del tipo absolute para que sea una "copia" del valor pasado como parámetro. Se pase lo que se pase en el parámetro se tratará como si fuese del tipo de la variable absolute declarada dentro. Por lo que esto resulta muy poco útil.

Funciones


La diferencia entre un procedimiento y una función es que el identificador de una función asume un valor cuando la función ha terminado y devuelve este valor a la rutina que la llamó en sustitución del nombre de la función. En un sentido amplio el nombre de la función es también una variable. Por tanto, solo tiene sentido "colocar" la llamada a la función en aquellos lugares donde tendría sentido que apareciese el resultado de esta.

Todo lo indicado previamente respecto a la definición de los procedimientos se aplica a las funciones. La palabra clave es Function. A continuación se indica un ejemplo de función que convierte un parámetro de tipo Char a letra minúscula, si dicho parámetro está en el rango de la A a la Z.,

Las funciones solo pueden devolver tipos simples del lenguaje (integer, char, real, boolean, enumerado o subrango), y tambien strings y punteros.

En funciones se aplican los mismos métodos de paso de parámetros. Por tanto, los parámetros por referencia se puden utilizar tambien en funciones, consiguiendo así que estas devuelvan más de un valor, aunque esta no es una práctica muy aconsejable.

Function miniscula(caracter:Char);Char


Begin

If caracter in "A".."Z" Then

minuscula:=Char(Ord(caracter)+32)

Else

minuscula:=caracter;

End;

Subprogramas como parámetros.

En algunas versiones de Pascal se permite el paso de subprogramas como parámetros, esto es muy útil cuando un subprograma necesita invocar a otro subprograma que está declarado fuera de su ámbito.
Se incluirá la función o el procedimiento en la cabecera del subprograma.

Un ejemplo:

procedure Trapezoide ( a,b: real; Ninvl:integer; fz:func; var z:real );
var
h,xj: real;
j:integer;
suma: real;
begin
h:=(b-a)/Ninvl;
suma:=0.0;
for j:=1 to (Ninvl-1) do
begin
xj:=a+j*h;
suma:= suma + fz(xj);
end
z := (fz(a) + 2*suma + fz(b))*h/2;
end;

siendo func = function ( x:real ):real;


Subprogramas sobrecargados.

En algunos compiladores de Pascal, como FreePascal, es posible realizar sobrecarga de funciones y procedimientos, es decir, declarar funciones con el mismo nombre pero que difieren en el orden o número de los parámetros que necesitan. Ejemplo:

function suma(a,b:integer):integer;

begin

suma:= a+b;

end;

function suma(a,b:double):double;

begin

suma:= a+b;

end;

Según el tipo de parámetro que le pasemos se llamará la primera o la segunda función.




ABSTRACCIÓN FUNCIONAL (Parte I de IV)
( práctica final 4.2 del grupo 35)


Introducción.

La abstracción, una de las herramientas que más nos ayuda a la hora de solucionar un problema, es un mecanismo fundamental para la comprensión de problemas y fenómenos que poseen una gran cantidad de detalles, su idea principal consiste en manejar un problema, fenómeno, objeto, tema o idea como un concepto general, sin considerar la gran cantidad de detalles que estos puedan tener.

El proceso de abstracción presenta dos aspectos complementarios:

  • Destacar los aspectos relevantes del objeto.
  • Ignorar los aspectos irrelevantes del mismo (la irrelevancia depende del nivel de abstracción, ya que si se pasa a niveles más concretos, es posible que ciertos aspectos pasen a ser relevantes).

De modo general podemos decir que la abstracción permite establecer un nivel jerárquico en el estudio de los fenómenos, el cual se establece por niveles sucesivos de detalles. Generalmente, se sigue un sentido descendente de detalles, desde los niveles más generales a los niveles más concretos.

Veamos los diferentes tipos de abstracción que podemos encontrar en un programa:


Abstracción Funcional


Los subprogramas son como pequeños programas dentro de un programa, incluso se parecen a los programas por comenzar con una cabecera, ir seguida de las declaraciones y una parte de sentencias. Los subprogramas se encuentran en la parte de declaración del programa, sin embargo operan en su propio entorno, separados pero no siempre aislados del programa principal. Un subprograma puede declarar variables que son sólo accesibles desde el subprograma, puede usar variables del programa principal y puede usar una mezcla de los dos.

Los subprogramas son de dos tipos: procedimientos y funciones.

Crear procedimientos y funciones e invocarlos mediante un nombre donde se destaca qué hace la función y se ignora cómo lo hace. El usuario sólo necesita conocer la especificación de la abstracción (el qué) y puede ignorar el resto de los detalles (el cómo).


Abstracción de Datos

  • Tipo de datos: proporcionado por los lenguajes de alto nivel. La representación usada es invisible al programador, al cual solo se le permite ver las operaciones predefinidas para cada tipo.
  • Tipos definidos: por el programador que posibilitan la definición de valores de datos más cercanos al problema que se pretende resolver.
  • TDA: para la definición y representación de tipos de datos (valores + operaciones), junto con sus propiedades.
  • Objetos: Son TDA a los que se añade propiedades de reutilización y de compartición de código.
A continuación veremos como dos lenguajes de programación ( Java y Pascal ) implementan la abstracción funcional.

lunes, diciembre 04, 2006

ELEMENTOS PARA EL DEBATE - PARTE I

Como inicio del debate debemos elegir 4 competencias transversales y 4 competencias específicas dentro del libro blanco del título de Grado en Informática, explicadas en las páginas 184 y 185 del mismo. Éstas fueron las que elegimos el grupo 35:

COMPETENCIAS TRANSVERSALES GENÉRICAS

Trabajo en equipo.

En cualquier ámbito ha de ser importante la capacidad de trabajar en equipo, pero especialmente en un campo como la informática y el desarrollo de software, dado que el 100% de los productos se realizan en grupos de trabajo. No es un área donde se pueda trabajar de modo autónomo, por lo que la comunicación fluída entre miembros del grupo también es fundamental. En relación con esto también son importantes otras competencias como la "Habilidad en las relaciones interpersonales".

Capacidad de análisis y síntesis.

El análisis es la base para poder solucionar cualquier problema. Es la capacidad de descomponer un problema y "observarlo" con detalle para poder encontrarle una solución. Es evidente que esta competencia es importante ya que el Análisis es la primera fase en el desarrollo de software. Así mismo, la síntesis es la capacidad de englobar todas las ideas en un objetivo, y es muy importante a la hora de valorar los resultados.

Adaptación a nuevas situaciones.

Ninguna materia es tan cambiante como la informática. Ésta evoluciona a velocidades vertiginosas y contínuamente nos encontramos con nuevos problemas a los que aportar solución, nuevas situaciones a modelar y nuevas técnicas para hacerlo, por lo que consideramos que un informático ha de estar plenamente capacitado para encontrarse con estos nuevos retos y saber afrontarlos.

Capacidad de organización y planificación.

La organización y planificación del trabajo nos parecen importantísimos dado que es un trabajo donde el tiempo puede resultar un obstáculo. Frecuentemente se trabaja contrarreloj, tanto en el desarrollo de nuevos productos como en otros campos, por lo que la planificación de las tareas y una buena organización puede ser fundamentales para agilizar el trabajo y respetar los tiempos.

COMPETENCIAS ESPECÍFICAS

Programación.

Aunque en el "Libro blanco" no le dan apenas importancia, pensamos que es interesante conocer, aunque no sea con excesiva profundidad, el mundo de la programación. Esto permite que en tareas previas a la programación se tenga ésta en cuenta, lo que facilita, por ejemplo, descartar posibles soluciones o comprender otras con más detalle. Si se ven las cosas desde los ojos de un programador, se pueden saber lo que es posible realizar. También es importante conocer los distintos paradigmas y técnicas de programación para poder determinar la estructura de los productos y la forma de trabajar ( saber a qué tipo de programación orientarse ). Esto no sólo es práctico a la hora de desarrollar nuevo software, sino que también lo es en el mantenimiento y en muchos otros campos.

Interfaz con el usuario final.

Es importante tener en cuenta que tras nuestro software se encontrarán personas que tendrán que relacionarse con él. Por esto hay que tratar de facilitar el trabajo de estos usuarios en la medida de nuestras posibilidades. Si se tiene esto en cuenta nuestros productos serán mucho más "apetecibles", y el trabajo será mejor valorado.

Dirección, planificación y gestión de proyectos.

Una buena dirección, planificación y gestión es factor clave para el logro de los objetivos de un proyecto. Cumplen dos propósitos fundamentales en una empresa, minimizar el riesgo reduciendo la incertidumbre que rodea al proceso de desarrollo de software y definir las consecuencias de una administración de los recursos disponibles para que éstos sean aprovechados de la forma más optima.

Conocimiento de productos tecnológicos y tendencias de la tecnología, asociados al segmento del mercado.

Es interesante conocer los productos ofrecidos para el mercado para saber con qué contamos para trabajar y que posibilidades tendremos, así como también conocer los productos que pueden ser nuestra competencia. Así mismo es práctico disponer de información acerca de cómo evolucionan los productos y las tendencias, dado que esto es reflejo de los gustos y necesidades de los consumidores.

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