编程的实践理论 第0章 介绍

编程的实践理论

第零章 编程的实践理论的介绍

什么样的编程理论是好的?谁需要一个编程理论?数以千计的程序员
每天编程却没有任何的理论支撑。他们为什么应该耐心地学习一个编
程的理论呢?对于任何其它的理论而言,答案都是一样的。例如,任
何一个人为什么应该学习一个运动的理论?你能完美地运动却没有一
个理论。你能掷一个球却没有理论。然而,我们认为在高中时学一个
运动的理论还是足够重要的。

一个答案是一个数学的理论通过提供了微积分的方法,提供了一个
更好的精确度。我们能够发射一个火箭到木星却没有一个关于运动
的数学理论是不可想像的。甚至排球的运动员发现他们的打球能在
使用了一些理论后提高水平。相似的是,许多普通的编程工作没有
一个理论的支撑能完成,但是更难的编程在没有理论的指导下做对
做好是很难的。为了说明上述的观点,软件产业有太多的关于有缺
陷的程序的惨痛的教训了。通过使用理论,甚至普通的编程能被
提高水平。

另一个答案是一个理论提供了一种对编程的理解。当我们学习了
一个数学理论之后,我们对运动变化的控制和预测的能力就从一
种艺术上升为一种科学。相似的是,为了理解编程,以一个相同
的方式,我们理解了数学定理,编程的变化就从一种艺术上华为了一
种科学。以一个科学的视角,我们改变了世界的观察角度。我们
更少的认为是精神或者是机会,增加了对什么是可能的,什么是
不可能的这样的事的理解。对于任何人来说,这都是教育的一个
有价值的部分。

在我们的社会中,通过坚持着 职业工程师必须知道和应用相关的
理论的观点,职业工程师们维持着崇高的社会声望。例如,一个
土木工程师必须知道和应用几何和材料力学的理论。一个电气工
程师必须知道和应用电磁理论。软件工程师,为了名符其实,必
须知道和应用一个编程的理论。

这本书的主题有时是如下的这些名字“编程方法学”,“编程的
科学”,“编程的逻辑”,“编程的理论”,“编程开发的形式
化方法”或者是“验证”。它关注的编程的那些方面是经得起
数学证明的检验的方面。一个好的理论能帮助我们写出精确的
需求规格,并且设计出的程序能够很好地满足需求规格的要求。
我们将权衡与考虑计算的状态,计算的时间,计算的内存空间
的需求和计算的交互。这本书没有涉及软件的设计与生产的其
它的重要的方面:例如人员的管理,用户界面设计,文档化和
测试。

编程的第一个有用的理论是 经常叫做 Hoare的逻辑,一个规格
是预测的数对:一个前置条件和一个后置条件。一个密切相关的
理论是使用Dijkstra的最弱的前置条件与后置条件的转换器,它
是一个程序的函数,把后置条件转换为前置条件,进一步的发展
是Back的推导微积分。Jones Vienna 开发方法已经在一些软件
产业中使用了,在这个方法中,一个规格是一个预测的数对,但是
第二个预测是一个关系。这些理论专门用于实时编程,一些用在
概率编程,一些用于交互式编程。

在本书中的理论,比上述提到的那些理论简单一些。在这个理论中,
一个规格仅是一个二进制的表达式。推导仅是普通的应用它。这个
理论也比提到的那些理论更加全面的,应用于有限与无限的计算,
串行与并行的计算,批量与交互的计算。与此同时,我们有初值
与终始值都有兴趣的变量,连续有兴趣的变量,仅在概率编程中
有价值的变量,对时间和空间有记录作用的变量。它们都符合
这个理论,这个理论的基础是写一个规格的标准的科学化的实践,
这个规格作为一个二进制的表达式,这个表达式的变量表示有兴趣
的所有的内容。

彻底地测试所有的输入的程序的校对,这个方法叫做模型检查。它
利用了本书中的理论,能够完全地自动化实现。用二进制表达式的
一个聪明的表示(见练习15),模型检查当前拥有能够探测达到
10的60次方的状态数量。这是宇宙中所有的原子的数量。这是个
令人印象深刻的数字,直到我们意识到10的60次方约等于2的200
次方,它意味着我们正在讨论的是200个比特。它是6个32比特的
变量的状态空间大小。为了在超过6个变量的任何一个程序上使用
模型检查,需要抽象化,每个抽象化需要证明,这个证明要保留感
兴趣的每个属性。这些抽象化和证明不是自动化的。为了实践,
模型检测必须结合证明的其它方法,正如在本书中提到的那些
方法。

