声明式和过程式编程范例之间有什么区别?


Answers:


108

势在必行

命令式编程范式有几个子范式,例如过程式面向对象的编程范式。

在命令式编程范例中,您将以各种抽象程度逐步描述算法。

支持过程范例的编程语言示例:

  • C(和大多数其他旧版语言)
  • PHP,主要是
  • 从某种意义上说,所有主要语言

面向对象

它通常是指表现出类型层次结构的语言,这些类型既继承方法又继承从基本类型到派生类型的状态,但还包括基于原型的JavaScript。

支持OO范例的编程语言示例:

  • 爪哇

陈述式

声明性编程范式有几个子范式,例如功能或逻辑编程范式。

在声明式编程范例中,您描述一个结果或一个目标,并通过“ 黑匣子 ” 获得它。的相对势在必行。

支持声明性编程范例的编程语言示例:

  • yacc
  • 树梢
  • 的SQL
  • 常用表达
  • 莱克斯
  • XSLT
  • 标记,troff,CSS,VHDL

功能性

函数式编程强调没有副作用且没有可变状态的函数的应用。上面的声明性系统展现了功能编程的某些方面。

支持声明性功能范例的编程语言示例:

  • 哈斯克尔
  • OCaml
  • 方案
  • Erlang
  • F#
  • 斯卡拉

61

声明式编程是您说出所需内容而不必说如何做的地方。使用过程编程,您必须指定确切的步骤才能获得结果。

例如,SQL比程序性更具声明性,因为查询未指定产生结果的步骤。


2
+1是有关SQL的好例子。请给我们更多例子吗?
09年

5
Mauris:也许不是一种编程语言,但是HTML是声明,因为你描述你想要什么(有一段该位粗体),而不是写了“画线,测量弦,提前位置,等等。” 另一个例子是Prolog,其中“程序”是一组声明性的事实和关系/推论,以及一个查询。Prolog引擎指出了如何评估查询:您无需告诉它如何进行评估。最后,是正则表达式:您描述模式而不是拼写测试匹配的步骤。
itowlson

MXML(Flex框架的一部分)是声明性的:您告诉它要显示对象/容器的顺序,并根据您告诉它是水平放置还是垂直放置来处理布局。ActionScript 3是具有OOP范例支持的过程。
Hooray Im帮助

makefiles是另一种非常著名的声明性语言
Stefano Borini,2009年

25

让我给你一个现实的例子:我需要一杯茶。

程序:

  1. 去厨房
  2. 拿糖,牛奶和茶,
  3. 混合它们,然后在火上加热直到沸腾
  4. 把它放在杯子里拿给我

声明式:

  1. 给我喝杯茶。

使用过程语言,您可以定义整个过程并提供执行步骤。您只需要提供订单并定义将如何处理流程即可。

用声明性语言,您只需设置命令或命令,并让它在系统上完成该命令的方式即可。您只需要您的结果,而无需深入研究应如何做。


2
这个极其简化的示例实际上使我明白了这一点。但是,有一件事仍然困扰着我,试图理解它们之间的区别-如果没有“给我喝杯茶”的命令怎么办?然后,您需要自己创建它吗?如果是这样,您是否会创建一个类似于过程示例的函数?我想让我感到困惑的是,程序声明式似乎不是任何特定语言的固定属性,而是您如何使用该语言?如果可以的话,您可以说用Java 说“给我一杯茶” ……
Magnus W

3
我想知道“ 1.茶,伯爵茶,热茶”是否会是一个更好的例子。这是在声明需要传达的内容,而不是要执行的动作(“让我...”)
JeffUK

马格纳斯,您的问题绝对正确。我认为,声明性语言是更高级的语言,并且源于过程。还记得开发人员需要使用命令行将两个数字相加的时间吗?现在,您只需一个简单的函数即可获得两个或多个数字的和。因此,以我的观点,如果没有“给我喝杯茶”命令,则需要创建它。当下一个人尝试使用时,它将在那里。据我所知。谢谢
穆罕默德Zeeshan Tahir

5

过程编程:

在过程编程中,当程序启动时,它遵循一组指令。指令可能会根据某些文件或内存内容而有所变化,但总的来说,变化并不大。程序的输入通常不是来自实时的用户输入,而是来自预先收集的一组数据。

声明式编程:

在声明性事件驱动的程序中,程序可以对数据进行集中处理,并具有可选的操作。例如,文字处理器中的每个“事件”都是影响数据,文档的任何鼠标或键盘(或文件)更改。它们不需要以任何顺序执行。事件驱动的编程采用小程序(事件处理程序)的形式,它们全部都处理一组公共数据,因此每个小程序可以使用相同的数据(在本示例中为文档)。


1

两种编程语言之间的主要区别是:在过程编程中,我们告诉计算机如何解决问题,而在声明性编程中,我们告诉计算机我们要解决什么问题。


0

为了解决烦人的评论,并可能在两者之间的差异之间提供一个示例。Ansible是程序性的,例如木偶或terraform是声明性的。例如,您创建一个ansible yaml文件来部署10个ec2实例,如下所示:
-ec2:count:10 image:ami-058c6e5b73b074cd2 instance_type:t2.micro

如果要两次运行该文件,最终将有20个t2.micro ec2实例。如果您使用诸如terraform之类的声明性语言编写等效代码并运行两次,则无论您运行多少次,都只会运行10个t2.micro实例。声明性语言指定结束状态。过程语言只是按照您所说的去做,而不考虑当前或过去的状态。



-2

在过程方法中,您对指令进行编码以达到结果。在声明性方法中,您将需要解决的问题定义为解决问题的知识。看一下我在两种方法中实现的过程式或声明性方法示例。

如您在示例中所看到的,采用声明式方法,您无需指示HOW即可解决问题。


您引用的是非现场示例,就像它们是在此处编写的一样。将示例作为答案的一部分。
ChronoFish 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.