宣告式編程

宣告式編程（）或译为声明式编程，是對與指令式編程不同的編程範型的一種合稱。它们建造计算机程序的结构和元素，表达计算的逻辑而不用描述它的控制流程。

概述
常見的宣告式語言包括：資料庫查詢語言如SQL的查询子集和，正则表达式，配置管理系统如Puppet管理配置语言。歸入這種範型的很多語言，描述内目標的性質，讓電腦明白目標，而非流程，从而尝试极小化有关的副作用。而指令式编程则需要用来明确的指出每一步该怎么做。

可归入声明式编程范型的领域专属语言（DSL）还包括：yacc语法解析器，编译说明语言Make等。DSL不需要是图灵完全的，往往容易以一种纯声明式的方式来表达。很多文本标记语言例如HTML、MXML、XAML和XSLT往往是声明式的。

定义
声明式编程，通常被定义为除指令式以外的任何编程范型。同时存在一些其他的定义，简单的将宣告式编程和命令式编程做对比，例如：
 告诉计算机需要计算“什么”而不是“如何”去计算的高级程序。
 明确的对应数理逻辑的编程语言。
 任何没有副作用的编程语言，或者更确切一点，任何參照透明的编程语言。

这些定义存在着一些重合。

子编程范型
声明式编程是一个笼统的概念，除了一些特定的领域专属语言之外，一些更加知名的编程范型也被归类为其子范型。

逻辑式编程
逻辑编程通常被看做是形式逻辑的理论，把计算看做推导，透過函數、推理规则或重写規則，來描述變數之間的關係。它的語言執行器（編譯器或解释器）採用了一個固定的算法，以從這些關係產生結果。作为典型代表的Prolog语言，声明关系并且对关系进行提问；它和许多逻辑编程语言，都允许副作用的存在。

函数式编程
函数式编程，尝试最小化带来的副作用，因此可以被归类入宣告式编程，它現在因大幅简化了并行计算的编写难度而备受关注。除了纯函数式编程语言如Haskell，多数函数式编程语言如Scheme、Clojure、OCaml、Standard ML等，允许副作用的存在。

约束式编程
在约束式编程中，变量之间的关系是在约束中说明的，定义了问题的解的范围。这些约束然后被应用程序来求解，以使得每个变量获得一个值，并让最多的约束得到满足。约束式编程经常被用作函数式編程、逻辑编程甚至指令式编程的补充，用来解決人工智能中的約束滿足問題。

參見
（對立的）指令式編程
函數式編程和邏輯編程

參考

外部連結
 Frans Coenen. Characteristics of declarative programming languages. 1999.
.
What, If Anything, Is A Declarative Language? . 2013.
There Is Such A Thing As A Declarative Language, and It’s The World’s Best DSL . 2013.
 Olof Torgersson. A Note on Declarative Programming Paradigms and the Future of Definitional Programming. 1996.

Category:编程范式
Category:宣告式編程