Ash*_*nde 11 c imperative-programming declarative-programming
知道命令式和声明式编程之间的区别是否可以解释现实世界中两者之间的差异,这是非常令人困惑的?
请澄清C是否是一种命令式或声明式语言?
Rah*_*thi 20
C是一种命令式编程语言.
两者之间的一个区别就是声明性编程就是当你说出你想要的东西时,命令式语言就是当你说出如何获得你想要的东西时.在声明式编程中,重点是计算机应该做什么而不是它应该如何做(例如SQL),而在命令式编程中,重点是计算机应采取的步骤而不是计算机将采取的步骤(例如C) ,C++,Java).
命令式编程是一种编程范例,它根据改变程序状态的语句来描述计算
声明性编程是一种编程范式,一种构建计算机程序结构和元素的风格,表达计算逻辑而不描述其控制流程
许多命令式编程语言(例如Fortran,BASIC和C)是汇编语言的抽象.
在维基说: -
作为命令式语言, C使用语句来指定操作.最常见的语句是表达式语句,由要计算的表达式组成,后跟分号; 作为评估的副作用,可以调用函数并且可以为变量分配新值.为了修改语句的正常顺序执行,C提供了几个由保留关键字标识的控制流语句.结构化编程由if(-else)条件执行和do-while,while以及迭代执行(循环)支持.for语句具有单独的初始化,测试和重新初始化表达式,可以省略其中的任何一个或全部.break和continue可用于离开最内层的循环语句或跳转到重新初始化.还有一个非结构化的goto语句,它直接分支到函数中的指定标签.switch根据整数表达式的值选择要执行的大小写.
警告
我写的有很多一般性,所以请耐心等待.
理论上
C是必不可少的,因为代码读起来就像是如何做某事的秘诀.但是,如果您使用许多名称很好的函数和函数指针来实现多态,那么可以使C代码看起来像一个声明性语言.
在命令式语言中,您专注于算法/实现.工程本质上是必不可少的,因为您专注于流程的效率:需要在时间或金钱(或CS中的内存)方面做某事的成本.
相比之下,数学通常是陈述性的(但是编写证明往往更为必要).在数学中,你更关心正确性和定义不变的关系/操作,而不是你能多快得到答案.
请注意,许多函数式语言本质上倾向于声明性的(例如R,Lisp).
z = x + y是什么意思?(语义)
在命令式语言中,它意味着从内存位置x和y读取,将这些值一起添加,并将结果放入内存位置z,并立即执行.如果为x指定了不同的值,则必须z = x + y再次使用该语句重新计算z.
在声明(懒惰)语言中,它意味着z是一个变量,其值是另外两个变量x和y的值的总和.在尝试读取z的值之前,不会执行添加操作.这意味着什么?如果从z读取,则该值始终为该时刻的x和y之和; 你不需要重新发表声明.在没有变量的纯声明性语言中,重新发行实际上可以作为错误捕获!
记住这个例子,你会发现为什么数学家倾向于喜欢声明性语言.例如,我可以定义hypotenuse = sqrt(height ^ 2 + length ^ 2),从不担心必须重新发出该语句.这种关系是一种永远存在的不变量,就像数学真理一直存在一样.
在现实生活中(我为什么要关心?)
声明性语言的支持者声称:错误(错误)的有效解决方案是无用的.他们希望无错误,无状态的功能,没有副作用,无需修改即可重复使用.
命令式语言的支持者声称:一个永远运行的正确解决方案也是无用的.他们希望控制内存/速度权衡.他们希望能够根据物理和时间限制进行优化.
当然,没有什么是100%的必要或声明. 正确而精心编写的命令式代码意味着某些关系.OTOH,声明性代码,足够深入并与语言规范一起,足以描述这些关系,使编译器/解释器能够将您的代码转换为一系列CPU指令.
因为我们正在处理计算机,所以声明性编译器/解释器必须足够智能以进行时间与内存的权衡,而在命令式语言中,程序员需要更明确地做出这些决策.
因此,声明性语言要求程序员专注于定义变量和其他不变量之间的关系.编译器/解释器可以将这些关系转换为CPU的一系列指令/操作.大多数声明性编译器/解释器都足够智能,可以处理大多数真实案例,但可能会遇到边缘情况.不幸的是,在这些情况下,你必须哄骗编译器/解释器.
哪一个更好?
声明性语言的支持者声称这些语言允许程序员专注于域并编写更容易为非程序员阅读的代码.声称倡导者,更容易编写正确的代码.然而,权衡是,哄骗编译器/解释器使正确的内存与速度权衡可能需要一些错综复杂的语言知识.如果使用R或SQL或LISP等声明性语言,您将理解此问题.当然可以定义一种与计算机无关的新声明性语言(但这样做可能会使解释器/编译器的编写者更难).许多数学家和纯粹的CS研究人员喜欢声明性语言.
命令式语言倾向于为您提供更精细的机器控制.毫无疑问,您正在编程计算机.陷阱是,我们最终可能会过早地专注于不必要的速度优化,这会影响代码维护和可读性.在计算速度或内存严重受限的早期计算中,您需要使用命令式语言来完成有用的工作,并根据您的具体情况进行正确优化.工程师和修补工人倾向于使用命令式语言.