程序设计方法学

程序设计方法学是讨论程序的性质以及程序设计的理论和方法的一门学科，是研究和构造程序的过程的学问，是研究关于问题的分析，环境的模拟，概念的获取，需求定义的描述，以及把这种描述变换细化和编码成机器可以接受的表示的一般的方法。

程序设计方法学发展历史

产生背景
1950年代—1960年代初，手工艺式的程序设计方法，高德纳把程序称为艺术品。
1960年代末—1970年代初，出现软件危机：一方面需要大量的软件系统，如操作系统、数据库管理系统；另一方面，软件研制周期长，可靠性差，维护困难。编程的重点：希望编写出的程序结构清晰、易阅读、易修改、易验证，即得到好结构的程序。
1968年，北大西洋公约组织（NATO）在西德召开了第一次软件工程会议，分析了危机的局面，研究了问题的根源，第一次提出了用工程学的办法解决软件研制和生产的问题，本次会议可以算做是软件发展史上的一个重要的里程碑。
1969年，国际信息处理协会（IFIP）成立了“程序设计方法学工作组”，专门研究程序设计方法学，程序设计从手工艺式向工程化的方法迈进。

結構化程式設計的研究
1968年，結構化程式設計方法的研究。Dijkstra提出了“GOTO是有害的”，希望通过程序的静态结构的良好性保证程序的动态运行的正确性。
1969年，Wirth提出采用“自顶向下逐步求精、分而治之”的原则进行大型程序的设计。其基本思想是：从欲求解的原问题出发，运用科学抽象的方法，把它分解成若干相对独立的小问题，依次细化，直至各个小问题获得解决为止。

“程序正确性证明”的研究
1967年，Floyd提出用“ 断言法”证明框图程序的正确性。
1969年，Hoare在Floyd的基础上，定义了一个小语言和一个逻辑系统。此逻辑系统含有程序公理和推导规则，目的在于证明程序的部分正确性，这就是著名的Hoare逻辑。他的工作为公理学语义的研究奠定了基础。 
1973年，Hoare和Wirth把PASCAL语言的大部分公理化。
1975年，一个基于公理和推导规则的自动验证系统首次出现。
1979年，出现了用公理化思想定义的程序设计语言Euclid。
1976年，Dijkstra提出了最弱前置谓词和谓词转换器的概念，用于进行程序的正确性证明和程序的形式化推导。
1980年，D.Gries综合了以谓词演算为基础的证明系统，称之为“程序设计科学”。首次把程序设计从经验、技术升华为科学。
1974年，人们利用模态逻辑验证并行程序的正确性。
关于程序正确性证明的争论：
怀疑和反对派，理由：首先，形式证明太复杂，谁能够保证证明本身没有错误呢！其次，程序写好后再证明其正确性，相当于“马后炮”，即错误已经铸成，证明何能补救？
折中的方案：编写程序，边考虑证明。即程序设计与正确性证明同时并行考虑。

构造正确的程序
利用Dijkstra的谓词转换器及其演算规则集合，可以推导出正确的程序。

利用程序变化构造正确的程序。它对程序应用一连串的保护正确性的变换规则，最终得到可执行的程序。是1970年代以来，“程序设计方法学”研究的重要方面，是程序设计自动化很有希望的途径之一。递归程序变换是这一时期的最有意义的成果。如Burstall和Darlington的递归程序变换系统等。 

逻辑程序设计和函数程序设计代表一种新的研究方向。Prolog是以谓词逻辑的子集（Hoare子句）为基础的一种形式系统。Prolog的执行过程就是执行逻辑上消解算法的过程。

抽象数据类型的研究
抽象数据类型是程序设计方法学中一种极为重要的方法。人们把它誉为程序设计方法学发展史上的一个重要的里程碑。

研究的内容
结构化程序设计
数据抽象与模块化程序设计
程序正确性证明

程序的形式说明与推导
程序综合与分析技术
面向对象的程序设计方法
大型程序的开发

与软件工程的关系

研究方法的不同
软件工程主要应用工程的方法和技术研究软件开发与维护的方法、工具和管理的一门计算机科学与工程学交叉的学科 
程序设计方法学主要运用数学方法研究程序的性质以及程序设计的理论和方法的学科；

研究的对象不同
软件工程的研究对象是软件系统。目标是降低软件的开发成本，提高软件的质量，提高软件的可维护性，提高软件开发的效率。着重于软件的宏观可用性。程序设计方法学研究对象是程序。目标是保证程序的正确性。着重于程序的微观正确性。软件工程与程序设计方法学的界限变得越来越模糊 
程序设计方法学是软件工程的基础。

Chengxushejifangfaxue
软件开发
軟體工程