0

Programación [Paradigma]

martes, 10 de mayo de 2011 | Author: Alex Alvarez Gárciga | Etiquetas: ,

Un paradigma de programación es una propuesta tecnológica que es adoptada por una comunidad de programadores cuyo núcleo central es incuestionable en cuanto a que unívocamente trata de resolver uno o varios problemas claramente delimitados. La resolución de estos problemas debe suponer consecuentemente un avance significativo en al menos un parámetro que afecte a la ingeniería de software. Tiene una estrecha relación con la formalización de determinados lenguajes en su momento de definición. Un paradigma de programación está delimitado en el tiempo en cuanto a aceptación y uso ya que nuevos paradigmas aportan nuevas o mejores soluciones que la sustituyen parcial o totalmente.

Actualmente las ciencias de la computación cuenta con los siguientes paradigmas de programación, donde:

  • La programación imperativa, en contraposición a la programación declarativa es un paradigma de programación que la describe 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. Los lenguajes imperativos de alto nivel usan variables y sentencias más complejas en pos una mayor abstracción de la plataforma de cómputo para ganar en enfoque sobre el problema, pero aún así siguen el mismo paradigma.

  • La programación funcional, es un paradigma de programación declarativa basado en la utilización de funciones aritméticas que no maneja datos mutables o de estado. Enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativa, que enfatiza los cambios de estado. La programación funcional tiene sus raíces en el cálculo lambda, un sistema formal desarrollado en los 1930s para investigar la definición de función, la aplicación de las funciones y la recursión. Muchos lenguajes de programación funcionales pueden ser vistos como elaboraciones del cálculo lambda.

  • La programación lógica, es un paradigma de programación declarativa que consiste en la aplicación del corpus de conocimiento sobre lógica para el diseño de lenguajes de programación. Esta gira en torno al concepto de predicado, o relación entre elementos. 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 como el de la inteligencia artificial, donde la programación tradicional es un fracaso.

  • La programación Declarativa, 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. Donde no existen asignaciones destructivas, y las variables son utilizadas con Transparencia referencial.

  • La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa objetos definidos mediante clases y sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo y encapsulamiento como sus pilares.

  • 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, definidos por el usuario o por ellos mismos provocados.

  • La programación modular, es un paradigma de programación que consiste en dividir un programa en módulos o subprogramas con el fin de hacerlo más legible y manejable. Presentada históricamente como una evolución de la programación estructurada para solucionar problemas de programación más grandes y complejos de lo que ésta puede resolver.

  • La Programación Orientada a Aspectos (POA) es un paradigma de programación cuya intención es permitir una adecuada modularización de las aplicaciones y posibilitar una mejor separación de incumbencias. Gracias a la POA se pueden encapsular los diferentes conceptos que componen una aplicación en entidades bien definidas, eliminando las dependencias 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 adaptativos, los filtros de composición, la programación orientada a sujetos o la separación multidimensional de competencias.

  • La Programación con restricciones, es un paradigma donde las relaciones entre las variables son expresadas en términos de restricciones (ecuaciones) las cuales deben ser satisfechas por cualquier solución del problema planteado, en lugar de especificar los pasos para obtener dicha solución. 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 áreas de planificación y programación de tareas.

  • La programación orientada a componentes (que también es llamada basada en componentes) es una rama de la ingeniería del software, con énfasis en la descomposición de sistemas ya conformados en componentes funcionales o lógicos con interfaces bien definidas usadas para la comunicación entre componentes. Se considera que el nivel de abstracción de los componentes es más alto que el de los objetos y por lo tanto no comparten un estado y se comunican intercambiando mensajes que contienen datos.

Además, John Backus en su trabajo sobre los Programas como objetos matemáticos identificó dos paradigmas contrastantes. La programación a nivel funcional y la programación a nivel de valores donde:

  • La programación a nivel funcional dicta que un programa de nivel funcional no necesita la noción de variable, dado que las variables, que son elemento esencial en las definiciones a nivel de valores no hacen falta en el nivel funcional. Resultando así en un estilo de programación donde los programas se escriben como combinación de otros programas con la ayuda de los operaciones de construcción de programas o funcionales formando un espacio matemático.

  • La programación a nivel de valores describen como combinar diferentes valores (por ejemplo, números, caracteres, etc.) para formar nuevos valores hasta obtener el resultado final. Los nuevos valores se obtienen como resultado de la aplicación de operaciones que transforman valores en otros valores, como por ejemplo, la suma, la concatenación, la inversión de matrices, etc. Los lenguajes que siguen el estilo de von Neumann son de nivel de valores: las expresiones a la derecha de una asignación tienen por objeto la creación del nuevo valor a asignar.

