首页 > 编程知识 正文

软件形式化方法与智能技术,什么是形式方法?为何再软件开发的过程中使用形式方法?

时间:2023-05-03 15:07:14 阅读:181915 作者:1383

友情提示:本文理论性和专业性较强,如果木有接触过该领域,读起来可能会有一点点吃力,!本文是秀丽的航空结合多份资料综合整理而成,有点凌乱,见谅!

软件形式化方法(Formal Method)在软件开发中受到多方面的争论。 肯定的wmdlr认为形式化方法会引起软件开发的革命,否定者质疑或反对将数学引入软件开发过程。

形式化开发方法的一些争论和缺陷主要表现在以下几个方面

)形式化方法中包含的数学理论限制了很多程序员的学习和使用。

)2)采用形式化方法为延误项目开发周期、增加开发费用

)3)许多流行的形式化方法对小规模项目有效,但很难应用于一些大型系统

)4)形式化方法不能确保开发完全正确的软件;

)5)缺乏全面支持软件生命周期中各个阶段的形式化方法;

等等。

广义上为3358www.Sina.com/狭义上为形式化方法是借助数学的方法来解决软件工程领域的问题,主要包括建立精确的数学模型以及对模型的分析活动。形式化建模中,形式化表示必须包含一组定义语法含义的形式化规则。 这些规则可用于分析指定表达式是否符合语法规定,或证明表达式具有某些性质。

形式化方法是运用形式化语言,进行形式化的规格描述、模型推理和验证的方法。

关于形式化方法:悲观者的角度形式化方法是为数学家准备的

形式化方法只供从事形式化研究的人使用

从事形式化研究的人只使用形式化方法

形式化方法的运用将减缓软件开发的进度

形式化方法的运用将提高软件开发成本

格式化的方法仅适用于安全要求极高的系统的开发

形式化方法仅用于非关键系统,缺乏工具支持

采用形式化的方法开发完美的软件

形式化方法可以取代传统的软件工程方法

形式化方法的出发点是关于形式化方法:乐观者的角度,其数学逻辑方法。 从软件开发来说,形式化方法目前还不是软件开发的主流。 从软件的发展来看,早期软件用于数值计算,程序语言侧重于函数和算法的描述,之后数据库的应用和数据结构逐渐变得重要。 由于当前的软件更为复杂,对象、组件、接口、通信、开放等已成为非常重要的概念。 从软件工程的方法来说,有一种方法可以描述这些概念。 例如,使用图形、表格、逻辑、自然语言等进行交叉使用来描述系统的各个方面。 因此,从另一个角度来看,我们也可以以目前常用的软件开发方法为出发点,研究如何将这些方法形式化,使软件系统描述精确化,减少误解带来的问题; 或者以目前常用的软件开发过程为出发点,研究如何在软件开发过程中增加形式化方法的应用,以提高软件的可靠性。

形式化的方法可以分为3358www.Sina.com/和基于形式化描述构建的3358www.Sina.com/。 形式化描述是指用形式化的语言(具有严格语法意义定义的语言)进行描述。 形式化软件开发是指用形式化的语言描述软件的需求和特点,通过推理验证保证最终的软件产品满足这些需求并具备它们的特点。 这样的验证当然必须基于严格的语法含义。 在实际应用中,这并不容易做到。目的是开发可靠的软件产品

形式化方法的意义在于有助于发现其他方法难以发现的系统描述的不一致、不明确或不完整,有助于提高软件开发人员对系统的理解,因此形式化描述最初的形式化方法是逻辑和逻辑推理广义上,该目标遇到了很多挫折,包括逻辑系统的不完备性(incompleteness )、逻辑系统的不可判定性(undecidability )、自动推理的困难理性(intractability )等。 但第一个是

