ventajas que programación programacion paradigmas paradigma logico logica lenguajes imperativos imperativa funcional estructurada desventajas declarativa programming-languages declarative glossary

programming-languages - que - programacion logica



¿Qué es la programación declarativa? (18)

Sigo escuchando este término en varios contextos diferentes. ¿Qué es?


Depende de cómo envíe la respuesta al texto. En general, puede ver el programa en una determinada vista, pero depende de qué ángulo mire el problema. Empezaré con el programa: Dim Bus, Car, Time, Height As Integr

De nuevo, depende de cuál es el problema en general.Es posible que deba acortarlo debido al programa. Espero que esto ayude y necesite la retroalimentación si no es así. Gracias.


Describiendo en una computadora lo que quieres, no cómo hacer algo.


Desde que escribí mi respuesta anterior, formulé una nueva definición de la propiedad declarativa que se cita a continuación. También he definido la programación imperativa como la propiedad dual.

Esta definición es superior a la que proporcioné en mi respuesta anterior, porque es sucinta y es más general. Pero puede ser más difícil de asimilar, porque la implicación de los teoremas de incompletitud aplicables a la programación y la vida en general es difícil para los humanos para que puedan pensar.

La explicación citada de la definición discute el papel que juega la programación funcional pura en la programación declarativa.

Declarativo vs. Imperativo

La propiedad declarativa es extraña, obtusa y difícil de capturar en una definición técnicamente precisa que sigue siendo general y no ambigua, porque es una noción ingenua que podemos declarar el significado (también conocido como semántica) del programa sin incurrir en efectos secundarios no deseados. Existe una tensión inherente entre la expresión del significado y la evitación de los efectos no deseados, y esta tensión en realidad se deriva de los teoremas de incompletitud de la programación y nuestro universo.

Es una simplificación excesiva, técnicamente impreciso y, a menudo, ambiguo definir declarativo como " qué hacer " e imperativo como " cómo hacerlo " . Un caso ambiguo es el " qué " es el " cómo " en un programa que genera un programa, un compilador.

Evidentemente, la recursión ilimitada que completa un lenguaje de Turing también es análoga en la semántica, no solo en la estructura sintáctica de la evaluación (también conocida como semántica operacional). Este es lógicamente un ejemplo análogo al teorema de Gödel: " cualquier sistema completo de axiomas también es inconsistente ". Medita sobre la rareza contradictoria de esa cita! También es un ejemplo que demuestra cómo la expresión de la semántica no tiene un límite comprobable, por lo que no podemos probar 2 que un programa (y análogamente su semántica) se detenga también conocido como el teorema de Detención.

Los teoremas de incompletitud derivan de la naturaleza fundamental de nuestro universo, que como se establece en la Segunda Ley de la Termodinámica es " la entropía (también conocida como el número de posibilidades independientes) tiende al máximo para siempre ". La codificación y el diseño de un programa nunca se termina, ¡está vivo! Porque intenta responder a una necesidad del mundo real, y la semántica del mundo real siempre cambia y tiende a tener más posibilidades. Los humanos nunca dejan de descubrir cosas nuevas (incluidos los errores en los programas ;-).

Para capturar con precisión y técnicamente esta noción deseada en este universo extraño que no tiene borde (reflexionar que no hay "afuera" de nuestro universo), se necesita una definición escueta pero engañosamente no simple que suene incorrecta hasta que se explique profundamente.

Definición:

La propiedad declarativa es donde puede existir solo un conjunto posible de enunciados que pueda expresar cada semántica modular específica.

La propiedad imperativa 3 es el dual, donde la semántica es inconsistente bajo la composición y / o puede expresarse con variaciones de conjuntos de enunciados.

