En un lenguaje de programación
orientado a procedimientos las
instrucciones se usan para crear
unidades o módulos que se
conocen como procedimientos o
subrutinas.
Los procedimientos aceptan como entrada los
datos y transforman estos datos para producir
como salida unos resultados específicos. Los
lenguajes orientados a objetos surgen por el
desarrollo de pantallas gráficas y apoyo a
interfaces gráficas de usuario o GUI, por sus siglas
en inglés, capaces de desplegar ventanas
múltiples. El lenguaje C++ contiene elementos de
ambos tipos de programación.
Utilizar este tipo de programación puede resultar muy útil a
la hora de programar grandes proyectos, ya que se crea una
inmensa biblioteca de funciones especiales para
procedimientos utilizados con frecuencia dentro del
programa. Por contrapartida, es muy difícil determinar cuál
es el número mínimo de instrucciones consecutivas, y el
mínimo número que esta secuencia se debe repetir para
considerar declarar un procedimiento o una función.
La programación
procedimental o programación
por procedimientos es un
paradigma de la
programación. Muchas veces
es aplicable tanto en lenguajes
de programación de bajo nivel
como en lenguajes de alto
nivel.
POO (Programación orientada a objetos)
La programación Orientada a objetos (POO, u OOP
según sus siglas en inglés) es un paradigma de
programación que usa objetos en sus interacciones,
para diseñar aplicaciones y programas informáticos.
Está basada en varias técnicas, incluyendo herencia,
cohesión, abstracción, polimorfismo, acoplamiento y
encapsulamiento. Su uso se popularizó a principios de
la década de 1990. En la actualidad, existe una gran
variedad de lenguajes de programación que soportan
la orientación a objetos.
La programación orientada a objetos es un enfoque de
programación que combina datos y acciones asociadas
(métodos) en estructuras lógicas (objetos). Este enfoque
aumenta la capacidad para administrar la complejidad
del software, lo cual resulta especialmente importante
cuando se desarrollan y mantienen aplicaciones y
estructuras de datos de gran tamaño.
La programación orienta a objetos es una forma
especial de pensar, nos permite modelar nuestra
realidad dentro de un entorno de programación,
partiendo de la primicia de que todo en esta vida es
un objeto programable.
Algunas de las ventajas
de la programación
orientada a objetos son
los siguientes:
Los componentes se pueden reutilizar.
Facilidad de mantenimiento y
modificación de los objetos existentes.
Una estructura modular clara se puede
obtener, la cual no revelará el mecanismo
detrás del diseño.
Se proporciona un buen marco que
facilita la creación de rica interfaz gráfica
de usuario aplicaciones (GUI).
Se acopla bien a la utilización de
bases de datos, debido a la
correspondencia entre las
estructuras.
Desventajas
Limitaciones del programador: Es posible el programador
desconozca algunas características del paradigma y de
hecho siga utilizando el paradigma estructurado.
No hay una forma única de resolver los
problemas. Esto puede llevar a que diferentes
interpretaciones de la solución planteada
emerjan.
Se requiere una documentación amplia para
determinar la solución planteada.
Programación funcional
En informática, la programación funcional es un
paradigma de programación declarativa basado en el
uso de verdaderas funciones matemáticas. En este
estilo de programación las funciones son ciudadanas
de primera clase, porque sus expresiones pueden ser
asignadas a variables como se haría con cualquier
otro valor; además de que pueden crearse funciones
de orden superior.
La programación funcional tiene sus raíces en el cálculo
lambda, un sistema formal desarrollado en los años
1930 para investigar la naturaleza de las funciones, la
naturaleza de la computabilidad y su relación con la
recursión. Los lenguajes funcionales priorizan el uso de
recursividad y aplicación de funciones de orden
superior para resolver problemas que en otros
lenguajes se resolverían mediante estructuras de
control (por ejemplo, ciclos). Muchos lenguajes de
programación funcionales pueden ser vistos como
elaboraciones del cálculo lambda.
Los lenguajes de programación funcional,
especialmente los puramente funcionales, han sido
enfatizados en el ambiente académico y no tanto en
el desarrollo comercial o industrial. Sin embargo,
lenguajes de programación funcional como Lisp
(Scheme, Common Lisp, etc.), Erlang, Rust, Objective
Caml, Scala, F# y Haskell, han sido utilizados en
aplicaciones comerciales e industriales por muchas
organizaciones. La programación funcional también
es utilizada en la industria a través de lenguajes de
dominio específico como R (estadística), Mathematica
(cómputo simbólico), J y K (análisis financiero).
Utilidad
El objetivo es conseguir lenguajes
expresivos y matemáticamente
elegantes, en los que no sea necesario
bajar al nivel de la máquina para
describir el proceso llevado a cabo por el
programa, y evitar el concepto de estado
del cómputo. La secuencia de
computaciones llevadas a cabo por el
programa se rige única y exclusivamente
por la reescritura de definiciones más
amplias a otras cada vez más concretas y
definidas.
Funciones de primera clase y de orden superior
Funciones de orden superior son funciones que
pueden tomar otras funciones como argumentos
o devolverlos como resultados. En cálculo , un
ejemplo de una función de orden superior es el
operador diferencial d / dx , que devuelve la
derivada de una función f .
Las funciones de orden superior están
estrechamente relacionadas con las
funciones de primera clase en las cuales
las funciones de orden superior y las
funciones de primera clase pueden recibir
como argumentos y resultados otras
funciones. La distinción entre los dos es
sutil: "de orden superior", describe un
concepto matemático de funciones que
operan sobre otras funciones, mientras
que la "primera clase" es un término
informático que describe las entidades
del lenguaje de programación que no
tienen ninguna restricción de su
utilización (por lo tanto funciones de
primera clase pueden aparecer en
cualquier parte del programa que otras
entidades de primer nivel como los
números pueden, incluidos como
argumentos a otras funciones y como sus
valores de retorno).
Las funciones de
orden superior
permiten la
aplicación parcial,
una técnica en la que
se aplica una función
a sus argumentos
uno a la vez, con cada
aplicación devolver
una nueva función
que acepta el
siguiente argumento.
Esto le permite a uno
expresar, por
ejemplo, la función
sucesor como el
operador de suma
aplicada
parcialmente al
número natural uno.
Funciones puras
Las funciones puramente funcionales (o expresiones) no tienen
efectos secundarios (memoria o E/S). Esto significa que las
funciones puras tienen varias propiedades útiles, muchas de las
cuales pueden ser utilizadas para optimizar el código:
Si no se utiliza el resultado de una expresión pura,
se puede eliminar sin afectar a otras expresiones.
Si una función pura se llama con parámetros que no causan efectos
secundarios, el resultado es constante con respecto a la lista de parámetros (a
veces llamada transparencia referencial), es decir, si la función pura se llama
de nuevo con los mismos parámetros, el mismo resultado será devuelto (esto
puede habilitar las optimizaciones de almacenamiento en caché).
Si no hay una dependencia de datos entre dos expresiones puras,
entonces su orden puede ser invertido, o pueden llevarse a cabo en
paralelo y que no pueda interferir con los otros.
Si el lenguaje no permite efectos secundarios, entonces
cualquier estrategia de evaluación se puede utilizar, lo
que da la libertad al compilador para reordenar o
combinar la evaluación de expresiones en un programa
(por ejemplo, usando la poda).
Características
Los programas escritos en un lenguaje
funcional están constituidos únicamente por
definiciones de funciones, entendiendo estas
no como subprogramas clásicos de un lenguaje
imperativo, sino como funciones puramente
matemáticas, en las que se verifican ciertas
propiedades como la transparencia referencial
(el significado de una expresión depende
únicamente del significado de sus
subexpresiones), y por tanto, la carencia total
de efectos colaterales.
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 obliga en la práctica
a que todas las repeticiones de instrucciones se
lleven a cabo por medio de funciones recursivas).
Existen dos grandes categorías de lenguajes funcionales: los funcionales
puros y los híbridos. La diferencia entre ambos estriba en que los
lenguajes funcionales híbridos son menos dogmáticos que los puros, al
admitir conceptos tomados de los lenguajes imperativos, como las
secuencias de instrucciones o la asignación de variables. En contraste,
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.
Ventajas de usar un
paradigma funcional
Ausencia
de
efectos
colaterales.
Proceso
de
depuración
menos
problemático.
Pruebas de
unidades
más
confiables.
Mayor
facilidad para
la ejecución
concurrente.
Programación lógica
La programación lógica es un tipo de paradigmas de programación dentro
del paradigma de programación declarativa. El resto de los subparadigmas
de programación dentro de la programación declarativa son:
programación funcional, programación con restricciones, programas DSL
(de dominio específico) e híbridos. La programación funcional se basa en
el concepto de función (que no es más que una evolución de los
predicados), de corte más matemático. La programación lógica gira en
torno al concepto de predicado, o relación entre elementos.
Históricamente, los ordenadores se han programado utilizando lenguajes muy cercanos a las peculiaridades de la propia máquina: operaciones aritméticas simples,
instrucciones de acceso a memoria, etc. Un programa escrito de esta manera puede ocultar totalmente su propósito a la comprensión de un ser humano, incluso uno
entrenado. Hoy día, estos lenguajes pertenecientes al paradigma de la Programación imperativa han evolucionado de manera que ya no son tan crípticos. En cambio, 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 donde la programación tradicional es un fracaso.
Campos de aplicación
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, donde un programa
genera nuevos teoremas sobre una teoría existente.
Reconocimiento de lenguaje natural, donde un programa es capaz de comprender (con
limitaciones) la información contenida en una expresión lingüística humana.
Conceptos
Un concepto importante de programación lógica es la descomposición de programas en sus componentes lógicos y sus componentes de control.
Con lenguajes de programación lógica de bajo nivel, estos componentes determinan la solución del problema, por eso los componentes de
control pueden variar para proporcionar alternancia de ejecución de un programa lógico. Estos conceptos son capturados con el eslogan
Algoritmo= lógica + control
Donde "lógica" representa un programa lógico y "control" diferentes
estrategias de demostración del teorema.
Solución del Problema
El caso proposicional simplificado en el cual un programa lógico a un nivel superior de reducción atómica no contiene variables
compuestas es un razonamiento que determina un árbol lógico, el cual constituye un espacio de búsqueda para resolver el problema.
El nivel superior es la raíz del árbol. Dado algún nodo en el árbol y alguna cláusula cuya cabecera esta marcada por un nodo, existe un
conjunto de nuevas ramas correspondientes con los objetivos del cuerpo de las cláusulas, aún por reducir. Estas nuevas ramas son
agrupadas juntas por el "y" lógico. El conjunto alternativo correspondiente de estas nuevas ramas está agrupado por el "o" lógico.
Alguna estrategia de búsqueda puede ser usada para la búsqueda del conjunto de proposiciones a resolver. Prolog
es un lenguaje de programación que usa una secuencia, último en entrar primero en salir, para una estrategia de
agrietamiento, en la cual la alternativa y el objetivo son considerados a la vez. Otras estrategias de búsqueda son
por ejemplo la búsqueda paralela o la búsqueda primero-mejor para encontrar una solución óptima.
En el caso más general, donde los objetivos comparten variables, otras estrategias pueden ser usadas, como
por ejemplo puede ser escogido el objetivo más altamente instanciado o el suficientemente instanciado para
lo que implica un procedimiento. Una estrategia actualmente usada es la programación de lógica concurrente.
Ejemplos
Obsérvese que el programa lógico no
solamente es capaz de responder si una
determinada hipótesis es verdadera o falsa.
También es capaz de determinar que valores
de la incógnita hacen cierta la hipótesis.
Este ejemplo es claramente académico.
Sin embargo, consideremos el siguiente
ejemplo: el sistema de control de
semáforos de una ciudad.
El estado de cada uno de los semáforos (verde, rojo o ámbar)
constituye los hechos del mundo real. El programa en sí
consiste en unas pocas reglas de sentido común:
determinados semáforos no pueden permanecer
simultáneamente en verde, un semáforo solamente puede
transitar de verde a ámbar y de ámbar a rojo, etc. La
hipótesis es el estado en el que deberían estar cada uno de
los semáforos en el siguiente instante de tiempo.
Éste es un ejemplo imposible de resolver
mediante programación tradicional, ya que la
lógica subyacente al comportamiento de los
semáforos en su conjunto queda enmascarada
por simples órdenes imperativas del tipo
"cambiar color de tal o cual semáforo".