在我看来,形式化方法就是使用精确的数学逻辑描述方法指导软件的开发过程。
其优点是首先机器可识别这样就能够实现自动化;其次无二义性且可以严格的证明开发的正确性,这样就能够保证程序的正确实现,给程序提供更好的安全性。
其缺点是该方法使用门槛高、难度较大。这种开发方法的引入将会给传统的程序开发人员带来巨大冲击。
软件形式化方法的研究始于20世纪50年代,兴于20世纪60年代的“软件危机”时期。经过30 年的研究和应用,如今人们在形式化方法这一领域取得了大量、重要的成果,从早期最简单的形式化方法——一阶谓词演算方法到现在的应用于不同领域、不同阶段 的基于逻辑、状态机、网络、进程代数等众多形式化方法。形式化方法的发展趋势逐渐融入软件开发过程的各个阶段,从需求分析(功能描述)、设计、编程、测试直至维护。
那么它的前景怎么样呢?
为了能有一个直观的概念,我们把软件开发的发展进程与工业化进程进行一下比较。最初的软件开发像是作坊式的开发,工匠按照自己的想法制作产品;而后出现了著名的“软件危机”(20世纪60年代),应对软件危机有两种选择,一种是引入了软件工程的概念,把大批工匠集中起来,有组织的建造更大的产品,另一种是形式化方法,也就是说,遇到一个非常复杂的产品,单独的工匠已经无力面对,有两种解决方案,一种是有组织分工的使用大量工匠即“工程”思想,另一种是使用“机器”,最终的结果是两种方法都在发展,当然在“机器”不成谁的条件下,“工程”的方法发展更快;之后UML图(属于半形式化的方法)被引入,在一定程度上提高了开发的效率和质量。
如果软件开发行业会发生“工业革命”,那么“蒸汽机”很有可能就是形式化方法。在软件开发领域,人们的远大梦想是自动的生成代码和自动的生成工程。为达成这个目标,我们需要引入“机器”以实现自动化,而形式化方法就是“机器”的备选项。(我不清楚会不会出现或者存在其他的方法,但形式化方法理论上是可行的。)另外,可以清晰地看出软件开发已经从朴素的、非形式化的方法转变到了半形式化的方法,其趋势是向着更加严格、更加形式化的方向转变。
现在的形式化方法相当于“早期的蒸汽机”,性能还比较差,效率也不高,以至于还无法与人力相抗衡。所以至少它还需要发展,具体要发展多久很难说,也有可能像人工智能或者机器人那样几十年也没多少进展。感觉形式化的未来或许类似于语义网,看得到希望,却看不出远近。
形式化方法的应用在电路设计和协议设计上都取得了很大的成绩。相信它也能够在软件开发当中发挥威力。
虽然现在使用形式化的方法还不够成熟,但是它是软件开发未来发展的趋势。相信终有一天它会发挥出它的优势。