¿Cuál es la diferencia entre los paradigmas de programación declarativa y procedimental?

Respuestas:

108

Imperativo

Hay varios subparadigmas del paradigma de programación imperativa, como los paradigmas de programación procedimental o orientada a objetos.

En el paradigma de programación imperativa, usted describe el algoritmo paso a paso, en varios grados de abstracción.

Ejemplos de lenguajes de programación que admiten el paradigma procedimental:

  • C (y la mayoría de los otros lenguajes heredados)
  • PHP, principalmente
  • En cierto sentido, todos los idiomas principales

Orientado a objetos

Por lo general, se refiere a lenguajes que exhiben una jerarquía de tipos que heredan tanto los métodos como el estado de los tipos base a los tipos derivados, pero también incluye el inusual JavaScript basado en prototipos.

Ejemplos de lenguajes de programación que admiten el paradigma OO:

  • Java

Declarativo

Hay varios subparadigmas del paradigma de programación declarativa, como los paradigmas de programación funcional o lógica.

En el paradigma de programación declarativa, usted describe un resultado o una meta, y lo obtiene a través de una " caja negra ". Lo opuesto al imperativo.

Ejemplos de lenguajes de programación que admiten el paradigma de programación declarativa:

  • yacc
  • Copa del árbol
  • SQL
  • Expresiones regulares
  • Lex
  • XSLT
  • marcado, troff, CSS, VHDL

Funcional

La programación funcional enfatiza la aplicación de funciones sin efectos secundarios y sin estado mutable. Los sistemas declarativos anteriores exhiben ciertos aspectos de la programación funcional.

Ejemplos de lenguajes de programación que admiten el paradigma funcional declarativo:

  • Haskell
  • OCaml
  • Esquema
  • Erlang
  • F#
  • Scala
DigitalRoss
fuente
61

La programación declarativa es donde dices lo que quieres sin tener que decir cómo hacerlo. Con la programación de procedimientos, debe especificar los pasos exactos para obtener el resultado.

Por ejemplo, SQL es más declarativo que procedimental, porque las consultas no especifican los pasos para producir el resultado.

Ned Batchelder
fuente
2
+1 para un buen ejemplo de SQL. ¿Podemos tener más ejemplos por favor?
mauris
5
Mauris: Quizás no sea un lenguaje de programación, pero HTML es declarativo, porque usted describe lo que quiere (un párrafo con este bit en negrita), en lugar de escribir "dibujar cadena, medir cadena, avanzar posición, etc." Otro ejemplo es Prolog, donde un "programa" es un conjunto declarativo de hechos y relaciones / deducciones y una consulta. El motor de Prolog descubre cómo evaluar la consulta: no es necesario que le diga cómo hacerlo. Finalmente, expresiones regulares: describe el patrón en lugar de deletrear los pasos para probar una coincidencia.
itowlson
MXML (parte del marco de Flex) es declarativo: usted le dice en qué orden desea que se muestren sus objetos / contenedores, y maneja el diseño dependiendo de si le ha dicho que se coloque horizontal o verticalmente. ActionScript 3 es de procedimiento con soporte para paradigmas de programación orientada a objetos.
Hurra, estoy ayudando
makefiles es otro lenguaje declarativo bastante famoso
Stefano Borini
25

Déjame darte un ejemplo del mundo real: necesito una taza de té.

Procesal:

  1. Ir a la cocina
  2. Consigue azúcar, leche y té
  3. Mezclar y calentar al fuego hasta que hierva.
  4. Pon eso en una taza y tráemelo

Declarativo:

  1. Tráeme una taza de té.

En un lenguaje procedimental, usted define todo el proceso y proporciona los pasos para hacerlo. Simplemente proporcione pedidos y defina cómo se atenderá el proceso.

En un lenguaje declarativo, simplemente establezca el comando u orden y deje que el sistema indique cómo completar esa orden. Solo necesita su resultado sin profundizar en cómo se debe hacer.

