¿Cuál es la diferencia entre programación declarativa e imperativa? [cerrado]

541

He estado buscando en la web una definición de programación declarativa e imperativa que me aclare algo. Sin embargo, el lenguaje utilizado en algunos de los recursos que he encontrado es desalentador, por ejemplo, en Wikipedia . ¿Alguien tiene un ejemplo del mundo real que pueda mostrarme que pueda aportar alguna perspectiva a este tema (tal vez en C #)?

Puntilla
fuente
3
Imperativo va a un restaurante y ordena 6oz. filete (cocido raro), papas fritas (con salsa de tomate), una ensalada (con rancho) y una Coca-Cola (sin hielo). El camarero entrega exactamente lo que pidió, y le cobraron $ 14.50. Por otro lado, Declarative va a un restaurante y le dice al camarero que solo quiere pagar alrededor de 12 dólares por la cena, y que está de humor para comer carne. El mesero regresa con un 6oz. filete (medio cocido), un lado de puré de papas, brócoli al vapor, un panecillo y un vaso de agua. Le cobraron $ 11.99.
cs_pupil

Respuestas:

786

Un gran ejemplo de C # de programación declarativa versus imperativa es LINQ.

Con la programación imperativa , le dice al compilador lo que quiere que suceda, paso a paso.

Por ejemplo, comencemos con esta colección y elija los números impares:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

Con una programación imperativa, deberíamos pasar por esto y decidir qué queremos:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

Aquí estamos diciendo:

  1. Crea una colección de resultados
  2. Recorre cada número de la colección.
  3. Verifique el número, si es impar, agréguelo a los resultados

Con la programación declarativa , por otro lado, escribes código que describe lo que quieres, pero no necesariamente cómo obtenerlo (declara los resultados deseados, pero no paso a paso):

var results = collection.Where( num => num % 2 != 0);

Aquí, estamos diciendo "Danos todo donde sea extraño", no "Pasar por la colección. Marque este elemento, si es extraño, agréguelo a una colección de resultados".

En muchos casos, el código también será una mezcla de ambos diseños, por lo que no siempre es en blanco y negro.

Reed Copsey
fuente
8
+1. Sin embargo, primero mencionas LINQ, pero ¿qué tienen que ver los ejemplos con eso?
Zano el
15
colección. Dónde se utilizan los métodos de extensión declarativos de LINQ. No está utilizando las características del lenguaje C #, sino más bien la API declarativa. No quería mezclar mensajes aquí, razón por la cual evité las adiciones de lenguaje construidas sobre los métodos declarativos.
Reed Copsey
242
Me parece que la programación declarativa no es más que una capa de abstracción.
Drazen Bjelovuk
8
Esta es una buena respuesta, pero responde a la diferencia entre la programación impura funcional e imperativa. collection.Whereno utiliza la sintaxis declarativa que proporciona Linq; consulte msdn.microsoft.com/en-us/library/bb397906.aspx para ver ejemplos, from item in collection where item%2 != 0 select itemsería la forma declarativa. Llamar a una función no se convierte en programación declarativa solo porque esa función está en el espacio de nombres System.Linq.
Pete Kirkham
30
@PeteKirkham La sintaxis que usa no es el problema: declarativo versus imperativo se trata más de declarar lo que quiere que suceda que de explicar exactamente cómo debe ocurrir. El uso de la sintaxis integrada o la sintaxis del método de extensión es un tema aparte.
Reed Copsey
145

La programación declarativa es cuando dices lo que quieres, y el lenguaje imperativo es cuando dices cómo obtener lo que quieres.

Un ejemplo simple en Python:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

El primer ejemplo es declarativo porque no especificamos ningún "detalle de implementación" para construir la lista.

Para vincular un ejemplo de C #, generalmente, usar LINQ resulta en un estilo declarativo, porque no está diciendo cómo obtener lo que desea; solo dices lo que quieres. Se podría decir lo mismo sobre SQL.

Una ventaja de la programación declarativa es que permite que el compilador tome decisiones que podrían dar como resultado un código mejor que el que podría tomar a mano. Ejecutando con el ejemplo de SQL, si tuviera una consulta como

SELECT score FROM games WHERE id < 100;

el "compilador" de SQL puede "optimizar" esta consulta porque sabe que ides un campo indexado, o tal vez no está indexado, en cuyo caso tendrá que iterar sobre todo el conjunto de datos de todos modos. O tal vez el motor SQL sabe que este es el momento perfecto para utilizar los 8 núcleos para una búsqueda paralela rápida. Usted , como programador, no está preocupado por ninguna de esas condiciones, y no tiene que escribir su código para manejar ningún caso especial de esa manera.

Mark Rushakoff
fuente
30
Ese ejemplo de Python NO ES declarativo.
Juanjo Conti el
18
@Juanjo: ES decalativo.
missingfaktor
3
¿Cómo es la primera declaración aquí más declarativa que la segunda?
zenna
17
De acuerdo con Juanjo y zenna: una construcción de bucle no se transforma mágicamente en un programa declarativo cuando se refactoriza en una notación más corta.
Felix Frank
11
No estoy de acuerdo con @FelixFrank, e inclinándome hacia la declaración "audaz" de @ missingfaktor. La forma tradicional y totalmente declarativa de hacer esto esfilter(lambda x: x < 5, range(20)) es simplemente otra refactorización en una notación más corta. Esto no es de ninguna manera significativa diferente de la expresión de comprensión de la lista (que tiene secciones claras de "mapa" y "filtro"), que fue creada (ver pep 202 ) con la intención explícita de crear una notación más concisa. Y esta comprensión de la lista sería más clara / idiomática en este caso.
yoniLavi
100

Declarativo versus imperativo

Un paradigma de programación es un estilo fundamental de programación de computadoras. Hay cuatro paradigmas principales: imperativo, declarativo, funcional (que se considera un subconjunto del paradigma declarativo) y orientado a objetos.

Programación declarativa : es un paradigma de programación que expresa la lógica de un cálculo (Qué hacer) sin describir su flujo de control (Cómo hacerlo). Algunos ejemplos bien conocidos de lenguajes específicos de dominio declarativo (DSL) incluyen CSS, expresiones regulares y un subconjunto de SQL (consultas SELECT, por ejemplo) Muchos lenguajes de marcado como HTML, MXML, XAML, XSLT ... a menudo son declarativos. La programación declarativa intenta difuminar la distinción entre un programa como un conjunto de instrucciones y un programa como una afirmación sobre la respuesta deseada.

Programación imperativa : es un paradigma de programación que describe la computación en términos de declaraciones que cambian el estado de un programa. Los programas declarativos pueden verse de manera dual como comandos de programación o aserciones matemáticas.

Programación funcional: es un paradigma de programación que trata la computación como la evaluación de funciones matemáticas y evita el estado y los datos mutables. Enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativo, que enfatiza los cambios de estado. En un lenguaje funcional puro, como Haskell, todas las funciones no tienen efectos secundarios, y los cambios de estado solo se representan como funciones que transforman el estado.

El siguiente ejemplo de programación imperativa en MSDN , recorre los números del 1 al 10 y encuentra los números pares.

var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's odd"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);

Ambos ejemplos producen el mismo resultado, y uno no es ni mejor ni peor que el otro. El primer ejemplo requiere más código, pero el código es comprobable y el enfoque imperativo le brinda control total sobre los detalles de implementación. En el segundo ejemplo, el código es posiblemente más legible; sin embargo, LINQ no le da control sobre lo que sucede detrás de escena. Debe confiar en que LINQ proporcionará el resultado solicitado.

AliKarimi
fuente
77
¿Se puede agregar una descripción orientada a objetos?
mbigras
54

Todas las respuestas anteriores y otras publicaciones en línea mencionan lo siguiente:

  • Con declarativa programación , usted escribe código que describe lo que quiere, pero no necesariamente cómo obtenerlo.
  • Debería preferir la programación declarativa sobre la programación imperativa.

Lo que no nos han dicho es cómo lograrlo . Para que una parte del programa sea más declarativa, otras partes deben proporcionar la abstracción para ocultar los detalles de implementación (que son los códigos imperativos ).

  • Por ejemplo, LINQ es más declarativo que los bucles (para, while, etc.), por ejemplo, puede usar list.Where()para obtener una nueva lista filtrada. Para que esto funcione, Microsoft ha hecho todo el trabajo pesado detrás de la abstracción LINQ.

De hecho, una de las razones por las que la programación funcional y las bibliotecas funcionales son más declarativas es porque han abstraído los bucles y las creaciones de la lista, ocultando todos los detalles de implementación (probablemente códigos imperativos con bucles) detrás de escena.

En cualquier programa, siempre tendrá códigos imperativos y declarativos, lo que debe buscar es ocultar todos los códigos imperativos detrás de las abstracciones, para que otras partes del programa puedan usarlos declarativamente .

Finalmente, aunque la programación funcional y LINQ pueden hacer que su programa sea más declarativo, siempre puede hacerlo aún más declarativo al proporcionar más abstracciones. Por ejemplo:

// JavaScript example

// Least declarative
const bestProducts = [];
for(let i = 0; i < products.length; i++) {
    let product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}


// More declarative
const bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
const bestProducts = getBestProducts();

PD: el extremo de la programación declarativa es inventar nuevos lenguajes específicos de dominio (DSL):

  1. Búsqueda de cadenas : expresión regular en lugar de código imperativo personalizado
  2. React.js : JSX en lugar de manipulación directa de DOM
  3. AWS CloudFormation : YAML en lugar de CLI
  4. Base de datos relacional : SQL en lugar de API de lectura y escritura anteriores, como ISAM o VSAM.
fuerza de motor
fuente
Hay muchos buenos ejemplos de programaciones declarativas: React , CloudFormation , Terraform
engineforce
¿Entonces la programación "declarativa" solo significa mover el código que hace el trabajo a una función?
Guillaume F.
@GuillaumeF. Se trata de crear la abstracción específica del dominio. Por ejemplo, - en la banca: se debe crear funciones tales como debit, deposit, etc., en lugar de repetir código imparativaaccount.balance += depositAmount
engineforce
44

Agregaré otro ejemplo que rara vez aparece en la discusión de programación declarativa / imperativa: ¡la interfaz de usuario!

En C #, puede crear una interfaz de usuario utilizando diversas tecnologías.

En el extremo imperativo, puede usar DirectX u OpenGL para dibujar sus botones, casillas de verificación, etc ... línea por línea (o realmente, triángulo por triángulo). Depende de usted decir cómo dibujar la interfaz de usuario.

Al final declarativo, tienes WPF. Básicamente escribes algo de XML (sí, sí, "XAML" técnicamente) y el marco hace el trabajo por ti. Usted dice cómo se ve la interfaz de usuario. Depende del sistema descubrir cómo hacerlo.

De todos modos, solo otra cosa en que pensar. El hecho de que un idioma sea declarativo o imperativo no significa que no tenga ciertas características del otro.

Además, un beneficio de la programación declarativa es que el propósito generalmente se entiende más fácilmente al leer el código, mientras que el imperativo le brinda un control más preciso sobre la ejecución.

La esencia de todo:

Declarativo -> whatquieres hacerlo

Imperativo -> howquieres que se haga

Erich Mirabal
fuente
27

Me gustó una explicación de un curso de Cambridge + sus ejemplos:

  • Declarativo : especifique qué hacer, no cómo hacerlo
    • Por ejemplo: HTML describe lo que debe aparecer en una página web, no cómo debe dibujarse en la pantalla
  • Imperativo : especifique qué y cómo
    • int x; - qué (declarativo)
    • x=x+1; - cómo
RUMANIA_ingeniero
fuente
"no cómo debería dibujarse en la pantalla" ... ¿Entonces eso implica que CSSes imperativo ?
Chef_Code
11
No. También se puede considerar declarativo porque solo dice lo que quiere: "haga que este borde de la celda sea azul" . Imagine que desea dibujar el mismo borde en un enfoque imperativo (por ejemplo, JavaScript). Luego debe decir "ir al punto (x1, y1), dibujar una línea azul entre este punto y (x2, y1), dibujar una línea azul desde (x2, y1) a (x2, y2), dibujar una línea azul de (x2, y2) a (x1, y2), dibuja una línea azul de (x1, y2) a (x1, y1) " .
ROMANIA_engineer
@ROMANIA_engineer, ¿dónde puedo encontrar ese curso de Cambridge, por favor?
equipo de prueba
@testteam, busque el siguiente "cl.cam.ac.uk teaching ooprog" en Google. Puedes cambiar los años desde la URL.
ROMANIA_engineer
@ROMANIA_engineer, lo tengo, gracias
equipo de prueba
26

La diferencia tiene que ver principalmente con el nivel general de abstracción. Con la declaración, en algún momento, está tan lejos de los pasos individuales que el programa tiene mucha libertad con respecto a cómo obtener su resultado.


Podrías ver cada instrucción como si cayera en algún lugar en un continuo:

Grado de abstracción:

Declarative <<=====|==================>> Imperative

Ejemplo declarativo del mundo real:

  1. Bibliotecario, por favor, míreme una copia de Moby Dick. (El bibliotecario, a su discreción, elige el mejor método para realizar la solicitud)

Ejemplo imperativo del mundo real:

  1. Ir a la biblioteca
  2. Buscar sistema de organización de libros (Catálogo de tarjetas - Old school)
  3. Investigue cómo usar los catálogos de tarjetas (también lo olvidó, correcto)
  4. Descubre cómo se etiquetan y organizan los estantes.
  5. Descubre cómo se organizan los libros en un estante.
  6. Ubicación del libro de referencia cruzada del catálogo de tarjetas con el sistema de organización para encontrar dicho libro.
  7. Lleve el libro al sistema de salida.
  8. Mira el libro.
Lucent Fox
fuente
¿No se trata más de abstracción que de declarativo / imperativo? Todavía está instruyendo al bibliotecario para que traiga el libro.
kamathln
Respuesta actualizada para ser más completa e incluir este aspecto en la solución.
Lucent Fox
3
Hay algo de verdad en esto, pero no es una definición completa. Con la programación declarativa estás estableciendo el objetivo final, sin tener en cuenta el punto de partida. Con la programación imperativa, un punto de inicio definido es importante. Es como la diferencia de dar una dirección frente a dar direcciones. La dirección es útil, no importa lo que seas. Mientras que las instrucciones no son válidas si comienza en otro lugar.
Cthutu
24

La programación imperativa requiere que los desarrolladores definan paso a paso cómo se debe ejecutar el código. Para dar instrucciones de manera imperativa, usted dice: "Vaya a 1st Street, gire a la izquierda en Main, conduzca dos cuadras, gire a la derecha en Maple y pare en la tercera casa a la izquierda". La versión declarativa puede sonar así: "Conduce a la casa de Sue". Uno dice cómo hacer algo; el otro dice lo que hay que hacer.

El estilo declarativo tiene dos ventajas sobre el estilo imperativo:

  • No obliga al viajero a memorizar una larga serie de instrucciones.
  • Permite al viajero optimizar la ruta cuando sea posible.

Calvert, C Kulkarni, D (2009). LINQ esencial. Addison Wesley. 48)

