软件工程理论基础-勾勾画画
1.形式化方法
基本概念
形式化方法是基于严格数学基础,对计算机硬件和软件系统进行描述、开发和验证的技术。其数学基础建立在形式语言、语义和推理证明三位一体的形式逻辑系统之上。
完整定义
形式化方法是由形式化规约语言(包括形式语义与模型理论)、形式规约(包括精化与综合)、形式验证、形式化工具等形成的一个整体。其中
- 形式规约语言是基础,形式化方法中,软件制品是规约语言编写/变换的形式规约;
- 形式验证是保证开发正确性的途径,形式语义与模型理论是联接形式规约和形式验证的数学纽带;
- 形式化工具是系统设计和开发中高效使用形式化方法的需要和实践。
杂项
现代计算机科学和计算机科学技术源自于 Church 的 Lambda 演算 和 Turing 的图灵机等计算模型。
形式化方法以形式(逻辑)系统为基础,支持对计算系统进行严格的规约、建模和验证,并且为此设计算法从而建立计算机辅助工具。
与其他软件开发方法的主要区别在于:无歧义、严格、可重复性、可分析性和可验证性,可以有效提高和保障系统的可信性。
形式化方法学科研究形式化方法的数学基础、形式系统的表达能力、形式系统的推理系统以及可靠性与完备性,以及在计算系统开发和生命周期各个阶段的理论、方法、技术、工具和应用方式等。
1.2.形式化方法的四个阶段
人们主要从为程序设计提供数学基础的理论研究角度和为软件开发提供严格质量保证的软件工程角度推动形式化方法的提出和早期发展。
第一阶段:围绕形式语言和形式语义学的基础研究(1930-至今)
形式语言是由符号化字母表以及递归的语法规则完全定义和生成所有表达式或语句的语言。形式逻辑的语言都是形式语言,如命题逻辑、谓词逻辑和布尔代数。
形式语义学的研究逐渐形成了四大体系:
- 操作语义
- 指称语义
- 代数语义
- 公理语义
第二阶段:围绕形式规约和开发的方法学研究(1970-至今)
这一阶段形成了以形式规约语言为基础的形式化开发方法,如 VDM、Z、Event-B 和 RAISE 等。
第三阶段:围绕形式验证技术的工程化研究(1980-至今)
第四阶段:以可验证软件为目标的多学科交叉研究(2000-至今)
1.2.形式化方法的基本体系
基于形式化方法进行软件开发的基本框架
通过需求分析得到初始形式规约,然后,经过逐步求精或转化,得到一系列精化后的形式规约,最后,可转换或综合生成得到系统的程序代码实现。
2.形式规约
形式规约是由形式规约语言严格描述的系统模型或系统需要满足的性质,前者是模型规约,后者是性质规约,形式规约是形式化方法的基础。
2.1.形式规约语言
由严格的递归语法规则所定义的语言,满足语法规则的句子称为合式或良定义规约。
2.1.1.模型规约语言
模型规约语言利用数学结构描述系统的状态变化或事件轨迹,它直接定义所描述系统模型的结构、功能行为甚至非功能行为。
-
代数规约语言
如 OBJ、PLUSS、Larch -
结构化规约语言
如 VDM-SL、Z Notation -
进程代数(演算)
如 CCS、CSP、ACP -
基于迁移系统的规约
如 Petri 网、Statecharts
2.1.2.性质规约语言
性质规约语言基于程序逻辑系统,通过逻辑公式来描述一组性质以定义所期望的系统行为。性质规约不直接定义系统的具体行为。基于性质的形式规约偏向于说明性的,逻辑约束往往是最小必要的,以给出较大的实现空间。
系统需要满足的性质可以分为两类:
- 安全性质,即不好的事情从不发生
- 活性,即好的事情一定能发生。
2.2.形式语义学
起源于对程序设计语言语义的研究。程序设计语言的语法是符号化的,其语义就是该语言程序所描述的计算或者过程。
2.2.1.操作语义
使用抽象解释器定义语言语义,着重模拟数据加工过程中计算机系统的操作。
- 是最早使用的形式化语义方法,用来给出顺序程序的语义。
- 基于抽象机,与计算机最为接近,可描述实现方面的执行细节,操作性比较强,适合于开发语言编译器以及编译优化的应用。
2.2.2.指称语义
将语言的基本语法成分解释为数学对象(称为指称),用数学对象上的运算来定义语言的寓意。论域理论是指称语义的数学基础,讨论各种语言成分的指称的数学结构,并提供数学工具,从而在各种数学结构智商定义语言语义和推导语言成分特性。
- 建立指称语义的首要任务是确定一个相应的论域理论,即确定程序语言的解释域。
2.2.3.代数语义
用代数结构来定义计算机语言(特别是代数规约语言)的语义,是在抽象数据类型的基础上发展起来的。
2.2.4.公理语义
直接使用形式逻辑来描述程序的语义。其基本思路是,在已有的形式逻辑系统的基础上增加所有程序必须满足的基本命题(程序公理)。
2.3.形式化开发与软件构造
形式化规约和开发方法遵循软件开发方法的基本原理,包括关注点分离和逐步精化,在形式规约和验证的基础上,软件形式化构造活动包括针对形式规约多视角建模、不同抽象层上规约间的精化以及程序综合等。
- 基于规约的形式化开发
- 程序综合
使用指定的编程语言自动生成符合程序规约的技术,被认为是计算机科学的圣杯
3.形式验证
形式验证方法主要包括演绎式的定理证明和算法式的模型检验
3.1.定理证明
基于定理证明的形式验证将“系统满足其规约”这一论断作为逻辑命题,通过一组推理规则,以演绎推理的方式对该命题开展证明。
按照证明方式和自动化程度的不同,基于定理证明的验证又可分为两类:
- 基于自动定理证明器的自动验证
- 人机交互的半自动化证明
3.2.模型检验
基本思想:检验一个结构是否满足一个公式要比证明公式在所有结构下均被满足容易得多,进而面向并发系统创立了在有穷状态模型上检验公式可满足性的验证新形势。
3.2.1.基本途径
模型检验的核心是在有穷状态空间上的遍历策略和算法,主要有显式方法和隐式方法。
- 显式方法:通过状态计算来遍历状态空间
- 隐式方法:通过不动点计算来遍历状态空间
模型检验在建立了系统模型和性质描述后,验证过程是自动的。
3.2.2.软件模型检验
由于软件属于无穷状态系统(或者状态空间规模十分巨大),在硬件系统模型检验取得巨大成功时,软件模型检验所面临的挑战依然十分严峻。
4.形式化方法的应用
1994年出现的 Intel Pentium 浮点单元中的缺陷产生了巨大的影响,促使了形式化方法在硬件工业界的使用。
软件形式化的应用比硬件要早,但在工业界影响要小得多,原因是软件系统的复杂度远远高于硬件。
根据形式化程度的不同,形式化方法应用首先要确定是在整个系统应用还是在关键部分应用。确定了系统范围或边界后,可在相关部分中不同程度地应用形式化方法。
2016 年美国 NSF 支持了大规模的探索项目 DeepSpec,拟形成一种形式化方法开发的全栈工具链。
5.形式化方法面临的挑战与未来
程序设计语言和程序正确性是形式化方法发展的最初源泉。面向程序设计语言和代码,研究和运用形式化方法、技术与工具是一个重要方向。
规约、开发和验证的系统与环境的形态变化是形式化方法发展的驱动力。
形式化方法与人工智能有着密切联系。
在新的计算模型方面,形式化方法已经应用到了量子程序设计语言的语义分析、关键性质的推理。
教育是形式化方法持续发展的重要推手,形式化方法的学习曲线长,高强度运用需要较高门槛,制约了形式化方法在软件开发中的广泛应用。
6.其他
6.1.图灵机
一个图灵机由 7 个部分组成,表示为一个 7 元组:
$M = (Q, \Sigma, \Gamma, \delta, q_0, q_{\mathrm{accept}}, q_{\mathrm{reject}})$
| 符号 | 含义 |
|---|---|
| $Q$ | 一个有穷集合,状态集 |
| $\Sigma$ | 一个有穷集合,输入字母表,不包含特殊的空白符号 $\sqcup$ |
| $\Gamma$ | 一个有穷集合,带子字母表,其中 $\sqcup \in \Gamma, \Sigma \subseteq \Gamma$ |
| $\delta$ | 转移函数,$Q \times \Gamma \rarr Q \times \Gamma \times { L, R }$ |
| $q_0$ | 起始状态,$q_0 \in Q$ |
| $q_\mathrm{accept}$ | 接受状态,$q_\mathrm{accept} \in Q$ |
| $q_\mathrm{reject}$ | 拒绝状态,$q_\mathrm{reject} \in Q \land q_\mathrm{reject} \neq q_\mathrm{accept}$ |
6.2.自动机(有穷自动机)
有穷自动机由 5 个部分组成,表示为一个 5 元组
$M = (Q, \Sigma, \delta, q_0, F) $
| 符号 | 含义 |
|---|---|
| $Q$ | 一个有穷集合,状态集 |
| $\Sigma$ | 一个有穷集合,字母表 |
| $\delta$ | 转移函数,$Q \times \Sigma \rarr Q$ |
| $q_0$ | 起始状态, $q_0 \in Q$ |
| $F$ | 接受状态集,$F \subseteq Q$ |

浙公网安备 33010602011771号