Si bien puede seleccionarse la forma pura de estos paradigmas al momento de programar, en la práctica es habitual que se mezclen, dando lugar a la programación multiparadigma.

Y para aquellos que a estas alturas se lo pregunten:

La programación estructurada es una forma de escribir programas de computadora de manera clara. Utilizando únicamente tres estructuras: secuencia, selección e iteración; siendo innecesario el uso de la instrucción o instrucciones de transferencia incondicional (GOTO, EXIT FUNCTION, EXIT SUB o múltiples RETURN).

Hoy en día las aplicaciones informáticas son mucho más ambiciosas que las necesidades de programación existentes en los años 1960, principalmente debido a las aplicaciones gráficas, por lo que las técnicas de programación estructurada no son suficientes y están en desuso.


0

Programación [Algoritmo]

| Author: Alex Alvarez Gárciga | Etiquetas: ,


Algoritmo en matemáticas, ciencias de la computación y disciplinas relacionadas (del griego y latín, dixit algorithmus y éste a su vez del matemático persa Al Juarismi) es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba realizar dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son el objeto de estudio de la algoritmia.
La descripción de un algoritmo usualmente se hace en tres niveles:
  1. Descripción de alto nivel. Se establece el problema, se selecciona un modelo matemático y se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles.
  2. Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución.
  3. Implementación. Se muestra el algoritmo expresado en un lenguaje de programación específico o algún objeto capaz de llevar a cabo instrucciones.
También es posible incluir un teorema que demuestre que el algoritmo es correcto, un análisis de complejidad o ambos.
Ejemplo de algoritmo
Tomemos el problema de encontrar el máximo de un conjunto de números.
Descripción de alto nivel
Dado un conjunto finito C de números, se tiene el problema de encontrar el número más grande. Sin pérdida de generalidad se puede asumir que dicho conjunto no es vacío y que sus elementos están numerados como C0, C1, …, Cn
Es decir, dado un conjunto C = { C0, C1, …, Cn } se pide encontrar m tal que x <= m para todo elemento x que pertenece al conjunto C.
Para encontrar el elemento máximo, se asume que el primer elemento (c0) es el máximo; luego, se recorre el conjunto y se compara cada valor con el valor del máximo número encontrado hasta ese momento. En el caso que un elemento sea mayor que el máximo, se asigna su valor al máximo. Cuando se termina de recorrer la lista, el máximo número que se ha encontrado es el máximo de todo el conjunto.

Descripción formal
El algoritmo puede ser escrito de una manera más formal en el siguiente pseudocódigo:
Algoritmo Encontrar el máximo de un conjunto

función max(C)
//C es un conjunto no vacío de números//
n | C | // | C | es el número de elementos de C//
m c0
para i 1 hasta n hacer
si ci > m entonces
m ci
devolver m

Sobre la notación:
  • "←" representa una asignación: mx significa que la variable m toma el valor de x;
  • "devolver" termina el algoritmo y devuelve el valor a su derecha (en este caso, el máximo de C).
Implementación
En lenguaje C#:

int max(int[] c, int n){
int i, m = c[0];
for (i = 1; i < n; i++)
if (c[i] > m) m = c[i];
return m;
}

Como medida de la eficiencia de un algoritmo, se suelen estudiar los recursos (memoria y tiempo) que consume el algoritmo. El análisis de algoritmos se ha desarrollado para obtener valores que de alguna forma indiquen (o especifiquen) la evolución del gasto de tiempo y memoria en función del tamaño de los valores de entrada.
La implementación de hardware de la mayoría de computadores es imperativa; lo que significa que este 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).
Una Máquina de Turing (MT) es un modelo computacional que realiza una lectura/escritura de manera automática sobre una entrada llamada cinta, generando una salida en esta misma.
Este modelo está conformado por un alfabeto de entrada y uno de salida, un símbolo especial llamado blanco (normalmente b, Δ o 0), un conjunto de estados finitos y un conjunto de transiciones entre dichos estados. Su funcionamiento se basa en una función de transición, que recibe un estado inicial y una cadena de caracteres (la cinta, la cual es finita por la izquierda) pertenecientes al alfabeto de entrada. Luego va leyendo una celda de la cinta, borrando el símbolo, escribiendo el nuevo símbolo perteneciente al alfabeto de salida y finalmente avanza a la izquierda o a la derecha de celda por vez, repitiendo esto según se indique en la función de transición, para finalmente detenerse en un estado final o de aceptación, representando así la salida.