You are on page 1of 5

  第 20 卷 第 5 期 小型微型计算机系统 V o l. 20 N o.

5
   1999 年 5 月 M IN I- M ICRO SYST EM S M ay 1999

基于构件设计的正确性验证
云晓春 方滨兴
( 哈尔滨工业大学计算机系 哈尔滨 150001)

摘  要 本文研究基于构件设计的正确性问题. 我们首先建立一个构件描述的模型: ( 1 ) 接口: 通过对


CO RBA 的 IDL 进行扩展, 使其能够在构件的接口中同时描述构件的语法和语义信息; ( 2 ) 实现: 通过引入
一个简单的程序模型, 阐述如何利用子构件构造一个新的构件. 然后我们考虑如何将构件的接口和实现联
系起来: 利用 Hoa re 逻辑, 验证一个构件的实现是否满足其接口中所给出的语义要求.
关 键 词 基于构件设计 接口 实现 形式语义
分 类 号 T P 311. 5

1 引 言
在开发大型商业软件时通常会遇到费用昂贵、耗时、难于测试、维护和更新等问题, 我们把这一系列严重问题统
称为“软件危机”
. 基于构件设计的思想正是针对这些问题而提出的. 它的基本策略是: 利用可重用、预测试且可独立
更新的构件来装配软件. 具体地讲:
在软件开发过程中, 软件工程师不再直接书写代码, 而是将具有某些特定功能的构件组合在一起以构成一个复
杂的系统. 在这里, 构件功能的获取不是通过考察其内部细节, 而是通过观察构件的接口获知〔1〕. 基于构件的设计是
一个基于对象的软件运动. 它提出了这样一个一般性问题: 当应用元素是由不同厂商使用不同语言、工具及计算平
台所构造的, 如何利用它们来设计系统的? 这种软件开发方式的目标是使得最终用户和开发者能够象视听电子元件
的生产、消费者那样享受到同样高层次的即插即用的应用互操作性. 利用这一方法, 一个大型软件可以通过集成来
自于不同厂商的最好的构件快速装配成功. 时至今日, 利用已存构件构造软件已引起愈来愈多的重视. 许多机构正
在进行构件重用工程的研究, 大量的重用工具正在应用和研制中〔2, 3, 4〕.
基于构件设计可被看作一个渐次积累的过程: 当一个软件由一些子构件构造成功之后, 它同时又可作为一个新
的构件放入构件库中被其它软件所重用.
本文中, 我们主要关注如下两个问题:
1. 构件的描述: 一个可重用构件的本质是什么? 如何划分构件的描述层次?
2. 构件的正确性验证: 如何验证由子构件所装配成功的构件是否满足其接口中所给出的要求?

2 构件的描述
一个构件的本质是什么? 直觉上, 我们将构件看作一个计算单元, 它具有其自身的内部状态并提供了一组操作
来对这个状态读出和写入. 构件的状态是不可见的, 它只能通过调用构件中的操作才能访问到. 在这里, 我们规定读
操作返回构件当前的状态且不对状态进行修改; 而写操作对当前状态进行修改但不返回任何值.
由于基于构件的设计需要一种机制来保障子构件之间可以相互合作并能够同时开发. 为此, 通常的做法是将每
个构件的描述分成两个层次:
・ 接口: 抽象地描述每个构件的外部行为, 并以此作为其它构件的使用依据.
・ 实现: 接口中描述的具体实现.
2. 1 接口

1998209202 收稿 云晓春, 博士研究生, 主要从事基于构件设计技术以及并行计算技术的研究. 方滨兴, 教授, 博士生导师, 主


要从事并行计算技术, In ternet 技术以及计算机系统结构的研究.
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
5 期             云晓春等: 基于构件设计的正确性验证      331

  一个构件的抽象描述包括语法级和语义级两个层次. 语法级描述刻画了怎样调用一个构件的操作; 而语义级描