Esta definición de declarativa es distintivamente local en el ámbito semántico, lo que significa que requiere que una semántica modular mantenga su significado constante independientemente de dónde y cómo se ejemplifique y se emplee en el ámbito global . Por lo tanto, cada semántica declarativa modular debe ser intrínsecamente ortogonal a todos los demás posibles, y no un algoritmo o modelo global imposible de cumplir (teoremas de incompletitud) para atestiguar consistencia, que es también el tema de " Más no es siempre mejor " de Robert Harper, Profesor de Informática en la Universidad Carnegie Mellon, uno de los diseñadores de Standard ML.

Ejemplos de estas semánticas declarativas modulares incluyen funtores de teoría de categorías, por ejemplo, la tipificación Applicative , nominal, espacios de nombres, campos con nombre, y wrt a nivel operacional de semántica, luego la programación funcional pura.

Así, los lenguajes declarativos bien diseñados pueden expresar más claramente el significado , aunque con cierta pérdida de generalidad en lo que se puede expresar, pero una ganancia en lo que puede expresarse con consistencia intrínseca.

Un ejemplo de la definición mencionada anteriormente es el conjunto de fórmulas en las celdas de un programa de hoja de cálculo, que no se espera que den el mismo significado cuando se mueven a diferentes columnas y celdas de filas, es decir, se cambian los identificadores de celda. Los identificadores de celda son parte del significado pretendido y no son superfluos. Por lo tanto, cada resultado de hoja de cálculo es único wrt para los identificadores de celda en un conjunto de fórmulas. La semántica modular consistente en este caso es el uso de identificadores de celda como la entrada y salida de funciones puras para fórmulas de células (ver a continuación).

Hyper Text Markup Language también conocido como HTML, el lenguaje para páginas web estáticas, es un ejemplo de un lenguaje declarativo altamente (pero no perfectamente 3 ) que (al menos antes de HTML 5) no tenía capacidad para expresar el comportamiento dinámico. HTML es quizás el idioma más fácil de aprender. Para el comportamiento dinámico, un lenguaje de scripting imperativo como JavaScript generalmente se combinaba con HTML. HTML sin JavaScript se ajusta a la definición declarativa porque cada tipo nominal (es decir, las etiquetas) mantiene su significado consistente en la composición dentro de las reglas de la sintaxis.

Una definición competitiva para declarativo es las propiedades commutative e idempotent de los enunciados semánticos, es decir, que los enunciados pueden reordenarse y duplicarse sin cambiar el significado. Por ejemplo, las instrucciones que asignan valores a campos con nombre se pueden reordenar y duplicar sin cambiar el significado del programa, si esos nombres son modulares wrt a cualquier orden implícito. Los nombres a veces implican un orden, por ejemplo, los identificadores de celda incluyen su columna y posición de fila, mover un total en la hoja de cálculo cambia su significado. De lo contrario, estas propiedades implícitamente requieren consistencia global de semántica. En general, es imposible diseñar la semántica de los enunciados para que sean consistentes si se ordenan o se duplican al azar, porque el orden y la duplicación son intrínsecos a la semántica. Por ejemplo, las afirmaciones "Foo existe" (o construcción) y "Foo no existe" (y destrucción). Si uno considera la inconsistencia aleatoria endémica de la semántica prevista, entonces uno acepta esta definición como lo suficientemente general para la propiedad declarativa. En esencia, esta definición es vacua como una definición generalizada porque intenta hacer que la consistencia sea ortogonal a la semántica, es decir, desafiar el hecho de que el universo de la semántica es dinámicamente ilimitado y no puede capturarse en un paradigma de coherencia global .

Exigir las propiedades conmutativas e idempotentes para el (orden de evaluación estructural de) la semántica operacional de nivel inferior convierte la semántica operacional a una semántica modular declarativa localizada , por ejemplo, programación funcional pura (incluida la recursión en lugar de bucles imperativos). Entonces, el orden operacional de los detalles de la implementación no afecta (es decir, se extiende a nivel mundial en) la consistencia de la semántica de nivel superior. Por ejemplo, el orden de evaluación de (y teóricamente también la duplicación) de las fórmulas de la hoja de cálculo no importa porque las salidas no se copian a las entradas hasta después de que se hayan calculado todas las salidas, es decir, análogas a las funciones puras.

