形式化方法,中文也称形式方法、正规方法。在计算机科学和软件工程领域,形式化方法是基于数学的特种技术,适合于软件和硬件系统的描述、开发和验证[3]。将形式化方法用于软件和硬件设计,是期望能够像其它工程学科一样,使用适当的数学分析以提高设计的可靠性和强健性[4]。但是,由于采用形式化方法的成本高意味着它们通常只用于开发注重安全性的高度整合的系统。
形式验证:在计算机硬件(特别是集成电路)和软件系统的设计过程中,形式验证的含义是根据某个或某些形式规范或属性,使用数学的方法证明其正确性或非正确性。
在计算机硬件(特别是集成电路)和软件系统的设计过程中,形式化验证的含义是根据某个或某些形式化规范或属性,使用数学的方法证明其正确性或非正确性。神秘感大抵来源于定义中的两个严谨而且抽象的关键词——“形式化规范”和“数学方法证明”。事实上,揭开这层神秘的面纱,你会发现形式化验证的许多有趣之处。
形式语言:在数学、逻辑和计算机科学中,形式语言(英语:Formal language)是用精确的数学或机器可处理的公式定义的语言。
如语言学中语言一样,形式语言一般有两个方面:语法和语义。专门研究语言的语法的数学和计算机科学分支叫做形式语言理论,它只研究语言的语法而不致力于它的语义。在形式语言理论中,形式语言是一个字母表上的某些有限长字符串的集合。一个形式语言可以包含无限多个字符串。
语言的表示方法:
枚举法
如果一个形式语言的元素数目是有限的,那么可以通过枚举它的各个字串来严格地定义它。
形式文法
通过形式文法来产生。
正则表达式
正则表达式是一种很多编程语言和库都支持的语法,这种语法可以用于匹配符合一定条件的字符串,经常用于文本的搜索和过滤。从名称上来说,正则表达式应当是对应于正则语言的,在形式语言领域内所称的正则表达式确实如此。不过,在实际的编程语言中,很多正则表达式已经通过引入复杂的扩展,可以匹配正则表达式所不能描述的内容。形式语言中的正则表达式和一般编程语言中所称的正则表达式在语法上也有较大差异。
自动机
直觉上来说,自动机消耗输入符号,并在自身的不同状态间转移,可以通过状态机消耗完整个字符串之后是否达到某些特定状态来定义一个字符串是否属于某一个语言。语言可以通过某种自动机来识别,比如图灵机、有限状态自动机。
常用的两个案例:我们首先来探讨一下,哪些领域对程序错误是零容忍的?在哪些领域,程序错误带来的损失难以估量?
实际上,形式化方法是从硬件设计开始普及的。一个著名的例子是:当年Intel的Pentium CPU浮点运算单元出错(FDIV Bug),数以万计的CPU不得不回收和替换,给Intel造成了巨大损失(475M $)[1]。
从那之后,Intel开始在其芯片设计中广泛采用形式化方法。
计算机硬件巨头如IBM,AMD, NVIDIA 和 CADENCE[2]等等也都是形式化方法的使用者…
要说起吃一堑才能长一智,其实各行各业都有试错者,在工业界也是如此。举个例子:1996年,欧洲航天局首次发射的阿丽亚娜5型(Ariane 5)火箭,由于惯性导航系统发送的错误指令(浮点数转换为整数造成溢出),导致火箭在发射仅仅37秒后便偏离了预定轨道,最终坠毁。欧洲航天局的巨额研发经费(8B $)[3]付之一炬。
在那之后不久,EADS公司开发阿丽亚娜火箭的任务调度模型就开始使用形式化方法。
美国国家宇航局NASA和英国国防部在90年代相继发布设计标准[4],形式化方法的使用位列其中。我国的玉兔号月球车控制系统和我国第一个自主研发的空间飞行器嵌入式实时操作系统SpaceOS[5],也都是通过形式化方法验证其正确性。