述则刻画了对于构件中操作的期望结果. 对于构件的语义, 我们主要关心构件的初始特性以及一个操作的执行所导
致的构件特性的变化. 我们使用一阶逻辑 (first 2o rder log ic) 语言〔6〕来描述构件的特性:
定义 1:
一个特性 P 指的是对应于读操作的一个命题公式. 它或者是一个布尔真值 T , 或者是一个原子特性 p , 或者是
一个反特性 P , 或者是一个合取特性 P1∧P2, 或者是一个析取特性 P 1∨P2, 或者是一个暗指特性 P1] P2. 即:
P ≡ T g p g  P g P1∧P2 g P1∨P2 g P1] P2
其中原子特性指的是对应于读操作的一个关系表达式. 例如: 假设 X , Y, R 是某个构件的读操作, 则类似于 X =
1, R < Y, X = R + Y 这样的表达式都是原子特性.
一个构件的初始特性指定了它的初始状态要求. 同时我们使用一个特性对来定义构件中每个写操作的语义, 其
含义是: 如果相应写操作在满足第一个特性 ( 预条件) 的任意状态下执行, 则其执行完毕后第二个特性 ( 后条件) 一定
满足.
这样, 我们可以给出构件接口的模型: 一个构件的接口描述包括一个初始特性, 一组读写操作的名字及其语法
描述, 另外对于每个写操作还提供了一个特性对, 用于描述该操作执行前后的行为约束.
为解决由于构件的分布和异构所产生的问题, 构件的接口使用一个公共的, 独立于任何程序设计语言的说明语
言来描述. 这类语言的一个著名的例子就是 CO RBA 所提供的 IDL ( 接口定义语言) 〔5〕. 利用 IDL 可以在构件的接口
中描述每个操作的参数及结果类型. 但 IDL 具有一个明显的缺陷: 它不具备语义描述的能力. 为此我们通过为 IDL
扩充几个预定义的特性操作符和保留字, 以便使其能够描述构件的语义信息:
・ 调用状态操作符 ( " @ " ) : 用于估算指定操作调用时的特性;
・ 预条件保留字 ( "p re" ) : 用于指定操作调用前所需满足的状态特性;
・ 后条件保留字 ( "po st" ) : 用于指定操作执行完毕所需满足的状态特性;
・ 初始特性保留字 ( " In it" ) : 用于指定初始特性;
・ 读操作保留字 ( "O b serve" ) : 用于指定读操作的接口描述;
・ 写操作保留字 ( "M od ify" ) : 用于指定写操作的接口描述.
下面我们以构件堆栈为例阐述如何利用扩充后的 IDL (E IDL ) 抽象地描述一个构件.
构件堆栈中定义了六个操作:
1. top: 读操作- - 返回栈顶的元素值;
2. second: 读操作- - 返回次栈顶的元素值;
3. p u sh: 写操作- - 把一个元素 e 推进栈. 该操作的语义可非形式化的描述为执行前堆栈不能为满, 执行完毕
后栈顶的值等于 e 而次栈顶的值等于执行前栈顶的值;
4. pop: 写操作- - 从堆栈顶部弹出一个元素. 该操作的语义可非形式化的描述为执行前堆栈不能为空, 执行
完毕后栈顶的值等于执行前次栈顶的值.
对于堆栈的初始特性, 我们将其定义为真. 下面是该构件的接口描述:
例 1   in terface stack{
  In it
  T;
 O b serve
  E lem    top () ;
  E lem    second () ;
 M od ify
  p u sh ( E lem e)
  p re T
  po st top () = e ∧ second () = @ top () ;
  pop ()
  p re T
  po st top () = @ second () ;
}
从上面的例子我们看到, E IDL 保留了 IDL 原有的语法描述能力, 同时由于扩充了一组新的预定义操作符和保
留字, 使得 E IDL 的解释能力相对于 IDL 有了显著的增强:
・ 通过使用 E IDL 所提供的保留字, 构件的接口说明层次变得更清晰 ( 初始特性→读操作→写操作) ;
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
332                小 型 微 型 计 算 机 系 统               1999 年

・ 允许使用预条件和后条件来说明操作的语义, 这是一种常见的、严格的形式化语义说明手段〔6〕, 使得 E IDL


