>>转帖:形式化方法与软件可靠性--源自LEEKO

引言:

 

形式化方法可以分为形式化描述和建立在形式化描述基础之上的形式化开发。形式化的描述就是用形式化的语言(具有严格的语法语义定义的语言)做描述。形式化的软件开发,就是用形式化的语言来描述软件需求和特征,并且通过推理验证来保证最终的软件产品是否满足这些需求和具备这些特征。这样的验证当然得建立在严格的语法语义的基础之上的。在实际应用中,这是不容易做到的。形式化方法研究的目的就是希望能够提供更好的理论、方法和工具,扩大形式化方法的应用范围和使用价值。

 

形式化方法的意义在于它能帮助发现其它方法不容易发现的系统描述的不一致,不明确或不完整,有助于增加软件开发人员对系统的理解,因此形式化方法是提高软件系统,特别是safety-critical系统的安全性与可靠性的重要手段.最早的形式化方法是逻辑与逻辑推理,它的目标是使推理机械化.从广义上讲,这一目标受到许多挫折.比如说逻辑系统的不完备性(incompleteness)、逻辑系统的不可判定性(undecidability)、自动推理的难处理性(intractability).但是在一些实际应用上,逻辑方法和自动推理还是起着非常大的作用.

 

早期形式化方法在软件验证的应用是串行程序的验证,后来随着软件研究和应用的发展,逐渐多样化.比如用逻辑和代数方法描述软件,用逻辑推理来验证软件(即描述软件的这些逻辑公式)的性质.又比如用进程代数描述并发软件,用模型检测方法验证这些软件的性质.近年来,由于认识到形式化方法重视的是严谨性,而这些方法与常用的软件方法差别很大,逐渐有许多结合图形化软件方法、面向对象方法和形式化方法的工作.以上所述几个方面(即程序验证,定理证明,模型检测,图形化方法和形式化方法相结合)的内容虽然不尽一样,但密切相关.定理证明与模型检测互为补充,各有所长.对于复杂的软件系统的验证,最好是能够结合多种方法的使用.这些方法对高可信软件开发方法的探索和应用都极为重要。

 

形式化方法与软件可靠性:

 

随着软件的广泛应用,特别是软件在尖端领域的应用,软件可靠性成为一个非常重要的问题。软件的可靠取决于两个方面,一个是软件产品的测试与验证,另一个是软件开发的方法与过程。对简单的软件开发,我们的经验是先有对软件的要求,然后对软件进行设计,然后是编写程序,最后是对程序进行测试,如果测试出错则对软件进行修改,然后再测试,直至对程序满意为止。对复杂的软件系统,总的过程基本还是这样,只是各个阶段也相应复杂一些。比如说,软件的要求可能需要从多方面进行描述,软件的设计需要从多方面考虑,程序的编写需要分成多个单元,对于测试来讲也就有单元测试和总体测试的分别。有些软件的要求难以一开始就完全清楚,而更改软件要求会对软件设计以及其他大量已经完成或正在进行的工作产生很大的影响,因此有些软件开发方法和过程就需要提供反复修改软件要求的便利。

 

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

 

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

 

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

 研究内容:

 形式化语言:怎样描述软件系统及其行为模式。

更好地刻画软件系统的性质,比如说,通讯、分布、开放、移动。

各种语言的应用、比较。语言与语言之间的转换。

开发相应的软件工具。

 形式化验证:怎样验证软件系统符合给定的行为模式。

更有效地验证软件系统的性质,比如说,自动化、速度快、内存需求少。

各种方法的应用、比较。

开发相应的软件工具。

 形式化方法的出发点是数学逻辑方法。其目的是开发可靠的软件产品。从软件开发来讲,形式化方法目前并非软件开发的主流。从软件发展看,早期的软件是用于数值计算,程序语言侧重于函数和算法的描述。后来数据库的应用和数据结构逐渐变得重要。现在的软件更为复杂,因此,对象、组件、接口、通讯、开放等成为非常重要的概念。从软件工程方法来讲,有一套描述这些概念的办法,比如说用图形、表格、逻辑、自然语言等,交叉使用以描述一个系统的各个方面。因此换一个角度来考虑,我们也可以以目前常用的软件开发方法为出发点,研究怎样将这些方法形式化,使软件系统的描述精确化,以减少可能的误解所带来的问题;或以目前常用的软件开发过程为出发点,研究怎样在软件开发过程中增加一些形式化方法的应用,以提高软件的可靠性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值