在本书中通篇强调的是在程序开发中的每个步骤带着证明,而
不是开发后再证明。

0.0  当前版本

从本书的第一版本开始,在空间边界和概率编程等方面,新的材料
被添加进来。for循环的规则被一般化了,并发的内容被简化了。
对于并发进程的协同,这有一个选择:通信是第一版本,交互式
变量是在共享内存的形式化的版本。解释提高了,更多的示例被
添加了。

有添加也有删除。为了保持书的短小,在一节中,许多的内容
被删除了。它仅有147页,然后是练习和引用材料。

0.1  快速旅程

在这本书中,所有的本书用到的技术术语都被解释了。每个
你学习的新的术语是有下划线的。术语是具有可描述性的,
而不是空有其名。例如,有两个值的数据类型被叫做二进制
的,而不是布尔;前一个词描述了数据类型,后一个词纪念了
乔治布尔。这没有缩略词,省略词或者是语言中的别名来干扰你。
没有特定的前置的数学知识或者是编程经验的假定。然而,
在第1,2,3章中的二进制值,数字,列表,和函数上的预备
材料是简明的,预习也是很有帮助的。

下面的图显示了每章之间的依赖关系。
                             |——>5
1——>2——>3——>4——>6——>7
                             |——>8——>9

第四章是全书的核心。从那以后,可以根据兴趣选择或者是忽略。
仅有的例外是,第九章依赖了第5.0.0部分的内容,第9.1.3部分
的部分内容依赖了第6章的内容。在每一个章节中,部分,子部分中,
如果标识为可选,则可以忽略,而不影响到对后面的内容的理解。

第十章包括了所有的练习,它们根据章节来划分。在“编程理论”
章节中的所有的练习都能根据第4章的提供的方法来完成;然而,
在后面的章节中提到的新方法,利用这些材料,相同的练习能被
重做一遍。

在书的后面,第11章包括了引用的材料。第11.0部分,正确性
,回答了之前章节的诸如“为什么 用这种 方式”,“为什么
仅用这种方式”,“为什么没有用其它的内容取代它” 的问题。
这可能对老师和研究者更有用一点。初学者可以不关注这些问题。
如果你发现自己正有这样的疑问,不要犹豫,请读这个章节。

第11章也包括了术语的索引和在这本书中所使用的所有的定律的
完整的列表。对一个编程很严谨的学生,这些定律应该会成为
你的朋友。最后一页列出了在本书中的所有的使用的记号。
在读本书前,你不要期望知道这些记号。在我们引用它们时,
它们都被很好的解释了。如果你解释它们的用途,欢迎你发明
新的记号。在解决一个问题的能力中,有时,记号的选择造成了
差异。

0.2  致谢

对于灵感的启发和技术上的指导,我感谢信息处理国际联盟
的工作组(编程方法学),特别是Edsger Dijkstra, David Gries, 
Tony Hoare, Jim Horning, Cliff Jones, Bill McKeeman, 
Jay Misra, Carroll Morgan, Greg Nelson, John Reynolds, 
and Wlad Turski。我尤其感谢Doug McIlroy的鼓励。我感谢我的
研究生学生和让我学习了许多内容的助教们,尤其是 Lorene 
Gupta, Peter Kanareitsev, Yannis Kassios, Victor Kwan,
 Albert Lai, Chris Lengauer, Andrew Malton, Lev Naiman, 
Theo Norvell, Rich Paige, Hugh Redelmeier, Alan Rosenthal,
 Anya Tafliovich, Justin Ward, and Robert Will。在第一版本的
校对中,我最感谢的人是 Wim Hesselink, Jim Horning, 和
Jan van de Snepscheut。对于好的想法,我得感谢Ralph 
Back, Wim Feijen, Netty van Gasteren, Nicolas Halbwachs, 
Gilles Kahn, Leslie Lamport, Alain Martin, Joe Morris,
 Martin Rem, Pierre-Yves Schobbens, Mary Shaw, 
Bob Tennent, and Jan Tijmen Udding。对于阅读草稿和
提出好建议,我要感谢Jules Desharnais, Andy Gravell, 
Ali Mili, Bernhard Möller, Helmut Partsch, Jørgen 
Steensgaard-Madsen, and Norbert Völker。我感谢
同学们找书中的错误。

猜你喜欢

转载自blog.csdn.net/gggwfn1982/article/details/130783543
今日推荐