增加了语义描述的能力;
・ 由于构件的固有特点——其内部状态不能从外部直接访问, 因此 E IDL 限制作为预条件和后条件的特性必
须是基于读操作建立的, 这种限制为我们从外部考察构件的语义提供了可能.
2. 2 实现
在基于构件设计中, 我们将构件实现时所用到的子构件分为全局子构件和局部子构件两类, 其中前者可被构件
中的每个操作所访问, 它存在于构件的整个生命周期; 而后者则只能被某个特定操作所访问, 它只在相应操作执行
时才创建, 并在操作执行结束后即撤销. 下面我们提出一个简单的构件实现模型:
一个构件的实现包含以下两部分:
1. 其所有子构件的名字和接口信息;
2. 根据子构件的操作对读写操作所进行的定义.
在这里, 我们强调子构件的接口是其在构件中被重用的唯一依据, 即子构件的实现中所描述的语法和语义信
息同其接口的抽象描述是一致的. 在我们的模型中, 我们将构件中的每个读操作的实现定义为一个由子构件的读
操作所构成的程序, 并将每个写操作的实现对应于一个由子构件的读或写操作所构成的程序.
那么, 什么是一个程序? 为此我们定义一个简单的程序模型: 一个程序或者是一个原子程序; 或者是程序 P 1 和
P2 的顺序执行; 或者是以特性 S 为测试条件的程序 P 的选择执行; 或者是以特性 S 为测试条件的程序 P 的循环执
行. 其中原子程序则对应于一个调用操作 c. op , 其语义是调用构件 c 中的操作 op. 假设 P, P1, P2 程序, 而 S 是构
件中的一个特性, 则上述程序模型可形式化地描述如下:
P ≡ c. op g P1; P 2 g if S then P1 g w h ile S do P1
上节所描述的构件堆栈是无界的, 下面的例子阐述了如何使用计数子构件 Coun ter 和无界堆栈 Stack 构造有
界堆栈 B _ Stack:
例 2:
Coun ter 和 B _ Stack 的接口描述如下所示:
in terface Coun ter{
  In it
   is_ zero () ; g g计数器初始值为 0
 O b serve
   in t po in ter () ; gg
返回计数器当前值
  Boo lean is_ zero () ; g g判断计数器当前值是否为 0
  Boo lean is_ m ax () ; g g判断计数器当前值是否达到最大值
  Boo lean is_ inc ( in t i) ; gg
判断计数器当前值是否比 i 大 1
  Boo lean is_ dec ( in t i) ; gg判断计数器当前值是否比 i 小 1
 M od ify
   inc ()
   p re   is_ m ax ()
   po st po in ter () = @po in ter () + 1; gg将计数器当前值加 1
  dec ()
   p re   is_ zero ()
   po st po in ter () = @po in ter () 21; gg将计数器当前值减 1
}
in terface B _ Stack{
  In it
  em p ty () ;
 O b serve
  Boo lean fu ll () ;
  Boo lean em p ty () ;
  E lem    top () ;
  E lem    second () ;
 M od ify
  p u sh ( E lem e)
  p re  fu ll ()
  po st top () = e ∧ second () = @ top () ;
 pop ()
  p re  em p ty ()
  po st top () = @ second () ;
}
利用构件 Coun ter 和 Stack, 有界堆栈 B _ Stack 的实现可描述如下:
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
5 期             云晓春等: 基于构件设计的正确性验证      333

com ponen t B _ Stack{


  in terface Coun ter;
  in terface Stack;
  Boo lean  fu ll () {Coun ter. is_ zero () ; }
  Boo lean  em p ty () {Coun ter. is_ m ax () ; }
  E lem    top () {Stack. top () ; }
  E lem    second () {Stack. second () ; }
  p u sh ( in E lem e) {
   if   is_ m ax () then{
   Coun ter. inc () ;
   Stack. p u sh ( e) ; } }
  pop () {
   if   is_ zero () then{
   Coun ter. dec () ;
   Stack. pop () ; } }
}
在上述构件实现模型中, 我们只要求子构件的接口信息, 允许子构件的具体实现是不可见的, 这样做的优点
是一方面使得程序员在重用子构件时无须陷入子构件繁琐的实现中, 另一方面使得在设计中有可能使用一些尚未
存在或尚未完成的子构件, 从而实现多构件的并行开发.

