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