C, Java, C ++, C #, PHP y JavaScript no son particularmente declarativos. La sintaxis de Copute y la sintaxis de Python se asocian más declarativamente a los resultados esperados , es decir, una semántica sintáctica consistente que elimina lo extraño para que uno pueda comprender fácilmente el código después de haberlo olvidado. Copute y Haskell imponen el determinismo de la semántica operacional y alientan " no te repitas " (DRY), porque solo permiten el paradigma funcional puro.

2 Incluso cuando podemos demostrar la semántica de un programa, por ejemplo, con el lenguaje Coq, esto se limita a la semántica que se expresa en el tipado , y el tipado nunca puede capturar toda la semántica de un programa, ni siquiera para los idiomas que son no Turing completo, por ejemplo, con HTML + CSS es posible expresar combinaciones inconsistentes que tienen una semántica indefinida.

3 Muchas explicaciones afirman incorrectamente que solo la programación imperativa tiene enunciados ordenados sintácticamente. Aclaré esta confusión entre la programación imperativa y la funcional . Por ejemplo, el orden de las declaraciones HTML no reduce la consistencia de su significado.

Editar: publiqué el siguiente comentario en el blog de Robert Harper:

en la programación funcional ... el rango de variación de una variable es un tipo

Dependiendo de cómo uno distinga la programación funcional de la imperativa, su "asignable" en un programa imperativo también puede tener un tipo que establezca un límite en su variabilidad.

La única definición no confusa que aprecio actualmente para la programación funcional es a) funciona como objetos y tipos de primera clase, b) preferencia por recursión sobre bucles, y / o c) funciones puras, es decir, aquellas funciones que no afectan a la semántica deseada del programa cuando se ha memorizado (por lo tanto, la programación funcional perfectamente pura no existe en una semántica denotacional de propósito general debido a los impactos de la semántica operacional, por ejemplo, asignación de memoria ).

La propiedad idempotente de una función pura significa que la llamada de función sobre sus variables puede ser sustituida por su valor, que generalmente no es el caso para los argumentos de un procedimiento imperativo. Las funciones puras parecen ser declaradas wrt a las transiciones de estado no compuesto entre los tipos de entrada y de resultado.

Pero la composición de las funciones puras no mantiene esa coherencia, porque es posible modelar un proceso imperativo de efecto secundario (estado global) en un lenguaje de programación puramente funcional, por ejemplo, IOMonad de Haskell y, además, es completamente imposible evitarlo en cualquier Turing completa el lenguaje de programación funcional puro.

Como wrote en 2012, que parece ser el consenso similar de los comentarios en su blog reciente , esa programación declarativa es un intento de capturar la noción de que la semántica deseada nunca es opaca. Ejemplos de semántica opaca son la dependencia del orden, la dependencia del borrado de la semántica de nivel superior en la capa de semántica operacional (por ejemplo, los moldes no son conversiones y los genéricos reificados limitan la semántica de nivel superior ) y la dependencia de valores variables que no se pueden verificar (demostrado correcto) por el lenguaje de programación.

Por lo tanto, he llegado a la conclusión de que solo los lenguajes completos que no sean Turing pueden ser declarativos.

Por lo tanto, un atributo inequívoco y distinto de un lenguaje declarativo podría ser que se puede demostrar que su resultado obedece a un conjunto enumerable de reglas generativas. Por ejemplo, para cualquier programa HTML específico (ignorando las diferencias en la forma en que los intérpretes divergen) que no está escrito (es decir, no está completo), entonces su variabilidad de salida puede ser enumerable. O, de manera más sucinta, un programa HTML es una función pura de su variabilidad. Lo mismo ocurre con un programa de hoja de cálculo que es una función pura de sus variables de entrada.

Así que me parece que los lenguajes declarativos son la antítesis de la recursión ilimitada , es decir, por el segundo teorema de incompletitud de Gödel los teoremas autorreferenciales no pueden ser probados.