3 构件的正确性验证
一个构件的接口描述同其具体实现相互分离引发了一个潜在的问题: 该构件的实现是否正确地满足了其接口
中所给定的抽象描述? 为解决这种正确性问题, 我们应用 Hoa re 逻辑〔6〕作为进行证明的基本手段. Hoa re 逻辑是一
种对程序进行推理的理论. 它讨论了程序正确性证明的问题并提出了一种独立的公理方法来获得程序的稳定性.
根据 Hoa re 逻辑, 我们主要应用下列规则来计算和验证构件的语义正确性. 假设 P , Q , R , P 1, S 代表构件中的
特性, C , C 1, C 1 代表程序:
{P}C1{Q }, {Q }C2{R }
  顺序规则:
{P}C1; C 2{R }
{P ∧S}C{Q }, P ∧ S ] Q
  选择规则:
{P}if S then C {Q }
{P ∧S}C{P}
  循环规则:
{P}w h ile S do C {P ∧ S}}
P ] P1, {P1}C{Q 1}, Q 1] Q
  结束规则:
{P}C{Q }
由上节所刻画的构件实现模型可知, 构件中所有操作的实现都是由其子构件中的操作合成的, 故而构件的语
义可由这些子操作的合成语义所代表. 基于此, 我们提出相应的验证策略: 首先根据子构件接口中所给出的语义说
明, 应用上述规则计算出构件的初始特性以及每个写操作的预条件和后条件, 然后对照给定的构件接口说明以及一
组验证条件, 判断构件实现的正确性.
我们可使用下面的算法计算一个构件的实现所代表的语义:
该构件的初始特性等价于其所有全局子构件的初始特性所构成的合取特性; 由于子构件接口中给出了每个写
操作的语义信息, 因此对于任一个原子程序 c. op , 我们可假定其对应于条件和后条件为 (p , q ) , 根据这一假设, 对于
构件中每个写操作, 若其对应的程序为 C , 则该操作的预条件和后条件可递归地计算如下:
calcu late : C → P rop erty1× P rop erty2
calcu late (C ) ≡
 case C of
  c. op → (p , q) ,
  C1; C2→ let (p 1, q1) = calcu late (C1) , (p 2, q2) = calcu late (C2) in (p 1, q2) end,
   if S then C1→ let (p 1, q1) = calcu late (C1) in (p 1, q1∨ (p 1∧ S ) ) end,
  w h ile S do C1→ let (p 1, q1) = calcu late (C1) in (p 1∨q1, (p 1∨q1) ∧ S) end
 end
根据上面的算法, 我们可给出构件正确性的定义:
定义 2:
对于任一个构件, 仅当下列条件成立时, 我们称其实现正确地满足了它的接口描述:
1. 假设 P1 是其接口中所给定的初始特性, 且对于每个写操作 w i 其对应的预条件和后条件分别为 P i1 和 Q i1;
2. 应用上面的算法计算该构件实现的语义, 假设所计算出的初始特性为 P2, 且对于每个写操作 w i 计算其预条
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
334                小 型 微 型 计 算 机 系 统               1999 年

件和后条件, 结果为 P i2 和 Q i2;


3. 下列特性恒为真: P1] P 2, P i1] P i2, Q i2] Q i1;
4. 对于构件实现中任一个写操作 w i, 假设其对应的程序为 C , 则下列特性恒为真:
case C of
 C1; C2→ let (p 1, q1) = calcu late (C1) , (p 2, q2) = calcu late (C2) in q1] q2 end,
 w h ile S do C1 → let (p 1, q1) = calcu late (C1) in q1∧S ] p 1 end