GorkemHalulu
fuente
11

La programación imperativa es decirle a la computadora explícitamente qué hacer y cómo hacerlo, como especificar el orden y tal

C#:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

Declarativo es cuando le dices a la computadora qué hacer, pero no cómo hacerlo. Datalog / Prolog es el primer idioma que viene a la mente a este respecto. Básicamente todo es declarativo. Realmente no puedes garantizar el pedido.

C # es un lenguaje de programación mucho más imperativo, pero ciertas características de C # son más declarativas, como Linq

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

Lo mismo podría escribirse imperativamente:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(ejemplo de wikipedia Linq)

McKay
fuente
2
Tiene un error tipográfico: las declaraciones de linq son declarativas, no imperitivas (tiene "Las características de C # son más imperativas, como Linq" debería leer declarativo.
Reed Copsey
Corregido (hace algún tiempo)
McKay
8

En informática, la programación declarativa es un paradigma de programación que expresa la lógica de un cálculo sin describir su flujo de control.

De http://en.wikipedia.org/wiki/Declarative_programming

en pocas palabras, el lenguaje declarativo es más simple porque carece de la complejidad del flujo de control (bucles, sentencias if, etc.)

Una buena comparación es el modelo de "código subyacente" ASP.Net. Tiene archivos declarativos '.ASPX' y luego los archivos de código imperativo 'ASPX.CS'. A menudo encuentro que si puedo hacer todo lo que necesito en la mitad declarativa del guión, mucha más gente puede seguir lo que se está haciendo.

Kervin
fuente
7

Robando a Philip Roberts aquí :

  • La programación imperativa le dice a la máquina cómo hacer algo (lo que resulta en lo que quiere que suceda)
  • La programación declarativa le dice a la máquina lo que le gustaría que suceda (y la computadora descubre cómo hacerlo)

Dos ejemplos:

1. Duplicar todos los números en una matriz

Imperativamente:

var numbers = [1,2,3,4,5]
var doubled = []

for(var i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push(newNumber)
}
console.log(doubled) //=> [2,4,6,8,10]

Declarativamente:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

2. Sumar todos los artículos en una lista

Imperativo

var numbers = [1,2,3,4,5]
var total = 0

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15

Declarativamente

var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) {
  return sum + n
});
console.log(total) //=> 15

