命令式编程 vs 声明式编程
实际上我们绝大多数程序员都是在用命令式风格在编程, 这是和我们的冯诺依曼计算机机构密切相关的。
(码农翻身注: 参见文章《冯诺依曼计算机的诞生》)
在一个冯诺依曼计算机中, 最核心的就是CPU和内存, 指令和数据都放在内存当中, CPU每次取出一条指令, 译码,执行,然后把结果写回内存 , 本质就这么简单。
这些指令是需要程序员精确的告诉计算机的, 当然CPU能理解的都是二进制的机器语言, 只有牛人才能用机器语言和汇编写大型程序, 普通人只能用高级语言来编程 ,例如C, C++, Java , Python等 ,但是高级语言还是要被编译成二进制的机器语言或者用虚拟机/解释器来执行。
但是即使我们观察下所谓的“高级语言”, 背后依然是冯诺依曼机器的影子:
那面向对象呢? 其实面向对象本质上也和上表差不多, 运行时也是顺序、条件、循环加上函数调用而已 , 只是在语言层面看来似乎有了封装、继承、多态。
命令式编程就是对硬件操作的抽象, 程序员需要通过指令,精确的告诉计算机干什么事情。
这就是程序员苦逼的地方: 需要把复杂的, 容易产生歧义的人类语言翻译成精确的计算机语言指令。
3
声明性编程
最知名的就是SQL了:
SQL 最大的特点就是只声明我想要什么(What) , 就是不说怎么做(How)。
这个怎么做的部分是由数据库管理系统来完成的, 具体的细节自然需要用命令式的编程风格来干活了: 把STUDENT表和STUDENT_SCORE表进行关联, 从磁盘上读取数据, 找出那些分数是80以上的记录, 取出id, name, score 返回。
再用Java举个例子, 例如有一个学生列表, 我们要计算出年龄小于18的学生数量, 如果用传统的命令式, 代码是这样:
代码很容易懂: 对students 这个集合, 给我一个一个的遍历啊, 如果学生的年龄小于18 , 把一个计数器加上1 , 对了计数器一定要记着初始化为0啊。
在Java 8 中, 它对应的声明式则是这样:
这段代码只是说我要过滤(filter) 一下你这个students 构成的流(stream) , 只把那些年龄小于18的留下, 计算出个数就行了。
同样的功能, 声明式的代码是不是看起来清爽的多?
声明性是函数式编程的一个重要特点, 函数式还有其他特点, 像高阶函数、函数没有side effect, 只有值而没有变量, 用递归而不是用迭代等等。 想要完全的掌握函数式需要你彻底的刷新思维, 甚至忘掉命令式的习惯, 所以学习曲线比较陡峭。
但是这并不妨碍“声明性”这个特点在某些特定领域的应用, 因为它的确能极大的简化代码, 除了上面提到的SQL和Java8 的例子, 在很多领域特定语言里边, 我们的目标就是试图把一个问题尽可能的抽象, 创造一个简单的“小语言”以声明性的方式来描述问题, 不但能简化程序员的工作, 甚至一些业务人员都可以使用了。
(完)
你看到的只是冰山一角, 更多精彩文章,尽在“码农翻身” 微信公众号, 回复消息"m"或"目录" 查看更多文章
https://chuansongme.com/n/1158730451444
命令式编程 vs 声明式编程的更多相关文章
- 从零打造“乞丐版” React(一)——从命令式编程到声明式编程
这个系列的目的是通过使用 JS 实现"乞丐版"的 React,让读者了解 React 的基本工作原理,体会 React 带来的构建应用的优势 1 HTML 构建静态页面 使用 HT ...
- 编程范式:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)
主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 命令式编程: 命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么. 比如:如果你想在一个数字集合 collec ...
- Atitit 函数式编程与命令式编程的区别attilax总结 qbf
Atitit 函数式编程与命令式编程的区别attilax总结 qbf 1.1. 函数式程序就是一个表达式.命令式程序就是一个冯诺依曼机的指令序列. 命令式编程是面向计算机硬件的抽象,有变量(对应着存 ...
- Python - 命令式编程与符号编程
原文链接:https://zh.d2l.ai/chapter_computational-performance/hybridize.html本文是对原文内容的摘取和扩展. 命令式编程(imperat ...
- 函数式编程( Functional)与命令式编程( Imperative)对比
1.函数式编程带来的好处 函数式编程近些年异军突起,又重新回到了人们的视线,并得到蓬勃发展.总结起来,无外乎如下好处: 1.减少了可变量(Immutable Variable)的声明,程序更为安全. ...
- 『MXNet』第六弹_Gluon性能提升 静态图 动态图 符号式编程 命令式编程
https://www.cnblogs.com/hellcat/p/9084894.html 目录 一.符号式编程 1.命令式编程和符号式编程 2.MXNet的符号式编程 二.惰性计算 用同步函数实际 ...
- 《C#并行编程高级教程》第2章 命令式编程 笔记
Parallel.Invoke 并行执行多个方法,只有在所有方法都执行后才会返回 static void Main(string[] args){ Parallel.Invoke( () ...
- 响应式编程知多少 | Rx.NET 了解下
1. 引言 An API for asynchronous programming with observable streams. ReactiveX is a combination of the ...
- 声明式编程:程序=数据+逻辑(what)+算法(控制+计算)
接口:what: 实现:算法:指令: 编程语言中,凡是不涉及到算法的部分,都可以认为是声明式编程. 命令式编程可以与算法划等号:算法要求严格的计算逻辑和控制,是实施细节的精准描述: 命令式编程与声明式 ...
随机推荐
- Mac上Node环境配置
公司配备Mac笔记本,以前没用过mac开发项目,一开始依然是从node官网下载安装包,后来领导说最好是用brew安装软件,这样比较方便,安装和卸载,只要在命令行输入相应的 install 和 unin ...
- PIE SDK傅里叶变换
1.算法功能简介 傅里叶变换能把遥感图像从空域变换到只包含不同频域信息的频域中.原图像上的灰度突变部位(如物体边缘).图像结构复杂的区域.图像细节及干扰噪声等,经傅里叶变换后,其信息大多集中在高频区: ...
- Win10小娜关闭或删除进程
先来说下我为什么想尽方法关闭win10小娜:我觉得功能并不适用于我,即便不启用Cortana小娜,在Win10进程中也会看到Cortana小娜启动着,耗费了内存.CPU,而且主要的我的磁盘利用率等都居 ...
- 安装并配置hive
教程:http://www.bubuko.com/infodetail-2523113.html 安装好mysql,然后进入mysql: 创建hive用户: 给hive用户赋权: 创建hive数据库, ...
- GraphQL 暂停
别人的文章 http://blog.csdn.net/imwebteam/article/details/53888708 Java 文档都打不开,已经在GitHub上提了 in README.md ...
- ubuntu18.04 与 python
Ubuntu安装pycharm专业破解版方法 首先我们要下载pycharm的安装包, 地址为https://www.jetbrains.com/pycharm/download/#section=li ...
- GreenPlum 大数据平台--非并行备份(六)
一,非并行备份(pg_dump) 1) GP依然支持常规的PostgreSQL备份命令pg_dump和pg_dumpall 2) 备份将在Master主机上创建一个包含所有Segment数据的大的备份 ...
- Android触摸事件传递机制
简单梳理一下Android触摸事件传递机制的知识点. 一.View与ViewGroup的关系 View和ViewGroup二者的继承关系如下图所示: View是Android中最基本的一种UI组件,它 ...
- 8086键盘输入实验——《x86汇编语言:从实模式到保护模式》读书笔记07
1.BIOS中断 我们可以为所有中断类型自定义中断处理过程,包括内部中断.硬件中断和软中断. BIOS中断,又称BIOS功能调用,主要是为了方便地使用最基本的硬件访问功能.通常,为了区分针对同一硬件的 ...
- Nmap原理02 - 编写自己的服务探测脚本
编写自己的服务探测脚本 1. 添加自己的探测脚本 nmap-service-probes文件的格式将在第二节介绍,本节通过一个例子说明如何添加自己的服务探测脚本. AMQP协议,即Advanced M ...