第1章 SQL是声明式语言,不是过程式语言
前言里,我谈到了一些FORTRAN程序员和一名LISP程序员的事,前者只会使用循环
来解决问题,后者只会使用递归方式解决问题。这种情况并不少见,因为人们都喜欢使用自己了解的工具。下面讲一个笑话,不是真事:有人给一个数学家、一个物理学家和一个数据库程序员各发了一个橡皮球,并且让他们确定球的体积。
数学家认真地测量了直径,然后用球体积公式计算出了球的体积,或者认为这个球不很圆,就用三重积分计算了球的体积。
物理学家则在一个大烧杯中接满了水,把球放入水中,测量出排水量。他并不关心这个球是什么形状。
数据库程序员呢,他到橡皮球生产商的在线数据库里查了这个球的型号和产品序列号,根本不关心这是不是球。他获得了这个球的制造公差、设计形状和尺寸以及其他许多与整个橡皮球生产过程有关的参数。
这个故事说明:数学家知道如何计算,物理学家知道如何测量,而数据库技术人员知道如何查找数据。每个人都采用自己的工具来解决问题。
现在我们把问题扩展到仓库中成千上万个橡皮球。数学家和物理学家因此会花费大量的手工劳动完成任务,而数据库技术员只要下载一些信息,就能够得出橡皮球的工业标准(假设有这种标准)以及详尽得可以用于法庭辩论的文档。
1.1 不同的编程模型
自我完善的过程就是在学习新知识的同时,忘记老的习惯。
——Edsgar Dijkstra①
编程模型有多种。过程式编程语言使用的是由流控制语句(WHILE—D0、IF—THEN—ELSESHBEGIN—END)控制的一系列过程步骤,借此把输入数据转换成输出数据。这是对编程的一种传统认识,因为这是著名的数学家约翰·冯·诺伊曼归纳出来的,后来也常被称为冯·诺伊曼模型。同样的源代码经相同的编译器编译之后,每次都生成相同的可执行模块。该程序在每次调用时都以完全相同的方式工作。这种模型中的关键字是可以预测和确定的。由于这种模型具有可确定性,所以主要用于一些数学分析。
另外,还有一些变化。一些语言使用了不同的流控制语句。FORTRAN和HCOBOL会在程序一开始就为数据分配全部存储区。后来的Algol系列编程语言会根据数据在程序块结构中的作用域动态地分配存储区。
EdsgarDijkstra(参见文献www.CS.utexas.edu/users/EWD/)发明了一种非确定性语言。语句,又称为保护命令,既可以阻止语句的执行,也可以允许该语句的执行,而且在打开的语句之间没有确定的执行顺序。这种模型没有在商业化产品中实现,但它表明人们原来在编程中认为必备的因素(确定性)可以被丢弃。
函数式编程语言的基础是用一系列嵌套的函数调用来解决问题。在这些语言中,高阶函数可以转换自身的功能,这个概念非常重要。导数变换和积分变换就是这种高阶函数在数学上应用的实例。这种语言的目标之一是避免在程序中出现副作用,保证它们能够以代数的方式进行优化。特别是,一旦某个表达式与另一个表达式相等(某种意义上的相等),它们就可以替换,而不会影响整个运算结果。
展开
——Amazon com读者评论