Más específicamente para la ciencia de la computación, probablemente fue Robert Floyd quien habló por primera vez del término Paradigmas de Programación y
los definió como un proceso de diseño que va más allá de una gramática, reglas
semánticas y algoritmos, sino que es un conjunto de métodos sistemáticos aplicables en
todos los niveles del diseño de programas.
Un paradigma de programación está delimitado en el tiempo en cuanto a su aceptación y uso ya que nuevos paradigmas aportan nuevas o mejores soluciones que lo sustituyen parcial o totalmente.
Actualmente, el uso de la computación es extremadamente diverso e intensivo. Todas sus distintas aplicaciones han requerido del desarrollo de muchos lenguajes de
programación, cada uno con propósitos y formas distintas. Todos estos
lenguajes pueden ser clasificados en una jerarquía de familias a partir del modelo que
siguen para definir y operar información.
Los paradigmas de programación más comunes son:
• Imperativo o por procedimientos.
• Funcional.
• Lógico.
• Declarativo.
• Orientado a objetos.
En la práctica es muy común que se mezclen paradigmas, generando lo que se conoce como, Programación Multiparadigma.
Paradigma Imperativo:
Describe la programación como una secuencia de instrucciones o comandos que cambian el estado de un programa. Los programas imperativos son un conjunto de instrucciones que le indican al computador cómo realizar una tarea. Su contrario, es el paradigma declarativo.
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.
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 impidiendo la creación de programas complejos. Fortran, 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.
Algunos lenguajes imperativos son: ASP, Basic, C, Fortran, Pascal, Perl, PHP, Lua, Java.
Paradigma Declarativo:
Se enfoca en describir las propiedades, conjunto de condiciones, proposiciones, afirmaciones, restricciones, ecuaciones o transformaciones que describen la solución buscada, dejando indeterminado el algoritmo usado para encontrar esa solución. Esto se realiza mediante mecanismos internos de inferencia de información a partir de la descripción realizada.
Es más complicado de implementar que el paradigma imperativo, tiene desventajas en la eficiencia, pero ventajas en la solución de determinados problemas.
Algunos lenguajes declarativos son: Prolog, Maude, SQL, Haskell.
Paradigma Funcional:
Este paradigma concibe a la computación como la evaluación de funciones matemáticas y evita declarar y cambiar datos. En otras palabras, hace hincapié en la aplicación de las funciones y composición entre ellas. Permite resolver ciertos problemas de forma elegante y los lenguajes puramente funcionales evitan los efectos secundarios comunes en otro tipo de programaciones.
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.
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 hace que sea necesario que las repeticiones sean por funciones recursivas.
Existen dos categorías de lenguajes funcionales:
• los funcionales puros.
• los funcionales híbridos.
La diferencia entre ambos, es que los híbridos admiten conceptos de los lenguajes imperativos, como por ejemplo, las secuencias de instrucciones y la asignación de variables.
Por otra parte, los lenguajes funcionales puros tienen una mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se cumple siempre con un lenguaje funcional híbrido.
Algunos lenguajes funcionales son:
Puros: Haskell, Miranda.
Híbridos: Scala, Lisp, Scheme, Ocaml, SAP, Standard ML.
Paradigma Lógico:
Se basa en la definición de reglas lógicas para luego, a través de un motor de inferencias lógicas, responder preguntas planteadas al sistema y así resolver los problemas.
Es un paradigma de programación dentro del de programación declarativa. La programación lógica gira en torno al concepto de predicado o relación entre elementos.
Algunas aplicaciones se encuentran relacionadas con:
• Inteligencia artificial.
• 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.
• Reconocimiento de lenguaje natural, donde un programa es capaz de comprender la información contenida en una expresión lingüística humana.
• Entre otras.
Un ejemplo de un lenguaje funcional: Prolog.
Paradigma de Programación Estructurada:
Es una forma de escribir programas de computadora de manera clara. Para ello utiliza ú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. Ello ha llevado al desarrollo de nuevas técnicas, tales como la programación orientada a objetos y el desarrollo de entornos de programación que facilitan la programación de grandes aplicaciones.
Ventajas de la programación estructurada:
• Los programas son más fáciles de entender, ya que pueden ser leídos de forma secuencial, sin necesidad de hacer saltos de línea (GOTO) dentro de los bloques de código para entender la lógica.
• La estructura del programa es clara, puesto que las instrucciones están más ligadas o relacionadas entre sí.
• Reducción del esfuerzo en las pruebas. Los errores se pueden detectar y corregir más fácilmente.
• Reducción de los costos de mantenimiento de los programas.
• Programas más sencillos y más rápidos (ya que es más fácil su optimización).
• Los bloques de código son auto explicativos, lo que facilita la documentación.
• Un programa escrito de acuerdo a estos principios no solamente tendrá una mejor estructura sino también una excelente presentación.
Algunos lenguajes de programación que usan este paradigma son: C, Pascal, BASIC.
Paradigma de Programación Orientada a Objetos:
Es un paradigma de programación que usa objetos y sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo y encapsulamiento. Su uso se popularizó a principios de la década de los años 1990. En la actualidad, existe variedad de lenguajes de programación que soportan la orientación a objetos.
En este paradigma se usan clases. Una clase es una descripción de un conjunto de objetos que comparten los mismos atributos, operaciones, relaciones y semántica.
Un objeto está compuesto por estados (atributos) y métodos.
Los estados son propiedades del objeto y están representados por variables con valores únicos para cada objeto y que son llamadas variables de instancia.
Los métodos son representaciones de los comportamientos que el objeto es capaz de hacer.
Un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los métodos permiten la comunicación entre ellos. Esta comunicación favorece al cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado del comportamiento.
Hay algunas características de este tipo de programación:
Abstracción: denota las características esenciales de un objeto, donde se capturan sus comportamientos. El proceso de abstracción permite seleccionar las características relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades. La abstracción es clave en el proceso de análisis y diseño orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar.
Encapsulamiento: reúne 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 sistema.
Modularidad: propiedad que permite subdividir una aplicación en partes más pequeñas (llamadas módulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes. Estos módulos se pueden compilar por separado, pero tienen conexiones con otros módulos.
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.
Herencia: las clases están relacionadas 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 volver a implementarlo.
Algunos lenguajes de este tipo de programación son: C++, Java, Eiffel, Perl, Ruby, Python, Objective C.
Paradigma de 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, definidos por el usuario o que ellos mismos provoquen.
En la programación estructurada, es el programador el que define cual será el flujo del programa, mientras que en la programación dirigida a eventos es el propio usuario quien lo define. El creador de un programa dirigido por eventos debe definir los eventos que manejarán su programa y las acciones que se realizarán al producirse cada uno de ellos, lo que se conoce como el administrador 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.
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 administrador de evento.
La programación dirigida por eventos es la base de lo que llamamos interfaz de usuario, aunque puede emplearse para desarrollar interfaces entre componentes de Software como módulos del núcleo también.
Algunos lenguajes que usan este paradigma son: Lexico, Visual Basic, Java, Javascript, Visual C++, Visual .Net, Visual C#, Visual J#, ASP .Net.
Paradigma de Programación orientada a Aspectos:
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 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.
El soporte para este nuevo paradigma se logra a través de una clase especial de lenguajes, llamados lenguajes orientados a aspectos (LOA), los cuales brindan mecanismos y constructores para capturar aquellos elementos que se diseminan por todo el sistema. A estos elementos se les da el nombre de aspectos. Una definición para tales lenguajes sería: Los LOA son aquellos lenguajes que permiten separar la definición de la funcionalidad pura de la definición de los diferentes aspectos.
Los LOA deben satisfacer varias propiedades:
• Cada aspecto debe ser claramente identificable.
• Cada aspecto debe auto-contenerse.
• Los aspectos deben ser fácilmente intercambiables.
• Los aspectos no deben interferir entre ellos.
• Los aspectos no deben interferir con los mecanismos usados para definir y evolucionar la funcionalidad, como la herencia.
Algunos lenguajes que usan este paradigma:
• AspectJ, que es una extensión Java del proyecto Eclipse.
• Aspect, un módulo Perl disponible en CPAN .
• phpAspect, que es una extensión PHP.
• AOP con SpringFramework 2.5 es un Framework de Java utilizando Anotación Java.
• Aspyct AOP, que es un módulo de Python.
Bibliografía:
http://es.wikipedia.org/wiki/Paradigma_de_programación
http://www.scribd.com/doc/9174723/Paradigmas-de-Programacion
http://www.alegsaonline.com/art/13.php
http://www.monografias.com/trabajos/objetos/objetos.shtml
http://es.wikipedia.org/wiki/Programación_dirigida_por_eventos
http://users.dsic.upv.es/~nprieto/clases/EDA0506/practicas/practica4.pdf
http://www.lafhis.dc.uba.ar/~ferto/docs/tesis.pdf