Escuela Superior de Ingeniería Informática || Lenguajes de Programación

jueves, enero 11, 2007

Abstracción funcional en JAVA y Pascal

El concepto de abstracción funcional consiste en identificar subproblemas menores para solucionar un gran problema, simplificando el análisis y la resolución del mismo.
JAVA
Java lo plantea de la siguiente manera, todos sus datos son objetos de una clase determinada. Al crear una clase especificamos e implementamos que características posee (atributos) y que funciones realiza (métodos), es lo que se conoce como encapsulamiento. Al crear un objeto de esa clase podemos trabajar con él, porque sabemos qué funciones realiza y cuales son los resultados que obtiene pero desconocemos cómo los hace porque realmente no nos interesa.
Con la abstracción funcional logramos los conceptos de encapsulamiento y ocultamiento. El ocultamiento es la capacidad de ocultar los detalles internos del comportamiento de una Clase y exponer sólo los detalles que sean necesarios para el resto del sistema.
PASCAL
En la programación estructural, la abstracción funcional se puede definir como la capacidad de examinar algo sin preocuparse de los detalles internos, es decir, en un programa estructurado es suficiente conocer que un procedimiento dado realiza una tarea específica, sin necesidad de saber cómo lo hace, mientras el procedimiento sea fiable se puede utilizar sin tener que conocer cómo funciona su interior.

En dicha programación usamos los procedimientos para llegar a ciertos niveles de abstracción, los cuales nos facilita el desarrollo de aplicaciones, ocultando los detalles internos de la implementación tras un identificador (el nombre de la función).
También utilizamos las funciones como herramientas de abstracción (separación), porque su comportamiento puede ser separado de su implementación.
Similitudes
  • Ambos lenguajes soportan la sobrecarga de funciones, dos funciones con el mismo nombre se diferencian en el número de parámetros o el tipo de parámetros que se le pasa, no por el tipo que devuelve. Esto es la base del comportamiento polimórfico.
  • El uso de argumentos por defecto no es soportado por ninguno de los dos lenguajes.
Diferencias
  • A diferencia de JAVA, Pascal soporta variables globales, es decir, su valor está disponible tanto en el cuerpo del programa principal como en el de cualquiera de los subprogramas declarados. En los subprogramas no es aconsejable utilizar las variables globales, puesto que provoca efectos laterales, los cuales se pueden evitar usando los parámetros en la comunicación de un programa con sus procedimientos.
  • Java no tiene procedimientos, solo disponemos de funciones, es decir, los métodos de una clase siempre deben devolver un valor. Podemos simular un procedimiento mediante la palabra reservada ‘void’ (no devuelve ningún valor), como resultado obtenido en una función sin embargo, en Pascal se pueden utilizar tanto funciones como procedimientos, con la diferencia de que las funciones devuelven un único valor y los procedimientos son subprogramas que realizan una tarea específica, pero no devuelven nada.
  • Pascal permite parámetros de entrada (para funciones, ya que en una función los parámetros de entrada nunca van a ser modificados), salida y entrada/salida. En el caso de los procedimientos pueden ser de cualquiera de los 3 tipos, en cambio, en JAVA, debido a la única existencia de las funciones, sólo tienen sentido los parámetros de entrada, porque en una función se obtiene un resultado, no se modifican los datos.
  • Pascal permite el paso de parámetros por valor y por referencia en los procedimientos y funciones. En el paso por valor, el valor del dato no sufre ningún cambio al salir de la función o procedimiento, sin embargo el paso por referencia supone que cualquier cambio hecho en el procedimiento provoca un cambio en el valor de la variable. La palabra reservada VAR indica que el parámetro se pasa por referencia.
  • En Java el paso de parámetro es siempre por valor, aunque los efectos son de paso por referencia cuando los argumentos son objetos, la referencia a un objeto se pasa por valor a la función. Dentro de la función, desde esta referencia podemos acceder a los miembros públicos de dicho objeto para modificar su estado. Cuando la función retorna el objeto estará modificado.

lunes, diciembre 11, 2006

Debate

A continuación exponemos lo que a nuestro juício son los puntos más importantes a considerar...

A nivel transaversal:
  • Capacidad de análisis y síntesis.
  • Capacidad de organización y planificación.
  • Trabajo en equipo.
  • Motivación por la calidad.