Lesie Lamport wrote un cuento de hadas sobre cómo Euclid podría haber trabajado alrededor de los teoremas de incompletitud de Gödel aplicados a las pruebas de matemáticas en el contexto del lenguaje de programación por la congruencia entre tipos y lógica (correspondencia de Curry-Howard, etc.).


Es un método de programación basado en describir lo que debería o no debería ser algo en lugar de describir cómo debería funcionar.

En otras palabras, no se escriben algoritmos hechos de expresiones, simplemente se diseña cómo se quiere que sean las cosas. Dos buenos ejemplos son HTML y WPF.

Este artículo de Wikipedia es una buena descripción general: http://en.wikipedia.org/wiki/Declarative_programming


Flojamente:

La programación declarativa tiende a:

  • Conjuntos de declaraciones, o declaraciones declarativas, cada una de las cuales tiene significado (a menudo en el dominio del problema) y se pueden entender de manera independiente y aislada.

La programación imperativa tiende a:

  • Secuencias de comandos, cada uno de los cuales realiza alguna acción; pero que puede o no tener significado en el dominio del problema.

Como resultado, un estilo imperativo ayuda al lector a comprender la mecánica de lo que realmente está haciendo el sistema, pero puede dar poca información sobre el problema que se pretende resolver. Por otro lado, un estilo declarativo ayuda al lector a comprender el dominio del problema y el enfoque que el sistema adopta para la solución del problema, pero es menos informativo sobre la cuestión de la mecánica.

Los programas reales (incluso los escritos en idiomas que favorecen los extremos del espectro, como ProLog o C) tienden a tener ambos estilos presentes en diversos grados en diversos puntos, para satisfacer las complejidades y las necesidades de comunicación de la pieza. Un estilo no es superior al otro; solo sirven para diferentes propósitos y, como ocurre con muchas cosas en la vida, la moderación es la clave.


He refinado mi comprensión de la programación declarativa, desde diciembre de 2011, cuando proporcioné una respuesta a esta pregunta. Aquí sigue mi comprensión actual.

La versión larga de mi comprensión (investigación) se detalla en este enlace , que debe leer para obtener una comprensión profunda del resumen que proporcionaré a continuación.

La programación imperativa es donde se almacena y lee el estado mutable, por lo que el orden y / o la duplicación de las instrucciones del programa pueden alterar el comportamiento (semántica) del programa (e incluso provocar un error, es decir, un comportamiento involuntario).

En el sentido más ingenuo y extremo (que afirmé en mi respuesta anterior), la programación declarativa (DP) evita cualquier estado mutable almacenado, por lo que el orden y / o duplicación de las instrucciones del programa NO puede alterar el comportamiento (semántica) del programa .

Sin embargo, una definición tan extrema no sería muy útil en el mundo real, ya que casi todos los programas involucran un estado mutable almacenado. El ejemplo de la hoja de cálculo se ajusta a esta definición extrema de DP, ya que todo el código del programa se ejecuta por completo con una copia estática del estado de entrada, antes de que se almacenen los nuevos estados. Luego, si se cambia cualquier estado, esto se repite. Pero la mayoría de los programas del mundo real no pueden limitarse a un modelo monolítico de cambios de estado.

Una definición más útil de DP es que el orden y / o la duplicación de las instrucciones de programación no alteran ninguna semántica opaca. En otras palabras, no hay cambios aleatorios ocultos en la semántica que ocurren: cualquier cambio en el orden de las instrucciones del programa y / o la duplicación solo causa cambios intencionales y transparentes al comportamiento del programa.

El siguiente paso sería hablar sobre qué modelos de programación o paradigmas ayudan en DP, pero esa no es la cuestión aquí.


La Programación Declarativa está programando con declaraciones, es decir, oraciones declarativas. Las oraciones declarativas tienen una serie de propiedades que las distinguen de las oraciones imperativas. En particular, las declaraciones son:

  • conmutativa (puede ser reordenada)
  • asociativo (puede reagruparse)
  • idempotente (puede repetirse sin cambio de significado)
  • monotónico (las declaraciones no restan información)