Muhammad Zeeshan Tahir
fuente
2
Este ejemplo extremadamente simplificado realmente me hizo entender (un poco). Pero una cosa todavía me molesta, tratar de entender la diferencia: ¿qué pasa si no hay un comando "Tráeme una taza de té"? ¿Entonces tendrías que crearlo tú mismo? Si es así, ¿no crearía una función similar al ejemplo de procedimiento? Supongo que lo que me confunde es que parece que el procedimiento y el declarativo no son propiedades fijas de ningún lenguaje específico , sino cómo se usa ese lenguaje. Podrías decir "Tráeme una taza de té" en Java, si ese es un método disponible ...
Magnus W
3
Me pregunto si "1. Té, Earl Grey, Caliente" sería un mejor ejemplo. Es declarar lo que se debe entregar, no las acciones que se deben realizar ('Consígueme ...')
JeffUK
Magnus, tu pregunta es absolutamente correcta. En mi opinión, los lenguajes declarativos son lenguajes de más alto nivel y se derivan de procedimientos. ¿Recuerda el momento en que los desarrolladores necesitaban usar líneas de comando para sumar dos números? Ahora puede obtener la SUMA de dos o más números con una simple función. Entonces, en mi perspectiva, si no hay un comando "Tráeme una taza de té", debes crearlo. Cuando la próxima persona intente usar, estará allí. Eso es según mi escaso conocimiento. Gracias
Muhammad Zeeshan Tahir
5

Programación procedimental:

En la programación de procedimientos, cuando el programa se inicia, sigue un conjunto de instrucciones. Las instrucciones pueden cambiar según el contenido de algún archivo o memoria, pero en general, no varía mucho. la entrada al programa normalmente no proviene de la entrada del usuario en tiempo real, sino de un conjunto de datos pre-recopilados.

Programación declarativa:

En la programación impulsada por eventos declarativos se centraliza en torno a un cuerpo de datos con acciones opcionales que el programa puede realizar. Por ejemplo, cada "evento" en un procesador de texto es cualquier cambio de mouse o teclado (o archivo) que afecte los datos, los documentos. No es necesario realizarlas en ningún orden. La programación impulsada por eventos toma la forma de pequeños programas (controladores de eventos) que todos trabajan en un conjunto común de datos, de modo que cada pequeño programa puede usar los mismos datos, el documento en este ejemplo.

SattiS
fuente
1

La principal diferencia entre dos lenguajes de programación es que, en la programación procedimental, le decimos a la computadora cómo resolver el problema y en la programación declarativa, le decimos a la computadora qué problema queremos resolver.

Opalaje de Manodhya
fuente
0

Para abordar el comentario ansible y tal vez proporcionar un ejemplo entre las diferencias de los dos. Ansible es procedimental donde algo como títere o terraform son declarativos. Por ejemplo, crea un archivo yaml ansible para implementar 10 instancias ec2 como esta:
-ec2: count: 10 image: ami-058c6e5b73b074cd2 instance_type: t2.micro

Si tuviera que ejecutar ese archivo dos veces, terminaría con 20 instancias t2.micro ec2. Si escribió el equivalente en un lenguaje declarativo como terraform y lo ejecutó dos veces, solo tendría 10 instancias t2.micro ejecutándose sin importar cuántas veces lo haya ejecutado. Los lenguajes declarativos especifican el estado final. Los lenguajes de procedimiento simplemente hacen lo que usted dice sin tener en cuenta el estado actual o pasado.

usuario13709426
fuente
-1

Entonces, ¿YAML es un lenguaje de programación declarativo? Porque definimos lo que queremos en lugar de escribir la lógica real.

Estoy preguntando esto porque si alguien conoce Ansible, que es una herramienta de administración de configuración, usa YAML pero aún se encuentra en la categoría de lenguaje procedimental.

Sr. Kashyap
fuente
Esto es más como un comentario muy afirmado que no responde
zardilior hace
-2

En el enfoque procedimental, codifica sus instrucciones para lograr el resultado. En el enfoque declarativo, define lo que debe resolverse como el conocimiento para resolver el problema. Eche un vistazo al ejemplo de enfoque de procedimiento o declarativo que implementé en ambos enfoques.

Como verá en el ejemplo, en el enfoque declarativo, no es necesario que indique CÓMO resolver el problema.

Arash Aghlara
fuente
Está haciendo referencia a ejemplos externos como si estuvieran escritos aquí. Traiga sus ejemplos como parte de su respuesta.
ChronoFish