声明式编程和命令式编程有什么区别?

(What is the difference between declarative programing language and imperat…
关注者
236
被浏览
299,991

25 个回答

我不知道为什么这样一组概念会被提炼出来,因为通常这是一个只有在设计语言的时候才会考虑的问题。


计算机系统是分层的,也就是下层做一些支持的工作,暴露接口给上层用。注意:语言的本质是一种接口。


计算机的最下层是CPU指令,其本质就是用“变量定义+顺序执行+分支判断+循环”所表达的逻辑过程。计算机应用的最上层是实现人类社会的某种功能。所以所有计算机编码的过程,就是用逻辑表达现实的过程。层与层之间定义的借口,越接近现实的表达就叫越“声明式”(declarative),越接近计算机的执行过程就叫越“命令式”(imperative)。注意这不是绝对的概念,而是相对的概念。


当接口越是在表达“要什么”,就是越声明式;越是在表达“要怎样”,就是越命令式。SQL就是在表达要什么(数据),而不是表达怎么弄出我要的数据,所以它就很“声明式”。C++就比C更声明式,因为面向对象本身就是一种声明式的体现。HTML也很声明式,它只描述我要一张什么样的表,并不表达怎么弄出一张表。


简单的说,接口的表述方式越接近人类语言——词汇的串行连接(一个词汇实际上是一个概念)——就越“声明式”;越接近计算机语言——“顺序+分支+循环”的操作流程——就越“命令式”。


越是声明式,意味着下层要做更多的东西,或者说能力越强。也意味着效率的损失。越是命令式,意味着上层对下层有更多的操作空间,可以按照自己特定的需求要求下层按照某种方式来处理。


实际上,这对概念应该叫做“声明式接口”和“命令式接口”。可能是因为它大部分时候是在谈论“语言”这种接口方式时才会用到,所以会叫做“声明式编程”和“命令式编程”。


当然,你也可以把它当成一种编程思想,也就是说,在构建自己的代码时,为了结构的清晰可读,把代码分层,层之间的接口尽量声明式。这样你的代码自然在一层上主要描述从人的角度需要什么;另一层上用计算机逻辑实现人的需要。


另外,这组概念总让人迷惑,可能一个原因是翻译问题。如果翻译成”说明式“和”指令式“应该容易理解的多。

这个我们用你我他三种人称来区分

正好对应过程式(pp)面向对象(oop)和函数式(fp)三种

  1. pp就是我,第一人称,我怎么做,每一步其实都可以翻译成独立的一套指令,对机器最为友好,机器最喜欢这种范式了,人怎么做机器就怎么做,所以这是指令式编程
  2. oop就是第三人称,他,他怎么做,oop需要先找到主语,然后才是谓语动词,java里面所有的方法都要被放在一个具体的class里面,用的时候,都要先找到这个主语,也就是class/object,名词,然后才能用这个名词的动作,oop是描述性质的paradigm,写起来就像是一篇小说,有主语有谓语,很完整
  3. fp就是第二人称,你,你去做,fp讲究把代码全部封装成函数,函数就是动词,一个纯粹只有动词的语句就是祈使句,就是命令句式,这种句式一般是很不礼貌的,居高临下的,骂人基本上都是这种句式,所以使用这种句式的时候,请注意委婉表达,最好加上称谓否则很容易翻脸,很多国人初到国外时候,外语不太好,操起动词就说……,为了委婉表达这种说法,还是说是声明式,因为毕竟你去命令别人,会让人觉得被冒犯了,所以说我要做什么,我要翻转一个二叉树,直接表达你的目的,怎么做,你不用管

更多的你可以参考:小论学习的目的,比如怎样学计算机语言