些实际应用上,逻辑方法和自动推理还是起着非常大的作用。

 

       形式化方法在软件开发中能够起到的作用是多方面的。首先是对软件需求的描述,软件需求的描述是软件开发的基础。比如说一般非形式化的描述很可能导致描述的不明确和不一致,如果描述的不明确和不一致将导致设计、编程的错误,将来的修改所要付出的代价就非常大了,如果导致的错误没有被发现,则影响程序的可靠和使用。形式化方法则要求描述的明确性,而描述的不一致性也就相对易于发现。其次是对软件设计的描述。软件设计的描述和软件需求的描述一样重要,形式化方法的优点对于软件需求的描述同样适用于软件设计的描述,另外由于有了软件需求的形式化描述,我们可以检验软件的设计是否满足软件的要求。对于编程来讲,我们可以考虑自动代码生成。对于一些简单的系统,形式化的描述有可能直接转换成可执行程序,这就简化了软件开发过程,节约了资源和减少了出错的可能性。另外,形式化方法可以用于程序的验证,以保证程序的正确性。对于测试来讲,形式化方法可用于测试用例的自动生成,这可以节约许多时间和在一定程度上保证测试用例的覆盖率。

 

 

       形式化方法原则上就是用数学与逻辑的方法描述和验证软件。从描述上讲,一方面是系统或程序的描述,另一方面是性质的描述。这些可以用一种或多种语言来描述。这些语言包括命题逻辑,一阶逻辑,高阶逻辑,代数,状态机,并发状态机,自动机,计算树逻辑,线性时序逻辑,进程代数, π-演算, μ-演算,特殊的程序语言,以及程序语言的子集等。从验证来讲,主要有两类方法,一类是以逻辑推理为基础,另一类则以穷尽搜索为基础。逻辑推理有 natural deduction, sequent calculus, resolution 以及Hoare-logic 等方法,穷尽搜索方法统称为模型检测。这类方法与系统或程序以及系统性质的表示有很大的关系,比如说符号模型检测,其基本原理是用命题逻辑公式表示状态转换关系,用不动点算法计算状态的可达性以及这些状态是否满足某些性质。

 

       形式化方法的应用在电路设计和协议设计上都取得了很大的成绩,但是对于软件来讲还有很多没有解决的问题。软件的描述要比电路和协议复杂,一个软件描述所包含的状态空间通常来讲可以是无限的,因此验证的难度很大。逻辑推理的不足之处在于推理的难度,对于稍微复杂的系统,自动化的推理就难以胜任。人为的推理有很大的缺点,除了费时费力外,比如说一个定理推不出来,并不能说明这个定理不成立,很可能是推理方法和策略应用不当。模型检测的好处在于它有全自动化的检测过程,并且如果一个性质不满足,它能给出这个性质不满足的理由,我们即可据此对我们的系统描述进行改进。模型检测的困难首先是它所能检测的是有限状态模型。这样对于一般软件来讲,需要有一个从任意状态到有限状态的建模过程,并且这样的一个模型的状态空间会面临组合爆炸的问题。

 

       形式验证一般被称为形式化验证方法,是相对于传统的验证(模拟、仿真和测试)而言的。形式化验证方法的主要思路就是使用数学的公式、定理和系统来验证一个系统的正确性等。目前的形式化验证方法可以用于验证硬件系统、软件系统和其他系统,而且形式化验证的技术目前也已经发展到不但可以验证系统的功能正确性(有没有错误),而且可以验证系统的性能指标(功耗、散热、延迟等等)。形式化验证方法主要可以分为三种:定理证明、模型检测和等价性验证。定理证明的基本原理是选定一个数学逻辑体系,并用其中的公式来描述(如软、硬件)系统和系统性质刻画,然后在一定的数学逻辑(如hol逻辑)体系中依据此体系的公理、定理、推导规则和系统描述公式,看看能不能推导出系统的性质刻画公式,如果可以的话验证成功。模型检测的原理比较简单但是非常实用,它将(如软、硬件)系统建模成有限状态系统(一般成为keripke结构),系统的性质刻画用时序逻辑公式表示(CTL,LTL等),而后在此模型上来验证性质刻画的正确性,模型检测于定理证明相比是有很大优势的,他可以全自动地验证,不需要人工干预,而定理证明则在一些关键推导路径中需要数学家控制。还有一种是等价性验证,等价性验证其实是一种半形式话的技术,同前两种验证正确性的技术不同,它验证的是设计的一致性,即不同设计阶段的设计是否功能相同,这种技术中一般采用符号的方法和增量的方法,而且由于这种方法和硬件电路紧密结合,所以电路验证的一些传统方法也大量应用于此中方法中来,比如ATPG技术等。如大家使用的Synopsys的Formality本质上就是一个等价性验证器。形式化验证是非常有用的,只是国内作这一行的人太少。大家可以看看Synopsys和Cadence两家公司,它们都是从形式化验证起家的,然后转到目前流行的将设计和验证统一在一起,即“设计验证”领域。

    

 

  

       软件形式化方法研究内容:
    形式化语言(形式化描述、形式规约):怎样描述软件系统及其行为模式;更好地刻画软件系统的性质,比如说,通讯、分布、开放、移动;各种语言的应用、比较,语言与语言之间的转换;开发相应的软件工具。

    形式化验证(形式验证):怎样验证软件系统符合给定的行为模式;更有效地验证软件系统的性质,比如说,自动化、速度快、内存需求少;各种方法的应用、比较;开发相应的软件工具。

 

    具体来说,软件形式化方法包括以下几个主要研究方向:

    (1) 基础概念:复合、抽象、重用模型、数学理论组合、数据结构及算法。需要对如何复合方法、复合规格、复合模型、复合理论、复合证明等进一步的理解;需要开发出将整体特性分解为易于验证的局部特性的有效方法;实际系统在规格和验证之前都要进行某种程度上的抽象,需要研究出评判抽象层次合理与否的方法;重用不仅可以提高开发效率,而且可以提高软件的可靠性,应当研究可重用模型和理论;许多安全关键反应式系统是数字和模拟混合的,需要连续和离散两个范畴内数学基础支撑的混杂系统理论和技术支撑;大规模、复杂软件中搜索空间是巨大的,需要研究出新的数据结构和算法。

    (2) 形式化方法与面向对象方法的结合:这已经成为软件工程领域的一个研究热点,例如:Statecharts、Petri网、Z语言、VDM等,以及与面向对象方法结合产生的Objectcharts、面向对象Petri网、Object-Z、Z++、VDM++等。这方面的研究体现在两个方面:利用面向对象结构来提高形式符号的表达能力;使用形式化方法来分析面向对象的语义或提高这些标记符号的表达对象概念的能力。形式化方法和其他传统软件开发方法相结合以达到取长补短的目的,也是值得研究的课题。

    (3) 工具开发:具有良好用户界面、易于学习和操作简单的形式化方法支撑工具,对于形式化方法的推广应用是大有裨益的。追求通用的完善的形式化方法及其支撑工具是不现实的,侧重于如下某一个或几个方面准则的特色方法和工具是未来研究的重点。这些准则包括:一旦开始使用之后尽早得到明显的效益;效益随着开发者的了解深入和熟练而增加;单一规格可以在软件开发生命周期的多个阶段取得效益;能和其他通用编程语言或方法交互使用;工具应当像编译器那样易于使用、输出,也易于阅读;概念和工具应当易于入门和学习掌握;软件特性分析有所侧重;支持渐进软件开发,允许部分规格和验证。此外,特定问题域的形式化方法及其工具研究也是非常重要的。


【作者:暴躁的白开水   http://blog.csdn.net/lovelion

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。