在计算机科学中,声明式编程是一种编程范式,即构建计算机程序的结构和元素的一种风格,它表达了计算的逻辑而没有描述其控制流程。
定义
声明式编程通常被定义为任何不是必须的编程风格。还有其他一些常见的定义,试图给这个术语一个定义,而不是简单地将它与命令式编程对比。例如:
a.一个描述计算应该执行的高级程序。
b.任何缺乏副作用的编程语言(或者更具体地说,都是引用透明的)
c.与数学逻辑对应的语言。
这些定义基本上重叠。声明式编程与命令式和程序式编程形成对比。声明式编程是一种非必要的编程风格,其中程序在不明确列出必须执行的命令或步骤的情况下描述其预期结果。功能和逻辑编程语言的特点是声明式编程风格。在逻辑编程语言中,程序由逻辑语句组成,程序通过搜索语句的证明来执行。
在纯粹的函数式语言中,比如Haskell,所有的函数都没有副作用,而状态变化只是表现为转换状态的函数,状态被明确表示为程序中的第一类对象。尽管纯粹的功能语言不是必需的,但它们通常提供一种功能描述作为一系列步骤的功能。其他函数式语言,如Lisp,OCaml和Erlang支持程序和函数式编程的混合。
一些逻辑编程语言(如Prolog)和数据库查询语言(如SQL)虽然原则上是声明性的,但也支持程序式编程风格。
编程
声明性编程是一个总括性术语,包括许多更为人熟知的编程范例。
约束编程
约束编程以指定目标解决方案属性的约束形式表示变量之间的关系。通过给每个变量赋予一个值来解决这组约束,以便解决方案与约束的最大数目一致。约束规划经常补充其他范式:功能性,逻辑性甚至是命令式编程。
特定于域的语言
众所周知的声明性域特定语言(DSL)的示例包括yacc解析器生成器输入语言,QML,Make构建规范语言,Puppet的配置管理语言,正则表达式和SQL的子集(例如,SELECT查询)。 DSL具有非常有用的优点,但不一定需要Turing-complete,这使得语言更容易纯粹是声明性的。
许多标记语言(如HTML,MXML,XAML,XSLT或其他用户界面标记语言)通常都是声明式的。例如,HTML仅描述网页上应显示的内容 - 它既不指定呈现页面的控制流,也不指定页面与用户可能的交互。
截至2013年,一些软件系统将传统的用户界面标记语言(例如HTML)与声明性标记相结合,声明性标记定义了后端服务器系统应该做什么(但不是如何)以支持声明的接口。这种系统通常使用特定于域的XML名称空间,可能包括SQL数据库语法的抽象或使用表示状态传输(REST)和SOAP对
Web服务的参数化调用。
混合语言
例如,Makefiles以声明方式指定了依赖关系,但也包括一个必要的行动列表。同样,yacc声明式地指定了一个上下文无关语法,但是包含来自宿主语言的代码片断,这通常是必要的(比如C)。
逻辑编程
逻辑编程语言,如Prolog状态和查询关系。回答这些查询的具体细节取决于实现及其定理证明,但通常采取某种形式的统一。像函数式编程一样,许多逻辑编程语言都允许有副作用,因此不是严格声明式的。
建模
物理系统的模型或数学表示可以在声明性的计算机代码中实现。该代码包含许多描述(“声明”)行为关系的等式,而不是强制性的任务。当一个模型用这种形式表达时,计算机能够执行代数操作来最好地制定解决方案算法。数学因果关系通常强加于物理系统的边界,而系统本身的行为描述则是声明性的或非因果性的。声明式建模语言和环境包括Analytica,Modelica和Simile。