1一个小故事
早上刚上班,老大找到张大胖说: “大胖啊, 给你交代个事儿, 我们今天中午要聚餐, 软件园旁边有几家餐馆, 九头鸟, 大鸭梨,巫山烤全鱼, 你到大众点评上挨个调查下, 也可以问问去吃过的同事, 看看哪家的口碑好, 预定个大桌,我们有14个人, 然后用滴滴约4辆车, 每辆车坐3-4个人, 记住啊我们会在11点半出发。 “
大胖遵循老大的命令, 赶紧上网看点评, 问同事, 打电话预定座位, 用滴滴约车, 最后顺利的完成了任务。
如果老大是程序员, 大胖是计算机的话, 老大用的就是命令式的编程风格 ,指令清晰, 面面俱到。 在什么时间,做什么事情, 怎么做, 描述的非常清楚。
大胖这个计算机只需要遵循指令一步步完成即可, 执行过程中也可能出现异常,例如餐馆爆满,订不上座位, 那这段程序就要退出, 因为没有异常处理。
实际上, 老大肯定是不会这么费心的,一般是这样:
早上刚上班, 老大找到张大胖说: “大胖啊, 给你交代个事儿, 我们今天中午要聚餐, 你在软件园旁边找个好点的餐馆, 我们14个人, 11点半出发” 。
这就是声明式的编程风格, 老大不会说具体怎么做 (How), 只会描述要干什么事儿(What) , 剩下的具体步骤需要大胖去完成。
2命令式编程
实际上我们绝大多数程序员都是在用命令式风格在编程, 这是和我们的冯诺依曼计算机机构密切相关的。
(码农翻身注: 参见文章《冯诺依曼计算机的诞生》)
在一个冯诺依曼计算机中, 最核心的就是CPU和内存, 指令和数据都放在内存当中, CPU每次取出一条指令, 译码,执行,然后把结果写回内存 , 本质就这么简单。
这些指令是需要程序员精确的告诉计算机的, 当然CPU能理解的都是二进制的机器语言, 只有牛人才能用机器语言和汇编写大型程序, 普通人只能用高级语言来编程 ,例如C, C++, Java , Python等 ,但是高级语言还是要被编译成二进制的机器语言或者用虚拟机/解释器来执行。
那面向对象呢? 其实面向对象本质上也和上表差不多, 运行时也是顺序、条件、循环加上函数调用而已 , 只是在语言层面看来似乎有了封装、继承、多态。
命令式编程就是对硬件操作的抽象, 程序员需要通过指令,精确的告诉计算机干什么事情。
这就是程序员苦逼的地方: 需要把复杂的, 容易产生歧义的人类语言翻译成精确的计算机语言指令。
3声明性编程
这个怎么做的部分是由数据库管理系统来完成的, 具体的细节自然需要用命令式的编程风格来干活了: 把STUDENT表和STUDENT_SCORE表进行关联, 从磁盘上读取数据, 找出那些分数是80以上的记录, 取出id, name, score 返回。
声明性是函数式编程的一个重要特点, 函数式还有其他特点, 像高阶函数、函数没有side effect, 只有值而没有变量, 用递归而不是用迭代等等。 想要完全的掌握函数式需要你彻底的刷新思维, 甚至忘掉命令式的习惯, 所以学习曲线比较陡峭。
但是这并不妨碍“声明性”这个特点在某些特定领域的应用, 因为它的确能极大的简化代码, 除了上面提到的SQL和Java8 的例子, 在很多领域特定语言里边, 我们的目标就是试图把一个问题尽可能的抽象, 创造一个简单的“小语言”以声明性的方式来描述问题, 不但能简化程序员的工作, 甚至一些业务人员都可以使用了。
领取专属 10元无门槛券
私享最新 技术干货