返回介绍

命令式编程 vs 声明式编程

发布于 2025-01-22 00:38:47 字数 2649 浏览 0 评论 0 收藏 0

1

一个小故事

早上刚上班,老大找到张大胖说: “大胖啊, 给你交代个事儿, 我们今天中午要聚餐, 软件园旁边有几家餐馆, 九头鸟, 大鸭梨,巫山烤全鱼, 你到大众点评上挨个调查下, 也可以问问去吃过的同事, 看看哪家的口碑好, 预定个大桌,我们有 14 个人, 然后用滴滴约 4 辆车, 每辆车坐 3-4 个人, 记住啊我们会在 11 点半出发。 “

大胖遵循老大的命令, 赶紧上网看点评, 问同事, 打电话预定座位, 用滴滴约车, 最后顺利的完成了任务。

如果老大是程序员, 大胖是计算机的话, 老大用的就是命令式的编程风格 ,指令清晰, 面面俱到。 在什么时间,做什么事情, 怎么做, 描述的非常清楚。

大胖这个计算机只需要遵循指令一步步完成即可, 执行过程中也可能出现异常,例如餐馆爆满,订不上座位, 那这段程序就要退出, 因为没有异常处理。

实际上, 老大肯定是不会这么费心的,一般是这样:

早上刚上班, 老大找到张大胖说: “大胖啊, 给你交代个事儿, 我们今天中午要聚餐, 你在软件园旁边找个好点的餐馆, 我们 14 个人, 11 点半出发” 。

这就是声明式的编程风格, 老大不会说具体怎么做 (How), 只会描述要干什么事儿(What) , 剩下的具体步骤需要大胖去完成。

2

命令式编程

实际上我们绝大多数程序员都是在用命令式风格在编程, 这是和我们的冯诺依曼计算机机构密切相关的。

在一个冯诺依曼计算机中, 最核心的就是 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 的例子, 在很多领域特定语言里边, 我们的目标就是试图把一个问题尽可能的抽象, 创造一个简单的“小语言”以声明性的方式来描述问题, 不但能简化程序员的工作, 甚至一些业务人员都可以使用了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文