end
下面我们证明满足定义 2 的构件在逻辑上是正确的:
定理: 满足定义 2 的构件在逻辑上是正确的.
证明: 定义 2 中条件 3 保证了能够从计算出的语义中推导出构件接口所给定的语义. 假设接口给定的初始特性是
P1, 而计算出的初始特性为 P2, 由定义 2 知, P1] P 2. 由于构件的初始特性只能作为某些写操作的预条件, 因此根据
结果规则, 任一个以 P2 作为预条件的写操作, P1 也是它的预条件. 同理根据结果规则, 构件实现中的任一个写操作
一定满足接口中所给定的预条件和后条件. 定义 2 中条件 4 保证了计算算法的正确性: 根据顺序规则和结果规则,
一个顺序执行的程序, 算法所计算出的结果一定正确; 而根据循环规则和结果规则, 我们也能得出结论, 一个循环执
行的程序, 算法所计算出的结果一定正确. 至于选择执行的程序, 虽然在定义中没有给出任何约束, 但计算出的结
果仍可以从选择规则和结果规则中直接推导出.
显然, 满足定义 2 的构件一定是正确的, 但反之并不成立. 定义 2 的意义就在于它为开发一个正确的构件提供
了指南, 虽然依据这一定义开发构件受到一定约束, 但毕竟对于一些安全性要求很高的领域 ( 如航空, 航天) , 我们知
道了什么样的构件实现一定是正确的. 在这里, 我们还需强调一点: 我们总是假设子构件是正确的. 在这一假设之
上, 一个逻辑上正确的构件实现才是真正正确的.
考虑 2. 2 节中构件 B _ Stack 的实现, 计算其语义, 则其初始特性为 Coun ter. is_ zero () ∧Stack. T , 操作 p u sh ( e )
的预条件和后条件分别为 Coun ter.   is_ m ax () 和 Stack. top () = e ∧Stack. second () = @ top () ; 操作 pop () 的预条
件和后条件分别为 Coun ter.   is_ zero () 和 Stack. top () = @ second (). 将这一结果同 B _ Stack 的接口描述相对照,
显然满足定义 2, 因此我们可得出结论: 构件 B _ Stack 的实现正确地满足了其接口描述.

4 结论
本文给出了一个基于构件设计的简单模型, 并在这一模型的基础上给出了进行正确性验证的策略. 我们坚信这
些内容对于设计一个可靠的构件具有积极的指导意义.

参 考 文 献

〔1 〕  R ichard M. A d ler. Em erg ing standard s fo r com ponen t softw are. IEEE COM PU T ER. M arch 1995
〔 2 〕 R uben P rieto 2D iaz. Im p lem en ting faceted classification fo r softw are reu se. COMM U N ICA T ION S O F TH E A CM. M ay,
1991
 L iao, H sian 2Chou and W ang, Feng 2J ian. Softw are reu se based on a large ob ject 2o rien ted lib rary. A CM S IGSO FT , SO FT 2
〔3 〕
W A R E EN G IN EER IN G NO T ES. J anuary 1993
 A arth i P rasad. R eu se System : A n artificial in telligence 2based app roach. Jou rnal of System Softw are. 1994
〔4 〕
〔5 〕
 OM G. T he comm on ob ject request b roker: arch itectu re and sp ecification. V. 2. 0, J u ly 1995
〔6 〕
 M ichael J. C. Go rdon. P rog ramm ing language theo ry and its im p lem en tation. P ren tice H all, 1988

CO RREC TN ES S V ER IF ICA T IO N O F COM PON EN T BAS ED PRO GRAMS

YU N  X iaochun  FAN G  B inx ing


(D ep a rtm en t of C om p u ter S cience and E ng ineering , H a rbin Institu te of T echnology  H a rbin 150001)

Abstract  In th is p ap er, w e study the p rob lem s of co rrectness fo r the com ponen t ba sed design. W e firstly bu ild a
m odel of describe a com ponen t: ( 1) in terface: Ex tend ing the IDL of CO RBA so tha t it can describe bo th syn tax and
sem an tics of com ponen ts; ( 2) im p lem en ta tion: In troducing a sim p le p rog ram m odel to tell how to con struct a new
com ponen t in term s of sub 2com ponen ts. T hen w e con sider how to rela te the in terface of a com ponen t to its im p le2
m en ta tion: V erify if the im p lem en ta tion of a com ponen t is sa tisfied w ith the requ st of sem an tics in its in terface by
u sing Hoa re log ic.
Key words Com ponen t ba sed design   In terface  Im p lem en ta tion  Fo rm a l sem an tics

© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.

You might also like