高完整性软件开发:逻辑与魔法的较量
1. 高完整性软件开发的困境
在软件开发的生命周期中,后期纠错成本会随着错误发现时间的推迟而显著增加。大部分精力集中在开发后期,这就形成了一个经济恶性循环,导致高完整性软件的成本居高不下。要打破这个循环,就需要提前进行错误检测,在开发过程的早期对软件特性进行推理。
2. 推理的障碍
我们只能对含义精确且不隐藏关键信息的事物进行逻辑推理,但当前典型的软件开发过程似乎有意阻碍这种推理。
- 不精确的规范 :我们编写的非正式规范往往过于接近设计,而不能真正作为规范。例如,使用UML等符号,其语义模糊看似是优点,但实际上会导致问题。
- 语义模糊的UML图 :UML图忽略了开发后期会出现的具体细节,通过模糊而非真正的抽象来使图表更易理解,便于不同利益相关者之间的沟通。然而,如果这种沟通只是让每个参与者看到自己想看到的内容,而没有达成共同理解,那么就无法取得真正的进展,矛盾和困难会在未来更昂贵的阶段显现。此外,规范的语义模糊还会阻碍有效的代码生成。
- 编程语言的问题 :所有广泛使用的编程语言都存在歧义性和不安全性。例如,语言定义允许编译器编写者有一定的实现自由度,导致表达式和参数列表的计算顺序、子程序参数的传递方法等存在歧义。同时,语言规则或编码标准无法有效检查,如函数副作用在计算顺序未定义时会导致歧义,而禁止函数副作用在无法有效检测其存在时会导致语言不安全。以Ada语言为例,下面的子程序是合法的,但调用 Init(A, A);
时, A
的值取决