A nivel de competencias específicas:
  • Métodos y herramientas para el diseño y desarrollo de sistemas basados en computadores.
  • Visión comercial y empresarial.
  • Programación.
  • Bases de datos.

martes, noviembre 14, 2006

Paradigmas de programación



PROGRAMACIÓN IMPERATIVA


Un programa en un lenguaje imperativo aparece como una lista de instrucciones u órdenes elementales que han de ejecutarse una tras otra, en el orden en que aparecen en el programa. Las instrucciones de un programa imperativo utilizan datos almacenados en la memoria del computador, llamados variables. Para realizar algún cálculo, se parte de ciertos datos almacenados y se realizan diversas operaciones (instrucciones); al final, el resultado está almacenado en alguna celda de memoria.


A este tipo de paradigma de programación se le suele llamar algorítmico, dado que el significado de algoritmo es análogo al de receta, método, técnica, procedimiento o rutina, y se define como "un conjunto finito de reglas diseñadas para crear una secuencia de operaciones para resolver un tipo específico de problemas".


Las principales características de la programación imperativa son:

  • Concepto de variable. El componente principal es la memoria, compuesto por un gran número de celdas donde se almacenan los datos y que son referenciadas por medio de su nombre (variable). El conjunto de valores de todas las variables del programa en un momento dado representa el estado del programa.
  • Operaciones de asignación. Cada valor calculado debe ser asignado a la variable mediante operaciones de asignación. De esta forma se modifica el estado del programa.
  • Repetición. Un programa imperativo, normalmente realiza su tarea ejecutando repetidamente una secuencia de pasos elementales.
  • Secuencialidad: las instrucciones se ejecutan en base al orden en que fueron escritas. Su esencia es el cálculo iterativo, paso a paso, de valores de nivel inferior y su asignación a posiciones de memoria.

El paradigma imperativo es una abstracción del lenguaje ensamblador. En los términos mencionados anteriormente, el modelado se realiza más cerca del “espacio de la solución” que del “espacio del problema”.


Algunos de los lenguajes de programación que siguen el paradigma imperativo son BASIC, Pascal, Modula y C.



PROGRACIÓN ORIENTADA A OBJETOS

Existen varios conceptos relacionados con la programación orientada a objetos: clases, estructuras, sobrecarga de operadores, interfaces… Pero se considera que un lenguaje es totalmente orientado a objetos si contiene las siguientes características: herencia, polimorfismo y encapsulamiento; muy relacionada con esta última tenemos también que destacar la abstracción de datos.

Estos cuatro conceptos se encuentran muy relacionados: La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes

  • Abstracción: Se puede definir como la capacidad de examinar algo obviando aquellos detalles que no son esenciales y sin preocuparse de los detalles internos. El cómo se realiza la tarea no es importante; mientras el procedimiento sea fiable se puede utilizar sin tener que conocer cómo funciona su interior.

  • Encapsulamiento: Muy ligado a la abstracción esta la "ocultación de la información" o encapsulamiento. 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.
  • Polimorfismo: Se refiere al hecho de que una misma operación puede tener diferente comportamiento en diferentes objetos. El operador + realiza la suma de dos números de diferente tipo. Además se puede definir la operación de sumar dos cadenas mediante el operador suma.
  • Herencia: Impone una relación jerárquica entre clases en la cual una clase hija hereda de su clase padre. Si una clase sólo puede recibir características de otra clase base, la herencia se denomina herencia simple. Si una clase recibe propiedades de más de una clase base, la herencia se denomina herencia múltiple.

PROGRAMACIÓN DECLARATIVA

Los lenguajes declarativos están más cercanos a la forma de pensar del programador (son de más alto nivel), y no necesitan la especificación de la secuencia en la que tienen lugar las operaciones elementales dentro de la máquina. El tamaño de los programas y el tiempo necesario para desarrollarlos son sensiblemente menores, en general, que los correspondientes en cualquier lenguaje imperativo. Como contrapartida, los programas desarrollados en lenguajes funcionales suelen ser más ineficientes que los programas imperativos y lenguajes máquina: lo que se gana en transparencia y en tiempo de desarrollo, se pierde en eficiencia. Hasta hace poco, la diferencia estribaba en que existían compiladores muy buenos para lenguajes imperativos que permiten su uso a escala industrial, pero no para lenguajes declarativos, considerados como productos de “laboratorio”. En la actualidad están empezando a usarse lenguajes lógicos y funcionales para aplicaciones y proyectos a gran escala, y es posible que en un futuro no muy lejano lenguajes como los funcionales sean preferidos por una mayoría de programadores.