Un punto relevante es que todas estas son propiedades estructurales y son ortogonales a la materia. Declarativo no se trata de "Qué vs. cómo" . Podemos declarar (representar y restringir) un "cómo" tan fácilmente como declaramos un "qué" . Declarativo es sobre estructura, no contenido. La programación declarativa tiene un impacto significativo en cómo abstraemos y refactorizamos nuestro código, y cómo lo modularizamos en subprogramas, pero no tanto en el modelo de dominio.

A menudo, podemos convertir de imperativo a declarativo agregando contexto. Por ejemplo, desde "Gire a la izquierda. (... espere ...) Gire a la derecha". a "Bob doblará a la izquierda en la intersección de Foo and Bar a las 11:01. Bob doblará a la derecha en la intersección de Bar y Baz a las 11:06". Obsérvese que en el último caso las oraciones son idempotentes y conmutativas, mientras que en el primer caso la reorganización o la repetición de las oraciones cambiaría severamente el significado del programa.

En cuanto a las declaraciones monótonas , se pueden agregar restricciones que restan posibilidades . Pero las restricciones aún agregan información (más precisamente, las restricciones son información). Si necesitamos declaraciones variables en el tiempo, es típico modelar esto con semántica temporal explícita, por ejemplo, desde "la pelota es plana" hasta "la pelota es plana en el tiempo T". Si tenemos dos declaraciones contradictorias, tenemos un sistema declarativo inconsistente, aunque esto podría resolverse introduciendo restricciones blandas (prioridades, probabilidades, etc.) o aprovechando una lógica paraconsistente.


La programación declarativa es "el acto de programar en idiomas que se ajustan al modelo mental del desarrollador más que al modelo operativo de la máquina".

La diferencia entre la programación declarativa y la imperativa está bien ilustrada por el problema de analizar datos estructurados.

Un programa imperativo usaría funciones mutuamente recursivas para consumir datos de entrada y generar datos. Un programa declarativo expresaría una gramática que define la estructura de los datos para que luego pueda analizarse.

La diferencia entre estos dos enfoques es que el programa declarativo crea un nuevo lenguaje que está más estrechamente relacionado con el modelo mental del problema que su idioma de acogida.


La programación declarativa es cuando escribe su código de tal manera que describe lo que quiere hacer, y no cómo quiere hacerlo. Depende del compilador averiguar cómo.

Ejemplos de lenguajes de programación declarativos son SQL y Prolog.


La programación declarativa es la imagen, donde la programación imperativa es instrucciones para pintar esa imagen.

Estás escribiendo en un estilo declarativo si estás "Diciéndole lo que es", en lugar de describir los pasos que debe seguir la computadora para llegar a donde lo deseas.

Cuando usa XML para marcar datos, está usando la programación declarativa porque está diciendo "Esta es una persona, es un cumpleaños, y hay una dirección".

Algunos ejemplos de donde la programación declarativa e imperativa se combinan para un mayor efecto:

  • Windows Presentation Foundation usa la sintaxis XML declarativa para describir cómo se ve una interfaz de usuario y cuáles son las relaciones (enlaces) entre los controles y las estructuras de datos subyacentes.

  • Los archivos de configuración estructurados usan sintaxis declarativa (tan simple como pares "clave = valor") para identificar lo que significa una cadena o valor de datos.

  • HTML marca texto con etiquetas que describen qué papel tiene cada pieza de texto en relación con todo el documento.


Las otras respuestas ya hacen un trabajo fantástico al explicar qué es la programación declarativa, así que solo voy a dar algunos ejemplos de por qué podría ser útil.

Contexto Independencia

Los programas declarativos son independientes del contexto . Debido a que solo declaran cuál es el objetivo final, pero no los pasos intermedios para alcanzar ese objetivo, el mismo programa se puede usar en diferentes contextos. Esto es difícil de hacer con los programas imperativos , porque a menudo dependen del contexto (por ejemplo, estado oculto).

