【发布时间】:2010-12-09 20:12:41
【问题描述】:
声明式和过程式编程范式有什么区别?可以举一些例子吗?
还有哪些其他编程范例?
【问题讨论】:
-
我投票结束这个问题,因为它与本网站无关。
标签: procedural-programming declarative-programming
声明式和过程式编程范式有什么区别?可以举一些例子吗?
还有哪些其他编程范例?
【问题讨论】:
标签: procedural-programming declarative-programming
命令式编程范式有几个子范式,例如过程式或面向对象编程范式。
在命令式编程范式中,您以各种抽象程度逐步描述算法。
支持过程范式的编程语言示例:
它通常是指表现出类型层次结构的语言,这些类型继承了从基类型到派生类型的方法和状态,但也包括不寻常的基于原型的 JavaScript。
支持 OO 范式的编程语言示例:
声明式编程范式有几个子范式,例如函数式或逻辑编程范式。
在声明式编程范例中,您描述一个结果或一个目标,并通过“black box”获得它。 命令式的反义词。
支持声明式编程范式的编程语言示例:
函数式编程强调没有副作用和不可变状态的函数的应用。上面的声明式系统展示了函数式编程的某些方面。
支持声明式函数范式的编程语言示例:
【讨论】:
在声明式编程中,您可以说出自己想要的东西,而不必说如何去做。使用过程式编程,您必须指定确切的步骤才能获得结果。
例如,SQL 比过程性更具有声明性,因为查询没有指定生成结果的步骤。
【讨论】:
让我举一个真实的例子:我需要一杯茶。
程序:
声明式:
在程序语言中,您定义了整个过程并提供了如何进行的步骤。您只需提供订单并定义流程的服务方式。
在声明性语言中,您只需设置命令或命令,并让它在系统上如何完成该命令。您只需要您的结果,而无需深入研究应该如何完成。
【讨论】:
过程式编程:
在过程式编程中,当程序启动时,它遵循一组指令。说明可能会根据某些文件或内存内容而有所不同,但总体而言,变化不大。程序的输入通常不是来自用户的实时输入,而是来自预先收集的一组数据。
声明式编程:
在声明式事件驱动编程中,程序集中在一组数据周围,程序可以对其执行可选操作。例如,文字处理器中的每个“事件”都是影响数据、文档的任何鼠标或键盘(或文件)更改。它们不需要以任何顺序执行。事件驱动编程采用小程序(事件处理程序)的形式,它们都在一组公共数据上工作,因此每个小程序都可以使用相同的数据,本例中的文档。
【讨论】:
两种编程语言之间的主要区别是, 在过程式编程中,我们告诉计算机如何解决问题,而在声明式编程中,我们告诉计算机我们想要解决什么问题。
【讨论】:
为了解决 ansible 评论,并可能提供两者之间差异的示例。 Ansible 是程序性的,而 puppet 或 terraform 之类的东西是声明性的。例如,您创建一个 ansible yaml 文件来部署 10 个 ec2 实例,如下所示:
-ec2:
计数:10
图片:ami-058c6e5b73b074cd2
instance_type: t2.micro
如果您要运行该文件两次,您最终会得到 20 个 t2.micro ec2 实例。如果您用 terraform 之类的声明性语言编写了等价的代码并运行了两次,那么无论您运行多少次,您都只会运行 10 个 t2.micro 实例。声明性语言指定结束状态。程序语言只是做你告诉它的事情,而不考虑当前或过去的状态。
【讨论】:
所以 YAML 是声明式编程语言?因为我们定义了我们想要的,而不是编写实际的逻辑。
我问这个是因为如果有人知道 Ansible 是配置管理工具,它使用 YAML,但它仍然属于过程语言类别。
【讨论】:
在程序方法中,您对指令进行编码以实现结果。在声明性方法中,您将需要解决的问题定义为解决问题的知识。看看我在这两种方法中实现的 Procedural or Declarative approach 示例。
正如您在示例中看到的那样,在声明式方法中,您不需要指示如何解决问题。
【讨论】: