在维基百科上,程序设计范式定义了
例如,
x = 3;PUT / HTTP/1.1\r\nHost: domain.org\r\n\r\n{"x": 3};UPDATE relation SET value = 3 WHERE key = 'x';。发布于 2021-07-21 09:29:26
声明性编程与命令式编程并不总是在句法层面上区分开来。在很大程度上,这更多地是关于不同的编程风格:声明性程序主要描述问题的结构,而命令式程序则描述解决问题的算法的步骤。但是,有一个有趣的方面我们必须首先避开:可变性:命令式编程本质上意味着数据被修改。在声明式编程中,我们更多地有对数据流的描述,而没有实际的可更改性。但是,尽管命令/可变与声明/不变是相关的,但这并不是区分它们的硬规则和快速规则。
在您的x = 3示例中,我们无法判断正在使用什么编程范式,因为这将取决于更广泛的上下文。Python作为一个整体倾向于命令式编程。它非常注重陈述.每条语句都会做一些事情,通常是通过修改某种状态。但是赋值x = 3可以解释为一个声明式的事实语句:“在这个上下文中,x=3”,或者是命令:“修改x变量,使其具有新的值3”。
HTTP是一种协议,我认为将编程语言类别应用于该协议是没有意义的。
您的SQL示例很有趣:UPDATE语句修改了数据库的状态,但是人们普遍认为SQL是一种声明性语言。在该SQL语句中,您没有描述如何更新数据库。您不查找索引,不执行表扫描,不获取锁,也不更新索引。SQL语句只是在关系代数的这个表示法中表达了一个问题。我认为这很好地说明了你不能总是清楚地把这两个概念分开。SQL语句序列可能是必需的(特别是在存储过程的一部分时),但是单个语句是数据库操作的声明性描述。
发布于 2021-07-21 11:36:41
在声明性方法中,您可以声明事实,例如重力g为9.80665 m/s2或数字或车轮x为3。
许多编程语言都用某种声明或赋值语句来表达这一点:
let g = 9.80665 // swift
double x = 3; // c++, java
spaceship(red). % prolog在声明性范例中,您告诉规则并让系统应用这些规则来找到结果。规则和事实可以按任何顺序宣布。
在命令式范例中,您必须告诉如何使用这些事实来获得结果;操作的顺序很重要。您可以将赋值用于定义事实以外的其他目的:每次使用依赖于语句序列的赋值,每次使用赋值来更改变量的前一个值时,都不再是声明性的。
结论:作业可以是陈述性的,也可以是祈使式的,这取决于它的使用方式。
发布于 2021-07-21 10:36:03
首先,我们需要澄清“声明性”和“强制性”之间的区别。
要注意的是,在计算机科学中,“陈述性”没有一个单一的规范定义,因此存在一定程度的主观观点和大量的灰色地带。但合理的定义是:
在声明性语言中,代码是期望的最终结果的规范。在命令式语言中,代码指定了一个随时间执行的操作序列(希望最终得到预期的结果)。
因此,命令式语言有一个可变状态的概念。每个操作都会改变可变状态或产生其他副作用(比如产生输出)。
声明式语言描述单个状态,并且没有顺序执行或可变状态的任何显式概念。
这就引出了我们的任务。作业确实有两种含义。在Python这样的命令式语言中,赋值将可变变量设置为特定状态。随着时间的推移,变量可以有多个状态(因此名)。
声明式和函数式语言也可以有赋值,但它们更像是混叠。它将名称绑定到给定上下文中的特定值或表达式。但是绑定不会随着时间的推移而改变。因此,声明语言或功能语言中的赋值通常称为声明或绑定,而不是赋值。
这种区别可能很微妙,但是考虑到在Python这样的命令式语言中,像'foo‘这样的名称可能指不同作用域中的不同变量,而且每个变量都可能随着时间的推移而改变值。在声明性语言中,同一名称可能指不同作用域中的不同绑定,但绑定不会随时间而更改。
例如,CSS是一种声明性语言,CSS变量被分配给一个值,但它们在运行时不能更改(这意味着名称“变量”实际上是一个错误的名称-它是一个常量声明而不是变量)。
SQL中的更新是必需的,因为它们会更改状态。基表有时被称为“关系变量”(或"relvars"),以表明它们随时间的推移是可变的。相反,SQL中的查询语法是声明性的。
命令式/声明性的区分不适用于HTTP之类的协议。在这里,我们将讨论是否有副作用。PUT有副作用。
https://softwareengineering.stackexchange.com/questions/430444
复制相似问题