Tome yacc como ejemplo. Es un generador de analizadores aka. compilador compilador, una DSL declarativa externa para describir la gramática de un idioma, de modo que un analizador sintáctico para ese idioma pueda generarse automáticamente a partir de la descripción. Debido a su independencia de contexto, puede hacer muchas cosas diferentes con dicha gramática:

  • Genera un analizador C para esa gramática (el caso de uso original para yacc )
  • Genera un analizador de C ++ para esa gramática
  • Genera un analizador de Java para esa gramática (usando Jay)
  • Genera un analizador C # para esa gramática (usando GPPG)
  • Genera un analizador de Ruby para esa gramática (usando Racc)
  • Genera una visualización de árbol para esa gramática (usando GraphViz)
  • simplemente haga una impresión bonita, formateo de lujo y resaltado de sintaxis del archivo fuente de yacc e inclúyalo en su Manual de referencia como una especificación sintáctica de su idioma

Y muchos más …

Mejoramiento

Debido a que no prescribe la computadora qué pasos tomar y en qué orden, puede reorganizar su programa con mucha más libertad, tal vez incluso ejecutar algunas tareas en paralelo. Un buen ejemplo es un planificador de consultas y un optimizador de consultas para una base de datos SQL. La mayoría de las bases de datos SQL le permiten mostrar la consulta que realmente están ejecutando frente a la consulta que les pidió que ejecutaran. A menudo, esas consultas no se parecen una a la otra. El planificador de consultas tiene en cuenta cosas que ni siquiera habría soñado: la latencia rotacional de la bandeja del disco, por ejemplo, o el hecho de que alguna aplicación completamente diferente para un usuario completamente diferente acaba de ejecutar una consulta similar y la tabla que está unirse de y que trabajaste tan duro para evitar la carga ya está en la memoria de todos modos.

Aquí hay una solución interesante: la máquina tiene que trabajar más para descubrir cómo hacer algo de lo que lo haría en un lenguaje imperativo, pero cuando se da cuenta, tiene mucha más libertad y mucha más información para la optimización escenario.


Lo explicaría como DP es una forma de expresar

  • Una expresión de objetivo , las condiciones para lo que estamos buscando. ¿Hay uno, tal vez o muchos?
  • Algunos hechos conocidos
  • Reglas que extienden los hechos conocidos

... y donde hay un motor de deducción que generalmente trabaja con un algoritmo de unificación para encontrar los objetivos.


Lo siento, pero no estoy de acuerdo con muchas de las otras respuestas. Me gustaría detener este malentendido confuso de la definición de programación declarativa.

Definición

La transparencia referencial (RT) de las subexpresiones es el único atributo requerido de una expresión de programación declarativa , porque es el único atributo que no se comparte con la programación imperativa.

Otros atributos citados de la programación declarativa derivan de esta RT. Haga clic en el hipervínculo anterior para obtener una explicación detallada.

Ejemplo de hoja de cálculo

Dos respuestas mencionaron la programación de hoja de cálculo. En los casos en que la programación de la hoja de cálculo (también conocida como fórmulas) no acceda al estado global mutable, entonces se trata de una programación declarativa. Esto se debe a que los valores de celda mutable son la entrada y salida monolítica de main() (todo el programa). Los nuevos valores no se escriben en las celdas después de que se ejecuta cada fórmula, por lo que no se pueden modificar durante la vigencia del programa declarativo (ejecución de todas las fórmulas en la hoja de cálculo). Por lo tanto, en relación con el otro, las fórmulas ven estas células mutables como inmutables. Se permite que una función RT acceda al estado global inmutable (y también al estado local mutable ).