Observe cómo los ejemplos imperativos implican crear una nueva variable, mutarla y devolver ese nuevo valor (es decir, cómo hacer que algo suceda), mientras que los ejemplos declarativos se ejecutan en una entrada dada y devuelven el nuevo valor en función de la entrada inicial (es decir, , lo que queremos que suceda).

Chris Eaves-Kohlbrenner
fuente
55
Al igual que con muchas respuestas a esta pregunta, su ejemplo de programación 'declarativa' es un ejemplo de programación funcional. La semántica de 'mapa' es 'aplicar esta función a los elementos de la matriz en orden'. No está permitiendo que el tiempo de ejecución tenga margen de maniobra en el orden de ejecución.
Pete Kirkham
4

Programación imperativa
Un lenguaje de programación que requiere disciplina de programación como C / C ++, Java, COBOL, FORTRAN, Perl y JavaScript. Los programadores que escriben en dichos lenguajes deben desarrollar un orden de acciones adecuado para resolver el problema, basado en el conocimiento del procesamiento y la programación de datos.

Programación declarativa
Un lenguaje de computadora que no requiere escribir lógica de programación tradicional; Los usuarios se concentran en definir la entrada y la salida en lugar de los pasos del programa requeridos en un lenguaje de programación de procedimientos como C ++ o Java.

