写在前面
最近忙着写软件体系结构论文,才开始了解所谓的形式化方法。形式化方法在软件开发中有其特殊地位,了解一下对于计算机程序生涯,将有所裨益,下文将以直观形式介绍一下形式化方法,尤其是B方法。
当然从这篇博客起,我将保持简洁,崇尚头脑风暴,更详细的展开不在此处讨论。
使用非形式化的自然语言描述系统规格说明容易引起二义性,不完整,可能存在矛盾;为了克服欠形式化方法的缺点,人们把数学引入软件开发过程,创造了基于数学的形式化方法。
所谓形式化方法,是指具有坚定数学基础的方法(例如集合,关系,谓词逻辑等)的基础之上的方法,是数学上的综合,分析技术的应用,用于开发计算机控制的系统,经常有推力工具的支持,它可以提供一个用于模型设计和分析的严格而有效的途径。
简而言之,形式化方法即建立在严格数学基础之上的软件设计,验证,并运用与实际开发的技术。
目前流行的形式化方法,包括有穷自动机,Petri网,Z语言,上下文相关的文法等形式化方法。
Z方法和B方法均由法国科学家Jean-Raymond Abrial发明,B方法基于集合,关系和谓词逻辑等数学理论书写规范,主要通过不变式(INVARIANT)和证明义务(Proof Obligation, PO)来保证规范正确性。B方法描述软件的基本单元是抽象机(Abstract Machine),抽象机之间可以组织成更大的抽象机,抽象机可以逐步精化直至最终实现。
典型的抽象机组织结构如下图所示:
下面通过B方法直观感受下形式化方法开发。这里的例子来自北大数学系 裘宗燕教授B方法课件(你可以访问裘宗燕老师关于B方法的课程主页了解更多内容)。
B方法的支持工具软件AtelierB如下图所示。
上述这段代码中IF语句以及其他逻辑关系符号,表示了简单的数学关系以满足叫号机的正确性。这里只是作为展示,其实形式化方法可以包含更多的逻辑性以满足程序正确性,而且不都是用我们熟悉的if..else语句表示的。
编写完的抽象机需要进行类型检查,然后由系统自动或交互式完成证明义务,系统生成的证明义务如下图所示:
类型检查通过后,免费版的AtelierB可以为我们生成一个叫号机模型的C语言头文件,如下图所示:
形式化方法克服了非形式化语言描述的缺点,它能简洁准确地描述研究对象,便于建立正确完整的数学规则说明;同时在软件开发过程中使用数学的另一个有点是,可以在软件工程活动之间平滑地过渡,不仅功能规则说明,系统设计也可以使用数学表达式,当然程序代码也是一种数学符号。可以利用数学证明方法证明设计符合规则说明,程序代码正确地反映了设计结果。当然形式化方法也绝不是万灵神药,他也有它的局限性,因此也有人对形式化方法持怀疑态度。
对于形式化方法我接受两个观点:
1)软件需求日益复杂,软件开发过程中没有一个普适的解决问题的方法,因此任何有助于缓解系统复杂性,提高软件质量的方法都有其价值;
2) 不要过分夸大某一种方法的能力,没有绝对的正确与先进,计算机技术总是不断发展的,实践中总是结合多种方法的优势进行的。
好了吧,头脑风暴就到这儿了,如果对形式化方法感兴趣,想进一步学习,下面你需要思考诸如数组是一个索引到值的函数(映射)之类的数学问题了。