【问题标题】:What is the difference between declarative and procedural programming paradigms?声明式和过程式编程范式有什么区别?
【发布时间】:2010-12-09 20:12:41
【问题描述】:

声明式过程式编程范式有什么区别?可以举一些例子吗?

还有哪些其他编程范例?

【问题讨论】:

标签: procedural-programming declarative-programming


【解决方案1】:

命令式

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

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

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

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

面向对象

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

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

  • Java

声明性

声明式编程范式有几个子范式,例如函数式或逻辑编程范式。

在声明式编程范例中,您描述一个结果或一个目标,并通过“black box”获得它。 命令式的反义词。

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

  • yacc
  • 树梢
  • SQL
  • 正则表达式
  • XSLT
  • 标记、troff、CSS、VHDL

功能性

函数式编程强调没有副作用和不可变状态的函数的应用。上面的声明式系统展示了函数式编程的某些方面。

支持声明式函数范式的编程语言示例:

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

【讨论】:

    【解决方案2】:

    在声明式编程中,您可以说出自己想要的东西,而不必说如何去做。使用过程式编程,您必须指定确切的步骤才能获得结果。

    例如,SQL 比过程性更具有声明性,因为查询没有指定生成结果的步骤。

    【讨论】:

    • +1 是关于 SQL 的好例子。请给我们更多的例子吗?
    • Mauris:也许不是编程语言,但 HTML 是声明性的,因为您描述了您想要的内容(带有 this bit 粗体的段落),而不是写出“绘制弦、量弦、前进位置等"另一个例子是 Prolog,其中“程序”是一组声明性的事实和关系/推论,以及一个查询。 Prolog 引擎计算出如何评估查询:您无需告诉它如何执行此操作。最后,正则表达式:您描述模式而不是拼写测试匹配的步骤。
    • MXML(Flex 框架的一部分)是声明性的:你告诉它你希望你的对象/容器以什么顺序显示,它会根据你是否告诉它自己放置来处理布局水平或垂直输出。 ActionScript 3 是程序性的,支持 OOP 范例。
    • makefiles 是另一种非常著名的声明性语言
    【解决方案3】:

    让我举一个真实的例子:我需要一杯茶。

    程序:

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

    声明式:

    1. 给我倒杯茶。

    在程序语言中,您定义了整个过程并提供了如何进行的步骤。您只需提供订单并定义流程的服务方式。

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

    【讨论】:

    • 这个极其简化的示例实际上让我明白了这一点(有点)。但是有一件事仍然困扰着我,试图理解其中的区别——如果没有“给我一杯茶”命令怎么办?然后你必须自己创建它吗?如果是这样,您不会创建一个类似于程序示例的函数吗?我想让我感到困惑的是,proceduraldeclarative 似乎不是任何特定 language 的固定属性,而是你如何使用它语言?你可以用 Java 说 “给我喝杯茶”,如果这是一种可用的方法的话......
    • 我想知道“1. Tea,Earl Grey,Hot”是否会是一个更好的例子。它是声明需要交付什么,而不是需要执行什么操作('Get me...')
    • Magnus,你的问题完全正确。在我看来,声明性语言是更高级的语言,并且是从过程性语言派生的。还记得开发人员需要使用命令行来添加两个数字的时候吗?现在,您只需一个简单的函数即可获得两个或多个数字的总和。所以在我看来,如果没有“给我喝杯茶”命令,你需要创建它。当下一个人尝试使用时,它就会在那里。那是根据我的贫乏知识。谢谢
    • 基于 JeffUK 的评论,事件顺序和命令式动词(命令)都是程序语言的标志。我相信这种情况下的声明只是“我有一杯茶”。
    【解决方案4】:

    过程式编程:

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

    声明式编程:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        为了解决 ansible 评论,并可能提供两者之间差异的示例。 Ansible 是程序性的,而 puppet 或 terraform 之类的东西是声明性的。例如,您创建一个 ansible yaml 文件来部署 10 个 ec2 实例,如下所示:
        -ec2: 计数:10 图片:ami-058c6e5b73b074cd2 instance_type: t2.micro

        如果您要运行该文件两次,您最终会得到 20 个 t2.micro ec2 实例。如果您用 terraform 之类的声明性语言编写了等价的代码并运行了两次,那么无论您运行多少次,您都只会运行 10 个 t2.micro 实例。声明性语言指定结束状态。程序语言只是做你告诉它的事情,而不考虑当前或过去的状态。

        【讨论】:

          【解决方案7】:

          所以 YAML 是声明式编程语言?因为我们定义了我们想要的,而不是编写实际的逻辑。

          我问这个是因为如果有人知道 Ansible 是配置管理工具,它使用 YAML,但它仍然属于过程语言类别。

          【讨论】:

          【解决方案8】:

          在程序方法中,您对指令进行编码以实现结果。在声明性方法中,您将需要解决的问题定义为解决问题的知识。看看我在这两种方法中实现的 Procedural or Declarative approach 示例。

          正如您在示例中看到的那样,在声明式方法中,您不需要指示如何解决问题。

          【讨论】:

          • 您在引用场外示例,就好像它们是在这里写的一样。把你的例子作为你答案的一部分。
          猜你喜欢
          • 2012-01-02
          • 1970-01-01
          • 2022-10-15
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多