Ejemplos de programación declarativa son CSS, HTML, XML, XSLT, RegX.

Premraj
fuente
2

el programa declarativo es solo un dato para su implementación imperativa más o menos "universal" / vm.

ventajas: especificar solo un dato, en un formato codificado (y verificado), es más simple y menos propenso a errores que especificar directamente la variante de algún algoritmo imperativo. algunas especificaciones complejas no pueden escribirse directamente, solo en alguna forma DSL. best y freq utilizados en las estructuras de datos DSL son conjuntos y tablas. porque no tienes dependencias entre elementos / filas. y cuando no tiene dependencias tiene libertad para modificar y facilidad de soporte. (compare, por ejemplo, módulos con clases: con módulos que le satisfacen y con clases que tiene un problema de clase base frágil) todos los bienes de declaratividad y DSL se deducen inmediatamente de los beneficios de esas estructuras de datos (tablas y conjuntos). Otra ventaja: puede cambiar la implementación del lenguaje declarativo vm, si DSL es más o menos abstracto (bien diseñado). hacer implementación paralela, por ejemplo.

desventajas: adivinas bien. La implementación de algoritmo / vm imperativo genérico (y parametrizado por DSL) puede ser más lenta y / o hambrienta de memoria que la específica. en algunos casos. Si ese caso es raro, solo olvídalo, deja que sea lento. si es frecuente, siempre puede extender su DSL / vm para ese caso. en algún lugar ralentizando todos los demás casos, claro ...