Programación funcional

La programación funcional es una forma de programar que pone el énfasis en la evaluación de expresiones en lugar de en la ejecución de órdenes. La ejecución de un programa funcional no es sino la aplicación de una función a unos datos; la expresión que resulta se reduce, mediante re-escrituras sucesivas, a expresiones equivalentes más sencillas, hasta llegar a una expresión irreducible que se considera el resultado de la ejecución del programa. Una característica esencial de los lenguajes funcionales es que pueden existir funciones de orden superior, es decir, funciones que tienen como argumento a otras funciones (dicho de otra forma, programas que tienen como argumentos otros programas). Otra característica esencial es la evaluación perezosa (sólo se realiza un cálculo cuando otro cálculo posterior lo necesita), que permite la definición de estructuras infinitas de datos, así como de funciones y tipos de datos no estrictos.

Los lenguajes funcionales han sido, desde la invención del Lisp, los más utilizados en Inteligencia Artificial. En los últimos años, la consolidación de estándares como el Haskell y la aparición de compiladores cada vez más eficientes han hecho que se estén comenzando a utilizar en aplicaciones industriales.

Programación lógica

Por programación lógica se entiende el uso de la lógica para representar problemas y métodos de resolución de problemas (en forma de hechos y reglas) junto con la utilización de procedimientos automáticos de prueba para la solución efectiva de los problemas. Tal y como define Kowalski: algoritmo = lógica + control.

La programación lógica trabaja con relaciones más que con funciones. Un programa convencional distingue entre datos de entrada (argumentos) y datos de salida (resultados). El equivalente en Prolog es una relación entre todas las variables que intervienen, sin distinguir entre argumentos y resultados. En general, esa relación sirve para encontrar los valores posibles de cualquier variable a partir de los valores conocidos del resto.

La programación lógica –en particular, el Prolog– se utilizó, en sus orígenes, en el campo del procesamiento del lenguaje natural. Desde entonces, su uso se ha extendido a la construcción de sistemas expertos, búsquedas en bases de datos, diseño de compiladores, especificación de algoritmos, etc.

Conceptos básicos:

  • Transparencia referencial: esta propiedad se puede definir como que cada elemento de su dominio se corresponde con un único elemento del rango, es decir, el resultado de aplicar una función sobre sus argumentos viene dada solamente por el valor de dichos argumentos.
  • Modularidad: la composición de funciones es la principal técnica que utiliza la programación funcional, lo cual nos permite la construcción de programas mediante la utilización de funciones primitivas o previamente definidas por el usuario. Todo esto refuerza la modularidad de los programas.
  • Funciones como objetos de primera clase: este tipo de lenguajes emplea las funciones como objetos muy importantes dentro del lenguaje, puesto que se pueden almacenar en estructuras de datos, pasarse como argumentos a otras funciones y devolverse como resultados.
  • Evaluación perezosa: consiste en que si el resultado de evaluar el primer operando permite deducir el resultado de la operación, entonces no se evalúa el segundo y se devuelve dicho resultado directamente.
  • 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.



lunes, noviembre 13, 2006

Mozilla Firefox

Se han detectado errores de visualización con IE 6.0.
Para ver correctamente este blog se recomienda el uso de Mozilla Firefox ;-)

Puedes descargarlo aquí

Bienvenid@

Los que hacemos éste blog queremos darte la bienvenida a un espacio donde se publicarán contenidos relacionados con las prácticas de Lenguajes de Programación.

  • Asignatura: LPR (Lenguajes de programación)
  • Titulación: Ingeniería informática de gestión
  • Centro: Escola Superior de Enxeñería Informática - ESEI, Ourense.
  • Año académico: 2006 - 2007
_______________________________
Información sobre el grupo

  • GRUPO 34
  • Integrantes: 3
    • smdominguez
    • pkirtap
    • gotxin