Por lo tanto, la capacidad de mutar los valores en las celdas cuando termina el programa (como una salida de main() ), no los convierte en valores almacenados mutables en el contexto de las reglas. La distinción clave es que los valores de las celdas no se actualizan después de que se realiza cada fórmula de hoja de cálculo, por lo tanto, el orden de realización de las fórmulas no importa. Los valores de celda se actualizan después de que se hayan realizado todas las fórmulas declarativas.


Por lo que puedo decir, comenzó a usarse para describir sistemas de programación como Prolog, porque prolog es (supuestamente) sobre declarar cosas de una manera abstracta.

Significa cada vez más poco, ya que tiene la definición dada por los usuarios de arriba. Debería quedar claro que existe un abismo entre la programación declarativa de Haskell, en contraste con la programación declarativa de HTML.


Puede sonar extraño, pero agregaría Excel (o cualquier hoja de cálculo realmente) a la lista de sistemas declarativos. Un buen ejemplo de esto se da here .


Un par de otros ejemplos de programación declarativa:

  • Etiquetado ASP.Net para enlace de datos. Simplemente dice "llena esta cuadrícula con esta fuente", por ejemplo, y le deja al sistema cómo sucede eso.
  • Expresiones Linq

La programación declarativa es agradable porque puede ayudar a simplificar su modelo mental * de código, y porque eventualmente podría ser más escalable.

Por ejemplo, supongamos que tiene una función que hace algo con cada elemento de una matriz o lista. El código tradicional se vería así:

foreach (object item in MyList) { DoSomething(item); }

No hay gran problema allí. Pero, ¿qué ocurre si usa la sintaxis más declarativa y define DoSomething () como una Acción? Entonces puedes decirlo de esta manera:

MyList.ForEach(DoSometing);

Esto es, por supuesto, más conciso. Pero estoy seguro de que tiene más preocupaciones que simplemente guardar dos líneas de código aquí y allá. Rendimiento, por ejemplo. La forma antigua, el procesamiento tenía que hacerse en secuencia. ¿Qué sucede si el método .ForEach () tiene una forma de indicarle que puede manejar el procesamiento en paralelo, automáticamente? Ahora, de repente, ha hecho que su código tenga múltiples subprocesos de una manera muy segura y solo haya cambiado una línea de código. Y, de hecho, hay una extension para .Net que te permite hacer eso.

  • Si sigues ese enlace, te lleva a una publicación de blog de un amigo mío. La publicación completa es un poco larga, pero puedes desplazarte hacia abajo hasta el encabezado titulado "El problema" _y recogerlo allí no hay problema. *

imagina una página de excel Con columnas pobladas con fórmulas para calcular su declaración de impuestos.

Toda la lógica se hace declarada en las celdas, el orden del cálculo se determina por la propia fórmula en lugar de por el procedimiento.

De eso es de lo que se trata la programación declarativa. Usted declara el espacio problemático y la solución en lugar del flujo del programa.

Prolog es el único lenguaje declarativo que uso. Requiere un tipo de pensamiento diferente, pero es bueno aprender solo para exponerlo a algo que no sea el típico lenguaje de programación de procedimientos.


Aquí hay un ejemplo.

En CSS (utilizado para diseñar páginas HTML), si quiere que un elemento de imagen tenga 100 píxeles de alto y 100 de ancho, simplemente "declara" que eso es lo que quiere de la siguiente manera:

#myImageId { height: 100px; width: 100px; }

Puede considerar CSS un lenguaje declarativo de "hoja de estilo".

El motor del navegador que lee e interpreta este CSS es libre de hacer que la imagen parezca tan alta y tan amplia como lo desee. Diferentes motores de navegador (por ejemplo, el motor para IE, el motor para Chrome) implementarán esta tarea de manera diferente.

Sus implementaciones únicas, por supuesto, NO están escritas en un lenguaje declarativo sino en un procedimiento como Assembly, C, C ++, Java, JavaScript o Python. Ese código es un conjunto de pasos que se llevarán a cabo paso a paso (y podrían incluir llamadas a funciones). Podría hacer cosas como interpolar valores de píxeles y representar en la pantalla.