PS Frameworks está a medio camino entre DSL e imperativo. y como todas las soluciones intermedias ... combinan deficiencias, no beneficios. no son tan seguros Y no tan rápidos :) mire el haskell de Jack-of-all-trades: está a medio camino entre el ML simple fuerte y el metaprog flexible Prolog y ... qué monstruo es. puedes ver a Prolog como un Haskell con funciones / predicados booleanos solamente. y cuán simple es su flexibilidad contra Haskell ...

4KCheshireCat
fuente
2

Me pregunto por qué nadie ha mencionado las clases de atributos como una herramienta de programación declarativa en C #. La respuesta popular de esta página acaba de hablar de LINQ como una herramienta de programación declarativa.

De acuerdo con Wikipedia

Los lenguajes declarativos comunes incluyen los lenguajes de consulta de bases de datos (p. Ej., SQL, XQuery), expresiones regulares, programación lógica, programación funcional y sistemas de gestión de configuración.

Entonces LINQ, como sintaxis funcional, es definitivamente un método declarativo, pero las clases de atributos en C #, como herramienta de configuración, también son declarativas. Aquí hay un buen punto de partida para leer más al respecto: Descripción rápida de la programación de atributos de C #

Siavash Mortazavi
fuente
Este es un buen punto y un ejemplo más obvio, creo. Cosas como linq todavía pueden parecer imperativas, por lo que es confuso para las personas que no conocen la diferencia, pero los atributos son difíciles de ver de otra manera que no sea declarativa. "etiqueta" a los miembros para declarar lo que quieres que les hagamos, pero no estás diciendo el cómo en ningún sentido. Puedo ver cómo alguien podría decir una consulta linq todavía es como decir el cómo porque en algún nivel estás describiendo un forma de lógica que simplemente no es tan pesada, pero con atributos que no estás describiendo ninguna lógica en absoluto. Solo estás etiquetando cosas
user441521
2

