形式化方法
形式化方法的概念
- 形式化方法英文的名称是formalmethods,形式化方法模型的主要活动是生成计算机软件形式化的数学规格说明。
- 形式化方法使软件开发人员可以应用严格的数学符号来说明、开发和验证基于计算机的系统。
- 软件形式化方法是指建立在严格数学基础上的软件开发方法。在逻辑科学中是指分析、研究思维形式结构的方法。它把各种具有不同内容的思维形式(主要是命题和推理)加以比较,找出其中各个部分相互联结的方式,如命题中包含概念彼此间的联结,推理中则是各个命题之间的联结,抽取出它们共同的形式结构;再引入表达形式结构的符号语言,用符号与符号之间的联系表达命题或推理的形式结构。
- 例如,把全称肯定命题,用符号形式化为“SAP”;把联言命题、假言命题分别形式化为:“p∧q、“p→q”。
- [个人理解]:
- 形式化方法是一种标准方法,ISO标准
- 类似离散数学中“逻辑和证明”
软件工程领域的形式化方法
- 在计算机科学和软件工程领域,形式化方法是基于数学的特种技术,适合于软件和硬件系统的描述、开发和验证。
- 将形式化方法用于软件和硬件设计,是期望能够像其它工程学科一样,使用适当的数学分析以提高设计的可靠性和鲁棒性。但是,由于采用形式化方法的成本高意味着它们通常只用于开发注重安全性的高度整合的系统。
形式化方法的分类
- 根据说明目标软件系统的方式,形式化方法可以分为两类:
- 面向模型的形式化方法:通过构造一个数学模型来说明系统的行为。
- 面向属性的形式化方法:通过描述目标软件系统的各种属性来间接定义系统行为。
- 根据表达能力,形式化方法可以分为五类:
- 基于模型的方法
- 基于逻辑的方法
- 代数方法
- 过程代数方法
- 基于网络的方法
应用场景
- 形式化方法在软件开发中能够起到的作用是多方面的。
- 软件需求
- 软件需求的描述是软件开发的基础。比如说一般非形式化的描述很可能导致软件需求的不明确和不一致,需求的不明确和不一致将导致设计、编程的错误,将来的修改所要付出的代价就非常大,如果导致的错误没有被发现,则影响程序的可靠性和使用。形式化方法则要求描述的明确性,达到软件需求的一致性,从而实现软件的开发,而描述的不一致性也更易于发现。
- 软件设计
- 软件设计的描述和软件需求的描述一样重要,形式化方法的优点对于软件需求的描述同样适用于软件设计的描述,另外由于有了软件需求的形式化描述,我们可以检验软件的设计是否满足软件的要求。对于编程来讲,我们可以考虑自动代码生成。对于一些简单的系统,我们可以运用形式化工具直接转换成可执行程序,这就简化了软件开发过程,节约了资源和减少了出错的可能性。
- 软件实现
- 形式化验证可以用于软件的实现,通过快速检测源代码设计与验证描述是否一致,增强代码可靠性,确保程序的正确性。C代码形式化验证(W-AVC),可实现自动化验证C文件的形式化验证。采用插件集成的方式,对源代码文件进行形式化验证,通过接收一个包含形式规约语言注释的程序,找到源代码中不符合注释描述的内容,从而验证代码符合代码功能规范的描述,达到软件功能的实现。
优缺点分析
优点
- 形式化说明以逻辑精确性为特色, 除去了在非形式化说明中不可避免的大部分含糊不清的描述, 这种精确性为开发人员与用户对需求的一致性理解, 及需求的正确执行提供了更大的可能性。
- 形式化证明通过对需求分析中所描述的系统行为提供逻辑的精确论证, 除去了需求分析中的模糊性和主观性。
- 通过形式化说明和证明实现了系统的重复分析、一致性分析以及一个较少依赖特定分析者技术和毅力的分析过程。
- 形式化说明和证明可以通过“裁剪”以适合于给定的项目及技术要求, 也就是说能被调整以满足具体项目的需要。
- 形式化说明和证明能够应用于任何开发阶段, 包括目前最需要分析方法的开发早期, 越早发现和确定错误比晚一些发现付出的代价要小的多。
- 形式化说明和证明是基于计算机的工具所支持, 这使得一致性检查和证明等实现了自动化, 提高了系统的可靠性, 减少了在分析方面的费用。同时, 这些工具容许证明能够被重复执行而大大增强了分析的重复性。
- 形式化说明和证明弥补了现有的测试方法, 通过提供一个精确的形式化说明而得以获取一个好的测试计划。
缺点
- 形式化方法中所包含的数学理论,限制了大多数程序设计人员的学习和使用。
- 认为采用形式化方法会延误项目开发周期、增加开发费用。
- 许多流行的形式化方法对于较小规模的项目是有效的,但却很难应用于一些大型系统。
- 形式化方法不能确保开发出完全正确的软件。
- 缺乏对软件生命周期内各个阶段提供全面支持的形式化方法。
【参考资料】
什么是形式化方法?
软件工程——形式化方法概述