Solo para agregar otro ejemplo en términos de desarrollo de aplicaciones móviles. En iOS y Android, tenemos Interface Builders, donde podemos definir la interfaz de usuario de las aplicaciones.

La interfaz de usuario dibujada con estos Constructores es de naturaleza declarativa, donde arrastramos y soltamos los componentes. El dibujo real ocurre debajo y realizado por el marco y el sistema.

Pero también podemos dibujar todos los componentes en código, y eso es imprescindible por naturaleza.

Además, algunos idiomas nuevos como Angular JS se están centrando en el diseño de interfaces de usuario declarativamente y es posible que veamos muchos otros idiomas que ofrecen el mismo soporte. Al igual que Java no tiene una buena forma declarativa de dibujar aplicaciones de escritorio nativas en Java swing o Java FX, pero en el futuro cercano, tal vez sí.

Puneet Sharma
fuente
Java no es un acrónimo BTW
Mordechai
1

Según tengo entendido, ambos términos tienen raíces en la filosofía, hay tipos de conocimiento declarativos e imperativos. El conocimiento declarativo son afirmaciones de verdad, declaraciones de hecho como axiomas matemáticos. Te dice algo. El conocimiento imperativo, o de procedimiento, le dice paso a paso cómo llegar a algo. Esa es esencialmente la definición de un algoritmo. Si lo desea, compare un lenguaje de programación de computadora con el idioma inglés. Las oraciones declarativas dicen algo. Un ejemplo aburrido, pero aquí hay una forma declarativa de mostrar si dos números son iguales entre sí, en Java:

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}

Las oraciones imperativas en inglés, por otro lado, dan una orden o hacen algún tipo de solicitud. La programación imperativa, entonces, es solo una lista de comandos (hacer esto, hacer aquello). Aquí hay una forma imperativa de mostrar si dos números son iguales entre sí o no al aceptar la entrada del usuario, en Java:

private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}

Esencialmente, el conocimiento declarativo omite ciertos elementos para formar una capa de abstracción sobre esos elementos. La programación declarativa hace lo mismo.

Matthew Conrad
fuente