没有合适的资源?快使用搜索试试~ 我知道了~
Jass: 一种支持契约式设计的Java工具
网址:http://www.elsevie r. n l/l oc ate/en tcs/vol um e55. ht ml 15页Jass{带有断言的Java1Detlef Bartetzko2Atanion GmbH俾斯麦海峡13,D{26122 Oldenburg,GermanyClemens Fischer3BTC {商业技术咨询股份公司工业9,D{26121 Oldenburg,GermanyMichaelMoller4 Hei keWeehrheim5奥尔登堡大学信息技术学院Postfach 2503,D{26111 Oldenburg,Germany摘要契约式设计(Design by Contract)是Meyer为程序设计语言Eel提出的一种技术,它允许在程序执行期间对规范违反进行运行时检查和处理。 Jass,JavawithAssertions,是一个Java的契约式设计扩展,允许以断言的形式用规范注释Java程序。Jass工具是一个预编译器,它将带注释的程序转换为纯Java程序,并动态测试程序是否符合规范。除了从经典程序验证中已知的标准契约式设计功能(例如前置和后置条件,不变量)之外,Jass还支持RENMENT,即子类型,检查和跟踪断言的新概念。跟踪断言用于及时监视对象的动态行为。1 这项工作的部分资金由德国研究委员会(DFG)根据赠款OL 98/3-1。2 电子邮件:Detlef. atanion.com3 电子邮件:Clemens. ewe.de4 电邮地址:邮箱:Michael. informatik.uni-oldenburg.de5 电子邮件:Heike. informatik.uni-oldenburg.dec 2001年由Elsevier Science B出版。V.CC BY-NC-ND许可下的开放访问。21介绍正确性是大型软件系统设计中的一个主要问题。正确性是指系统的设计或实现是否满足开发早期阶段提出的要求(或规范)。Nite状态系统的模型检测[4]在许多领域都得到了成功的应用,以检查系统是否满足其规范。然而,模型检测经常会出现所谓的状态爆炸问题,由于复杂性而禁止验证。另一方面,经典的程序验证技术[11,2]通常不能很好地扩展到大型程序。面向对象语言的程序验证技术的开发(以及定理证明器对它的支持)是当前研究的一个主题(例如,参见[14,15,22])。Meyer为面向对象语言Eil [21]提出的契约式设计(Design by Contract)是一种轻量级的形式化技术,允许对规范违反进行动态运行时检查。这个名称指的是客户和零部件供应商之间签订的合同。契约管理请求服务的客户端对象(通过调用功能)和提供这些服务的供应商对象之间的关系。合约的规范以断言的形式直接写入程序。理想情况下,断言的语法接近编程语言本身,因此易于所有程序员使用。断言在程序执行期间被检查,因此违反可以进行异常处理(和纠正)。契约式设计扩展(或简单的断言)已经被提出用于除了Eil之外的许多 语 言 , 例 如 Ada ( ANNA ,[19] ) 和 C++ ( 参 见 http ://www.elj.com/eiffel/feature/dbc/java/ge/ ) , 或 者 直 接 并 入 新 语言,例如Promela [13], SPIN模型检查器的语言对于Java,已经有许多关于契约式设计扩展的提议:Sun目前正在为Java开发一个简单的断言工具[24],并且像iContract [16]这样的工具或像JML [17]或BSL[5]这样的规范语言已经允许将丰富的断言集写入Java代码。在本文中,我们介绍了工具Jass [10],除了标准的契约式设计设施,如前置条件,后置条件和类不变式,还可以进行元素检查和跟踪断言。 跟踪断言用于监视对象的动态行为,方法调用和调用的时间顺序。因此,它们在设计并发、反应式系统时特别有用。这个概念背后的想法是:虽然标准断言是基于状态的形式规范的契约设计对应物,但跟踪断言是面向行为的规范(如进程代数或时态逻辑)的对应物Jass中跟踪断言的设计受到进程代数CSP的影响[12]:在跟踪断言的语法中,出现了许多接近CSP操作符的操作符事实上,我们的最终目标是从正式规范生成断言,在我们的情况下,从规范写作。3CSP-OZ [10,9]中的10个,这是Object-Z和CSP的组合。跟踪断言是契约式设计的一个新概念,据我们所知,上述工具6目前都不支持类似的功能。元素检查也受到了形式方法的一个重要设计技术的启发 Renement [6]通常涉及抽象的不同层次上的规范,说当一个具体类(例如具有非常有效的数据类型)是一个更抽象类的正确实现时。在Jass中,元素检查可以用来检查子类是否是其超类的行为子类型(在[1,18]的意义上)。 在子类型中,方法的前提条件可以被削弱,而后置条件可以被加强。此外,超类的不变量必须在子类中保留。一旦在子类中实现了接口jass.runtime.Refinement,就会对Jass中的子类型进行元素检查方法jassGetSuperState扮演了元素的通常抽象或表示函数的角色,将具体状态与抽象状态联系起来。Jass是一个预编译器,它本身是用Java编写的。它将注释转换为纯Java程序,其中在运行时动态测试是否符合规范。这与静态检查器(如ESC [7]或LCLint)相反,后者使用数据流分析技术或在ESC的情况下使用theo-rem证明器对实际程序代码它也不同于Java的模型检查方法,如Bandera[5],一种将Java程序转换为模型检查器的输入和断言转换为时序逻辑要求的工具,或Java Pathfront [25],一种直接在Java程序上运行的模型检查器。在这里,我们只关心规范冲突的运行时检查。Jass中的断言是作为注释写入Java代码的,因此每个格式良好的Jass程序也是一个格式良好的Java程序。断言只是Java的布尔表达式,扩展了某些关键字和(存在的和通用的)nite集上的量化。Jass是免费的7.该工具是作为三篇硕士论文[20,3,23]的一部分实现的;一般思想在[10]中得到了发展,这也给了Jass一个正式的解释。2Jass的基本特性契约式设计旨在动态运行时检查规范违反情况。为此,程序代码用提供程序规范的断言来装饰Jass将这些断言翻译成Java代码,这样违反规范的行为就由Java异常表示。本节将解释Jass的基本特性,6 当然,模型检查器(如Spin或FDR)可以检查与指定的允许轨迹的一致性7 可以在http://semantik.Informatik.Uni-Oldenburg.DE/~jass/上找到4以Buffer为例。本节中讨论的断言类型由大多数\Java with Design byContract”工具提供下一节将讨论Jass的高级特性。public class Buffer 实 现 了 可 克 隆 的{ private int in,out,count;private Object[] store;public int findDuplicate(intnums){ }public boolean unique(){ 个文件夹public void run(){ }public int findDuplicate(){ 个文件夹private boolean unique(int i){ 个 文件夹public void add(Object){. } publicvoid run(){ 个文件夹public boolean contains(Object o){. 个文件夹...}缓冲器8以先入先出(FIFO)为基础存储对象(方法添加),这些对象以后可以被调用(方法删除)。缓冲区有一个有限的容量,使对象只能存储时,缓冲区还没有满。当然,当缓冲区为空时,不能返回任何对象。方法inRange用于检查访问存储的索引是否在范围内为了通过契约式设计指定这样一个缓冲器的行为,Jass允许人们在Java源代码中插入不同类型的断言方法前置和后置条件,类不变量,循环不变量和变量,以及额外的检查(类似于证明大纲中的谓词[2])。在Jass源代码中,断言作为特殊格式的注释被写入代码中,因此格式良好的Jass程序将始终是格式良好的Java程序。这可能有助于更容易地熟悉Jass,并最大限度地降低在工业环境中使用Jass的门槛:如果Jass预编译器在项目的某些阶段不适合,代码仍然可以不加更改地使用。断言是布尔表达式9,Jass将在其输出中插入Java代码。除了标准的Java布尔表达式之外,Jass还允许使用范围覆盖nite集的泛量化和存在量化此功能有助于缩短条件的描述,58 Cloneable接口是出于技术原因而引入的。9 除了循环变量,它是一个整数表达式。6可以为变化但有限数量的对象陈述一个条件。下面的例子可以用在Buffer类的不变量中。实施例2.1通用量化对 于 所 有i: {0.. capacity ( ) -1} # ! inRange ( i )||store[i]!= null如果一个布尔表达式在运行时的计算结果不是true,则会抛出一个AssertionException,表明违反了约定。为了帮助开发人员调试程序,大多数断言可以通过标签进行解码,这些标签在异常中重用这有助于识别故障点下面我们将更详细地讨论Jass2.1方法的前置条件和后置条件前提条件可用于指定方法调用的有效状态断言表达式计算为true的所有状态对于调用该方法都是合法满足前提条件是呼叫者的职责在方法体的开头检查前提条件。因此,这也是必须使用引入关键字require声明前提条件的地方。public Object remove()方法的前提条件/** require!public void run();...}在前提条件中,调用的方法和使用的变量必须为可见的方法,他们出现在。Bertrand Meyer引入的这个可用性规则确保了调用者能够理解方法可以被调用的条件。这意味着例如受保护的方法只能在前提条件中使用公共或受保护的成员后置条件指定方法调用后的合法状态。当离开方法时,后置条件的计算结果必须为true。满足后置条件是方法开发者的职责。 后置条件在方法的所有正常返回点进行检查,即所有return语句和方法体的结尾。 后置条件必须在方法体的末尾用引入关键字ensure声明。作为Jass的一个特殊特性,方法的返回值可以通过特殊变量Result在后置条件中访问。此外,方法开始时的对象状态存储在特殊变量Old10中。10 要访问这个工具,必须实现接口java.lang.Cloneable这个接口的方法clone改变了复制状态的方式。7使用此变量,开发人员可以指定进入和退出状态之间的关系,例如计数器的单调性。另一个特殊的构造是changeonly关键字后跟一个属性列表。如果在后置条件中指定了这样的列表,则只允许声明的属性更改它们的值(框架条件)。这个特性受到Object-Z的-list的启发。示例2.3使用 Old和 ChangeOnly public Object remove()的方法的后置条件{...return o;/** ensure changeonly{count,out};Old.contains(Result);Result.equals(Old.store [Old. ///}为了给人一个印象,翻译成Java是如何完成的,下面给出了检查前置条件和后置条件的Javapublic void run(){examples.BufferjassOld=(examples.Buffer)this.clone();/* precondition */如果(!(!jassInternal_empty()扔new jass.runtime.PreconditionException(...);...return(i);/* postcondition */如果(!(in== jassOld.in&&jass.runtime.Tool.arrayEquals(store,jassOld.store)抛出新的jass.runtime.PostconditionException(...);如果(!(jassOld.jassInternal_contains(jassResult)))throw newjass.runtime.PostconditionException(...); 如果(!(jassResult.equals(jas sOld.sto re[jass old. out])throw new jass.runtime.PostconditionException(...);return jassResult;}首先,复制对象(旧值),然后检查前提条件(如果前提条件的8否定成立,则抛出前提条件异常),执行方法体,其中返回状态被jassResult的赋值替换。最后检查后置条件并返回结果。后置条件检查要求与已存储的对象的旧值进行比较9方法调用的结果存储在jassResult中。前置和后置条件检查调用特殊方法jassInternal empty和jassInternal contains,它们与方法empty和contains具有相同的主体,但是没有前置和后置条件检查。 方法jass.runtime.Tool.arrayEquals测试两个数组的内容是否相等。2.2类不变式类不变式指定类的允许全局状态。它表示属性值的限制和属性值之间的关系。类不变式是用引入关键字invariant声明的,它位于类体的末尾。只要类的状态稳定,即只要类的方法被调用或结束,就检查类不变式11。类似于方法末尾的后置条件的是return语句和主体的末尾。在类不变式中不允许有局部变量和形式参数,因为断言必须在每个方法中都是可评估的public classUncategorized{.../** invariant 0=countcount=capacity();**/}2.3循环变量和不变式循环变量和不变量的目的是捕捉循环中的典型编程错误:循环不会终止,循环体执行一次太频繁或太少,不处理像零迭代这样的特殊情况。为了便于循环的编程,引入了循环不变式和循环变量。两者都在循环头之后和循环体之前声明。 循环不变式以关键字invariant开始,并指定在循环开始时,每次迭代后以及循环终止时必须满足的条件。这是用来表示循环的全局属性,如循环变量的范围。循环变量具有引入关键字variant,并声明一个整数表达式,该表达式在每次循环迭代中减少,但限制为不小于零。因此,循环变量保证了循环的终止11 如果没有违反约定,也没有对属性的外部访问,那么只检查方法的终止就足够了。10示例2.5循环public boolean compute(Object){public int findDuplicate(inti= 0;i++)** invariant 0=ii=capacity();**//** 变量容量()-i**/if(inRange(i)store[i].equals(o))returntrue; return false;}请注意,循环不变量也必须在循环终止后保持不变,因此它可能只需要i capacity()而不是i capacity()。2.4杂项Jass中还有两个基本的功能,我们将很快讨论(请参阅Jass主页以获得更全面的介绍)。 这些功能是check语句、rescue语句和retry语句。检查语句可以出现在所有普通Java语句可以出现的地方。它们是布尔表达式,当程序控制到达它们时,它们会被求值Check语句与Sun当前添加到Java中的assertRescue和retry语句用于处理因违反合同而引发的异常。它们可以放置在方法体的末尾,并指定应该捕获哪些断言异常以及然后执行哪些代码块。关键词是救援。Jassrescue语句被翻译成Javatry-catch-block。此外,可以在rescue块中使用特殊的关键字retry来重新启动方法调用,可能会更改参数值。接下来,我们描述Jass的两个更高级的特性。3个重新检查元素检查用于验证具体类C是否是另一个更抽象类A12的元素或行为子类型。资源是一个重要的概念,逐步设计的系统支持的具体,在不同的抽象层次上的类的阳离子在贾斯,执行方式如下:程序员必须在C类中实现接口jass.runtime.Refinement。当Jass预编译这样的类时,这要求在12这与Javaclass modierabstract无关,它用于只声明某些方法但不实现它们的类。这里的“抽象”一词指的是继承层次结构中更通用的类然而,这些抽象的、通用的类在Java意义上可能不是抽象的,因为在重新检查期间,Jass必须能够创建该类的实例11类C返回类型A的对象引用。 它在联系具体与抽象状态中起着抽象或表象关系的作用。(由于jassGetSuperState总是实现一个函数,我们不能像这里的表示关系那样通用;因此我们只测试函数关系。一旦这个接口在类中实现,Jass执行以下动态元素检查:只 要在C类的对象中达到一个状态并且C的不变量被满足,那么在相应的抽象状态中A的不变量也应该被满足,并且每当在特定状态中调用方法m时,在相应的抽象状态中保持m的前置条件应该意味着在具体状态中保持该前置条件(前置条件的弱化),并且当从一个方法返回,使得抽象前提在与方法开始时的具体状态相对应的抽象状态中被填充时,那么具体后置条件的持有应该意味着抽象后置条件的持有(再次只考虑这个特定状态及其抽象对应物)(后置条件的加强)。这些是数据删除的标准前向模拟规则(不变保存,以及操作的适用性和正确性),例如从Z [26]中已知,并广泛用作子类型检查[18,8]的一部分(除了我们只动态检查这些条件,并且只检查程序执行期间达到的那些状态)。我们再一次使用布尔的例子来演示余额检查。这一次,考虑从一个抽象版本派生的Buffer,它使用一个容量有限的多集合来存储元素。在AbstractBuffer中,remove操作将返回多重集合的任意元素。由于具体的Buffer使用FIFO策略进行存储,因此remove的后置条件在具体类中更强:它指定要返回一个固定元素。因此,我们现在将Buffer类视为AbstractBuffer的子类,并指出应该通过实现Jass元素接口来执行元素检查。 jassGetSuperState实现将通过创建具有相同容量的超类的新实例并插入当前存储的所有对象来构建表示具体缓冲器的当前状态的AbstractBuffer。Buffer中remove的后置条件比AbstractBuffer中的后置条件更强(并且前置条件是等效的),因此remove检查总是成功的。实施例3.1再结晶public class AbstractBuffer {private LimitedMultiSet缓冲区;...12public void run(){/** require!public void run();.../** 确保Old.contains(Result);**/}...}public class footer实现jass.runtime.Refinement {...public void run(){/** require!public void run();.../** ensure changeonly{count,out};Old.contains(Result);Result.equals(Old.store [Old. ///}...public int findDuplicate(){ intfindDuplicate();AbstractBufferaState= new AbstractBuffer();for(int i=capacity+in-count;icapacity+in;i++)aState.add(store[i %capacity]);return aState;}}我们将简短地讨论子类型化的另外两种方法。Eil采用以下分包原则:在子类中,重新声明的方法的前置条件和后置条件与超类的相应前置条件和后置条件相结合前置条件与逻辑或和后置条件相结合,从而实现前置条件的弱化和后置条件的强化。子类和超类的状态空间必须相同(至少,关于断言中访问的属性);不能应用表示函数。JML [17]使用了一种更精细的子类型处理方法,这与Jass提供的方法很接近.一个represents子句可以用来将具体的状态空间与抽象的状态空间联系起来,类不变量和方法规范都是从超类继承的。 此外,还包括了[18]中的历史约束的概念。然而,在JML中,子类型关系主要用于促进子类型的指定,因为断言可以从超类继承。13Jass和JML之间的另一个区别可以在以下几点找到。JML在规范中使用模型变量的概念:模型变量不是类的实际变量,而只是用于规范目的。然后可以将前置条件和后置条件写入模型变量。由于这允许更清晰地分离规范和代码,我们目前正在考虑在Jass中采用类似的方法。4跟踪断言为了指定预期的动态行为,Jass使用类似CSP的符号来描述允许的事件跟踪在Jass的上下文中,事件是方法调用的开始和结束。因此,事件被写得像方法调用,后面跟着.b或.e,以指示方法进入或退出事件。没有这些successes的方法调用会在进入事件之后出现退出事件。允许的轨迹由类似CSP的过程指定。Jass进程由进程名、进程参数(如Java方法的形式参数)、局部变量和进程表达式定义下面的例子给出了Jass中跟踪断言的印象。类Factorial将通过递归调用方法factorial来计算正整数值的阶乘。跟踪断言的过程用于监视此方法的正确调用:factorial的每次递归调用将启动一个过程,该过程仅在参数已减少但仍不小于零时才接受对factorial的另一次调用。由于跟踪断言描述了类的可观察行为,因此必须将其声明为类不变式。生成的代码将检查当前程序执行的跟踪是否包含在MAIN进程的跟踪中,否则将抛出跟踪异常。例 4.1 观 察 递 归 方 法 调 用 public classFactorial {public int findDuplicate(int findDuplicate){/** require value> 0; **/ if(value== 1)return 1;elsereturn value * factorial(value);/** 确保结果>0;**/}/** invariant [variant] trace( MAIN(){整数值;factorial(?值)。b-> CALL减少(值)}14public int findDuplicate(int findDuplicate){停止}其他-> factorial(?nextVariant).bWHERE(nextVariant变量)<->呼叫 减少(nextVariant)}});**/}在这个例子中可以看到跟踪断言中的许多特性。跟踪断言定义了两个进程(MAIN和Decrease),第二个进程是参数化的。这两个过程都有局部变量(value和nextVariant),它们被用作事件的输入变量,即事件阶乘(?value).b将factorial的方法调用与参数value的任何值匹配,并且在执行时,参数的当前值绑定到局部变量value。类似地,可以使用输出变量(在本地变量前加上!)。输入变量允许的值可以由WHERE子句限制。此外,该示例已经显示了许多CSP操作符的使用:pre xing->,IF-ELSE,进程调用(使用CALL)和进程STOP。Jass还允许进程ANY和TERM接受任何事件或只是成功终止一个类,分别和外部选择和并行组合的操作符。并行组合仅限于在组合字母表的交叉点上同步,从而确保仅确定性示例中的EXECUTE事件是Jass的一个特殊功能,它允许开发人员在跟踪测试期间执行Java在跟踪断言的检查期间,仅监视跟踪断言的字母表中的那些事件 这个字母表由跟踪断言(其中发生的事件集)隐式给出,也可以显式声明。5附加功能(原型状态)Jass提供了两个额外的特性,但是,到目前为止,它们只得到了初步的实现。这些功能确实以所描述的方式工作,但仍然有一些限制应该被删除。15干扰检查Jass提供了一个简单的设施,以检测可能的干扰,在并行程序。并行运行的线程必须是Jass类,并且必须由main方法启动。在这种情况下,Jass能够检测到一个线程中的断言何时可能通过另一个线程中的语句变得无效目前,Jass无法检测这些可能的干扰是否由同步语句保护,也无法检测语句和断言是否引用相同的对象实例。JavaDoc支持Jass能够将前置和后置条件或类不变式添加到方法或类的JavaDoc符合注释中。目前,这是通过将这些断言的HTML代码添加到生成的Java源代码中的JavaDoc注释来完成的。6结论在本文中,我们提出了工具Jass,一个预编译器的注释Java程序。Jass的断言语言允许将所有标准的契约式设计断言写入程序,并且还支持跟踪断言和元素检查的新概念。作为未来的工作,我们设想从形式规范自动生成断言,在我们的情况下,从CSP-OZ [9]中编写的规范,一种结合CSP和Object-Z的形式方法。关于Jass预编译器,我们计划以这样一种方式改变转换,即Jass断言直接转换为Java的新assert语句。在那里,断言的评估在类被加载时被固定,因此可以对某些类启用而对其他类禁用。致谢。 非常感谢Michael Plath,他在Jass中实现了跟踪断言,DieterMeemken为断言预编译器的第一个版本提供了支持,Jochen Hoenicke为Java提供了一般支持。引用[1] 美国,P.,用行为子类型设计面向对象的编程语言,在:J. de Bakker,W。de Roever和G. Rozenberg,编辑,REX研讨会:面向对象语言的基础,编号LNCS(1991年)中有489例。[2] Apt , K.- R.和E.- R. Olderog ,\ 顺序 和并 发程序 的验 证,”Springer-Verlag,1997,第2版。[3] Bartitzko,D、磷铝榴石atundVererbungbeim\ProgrammierenmitVertrag”,”硕士论文,奥尔登堡大学(1999年),德文。[4] Clarke,E.,E. Emerson和A. Sistla,使用时态逻辑规范的nite状态并发系统的自动验证:一种实用方法,16第十届ACM程序设计语言原理研讨会会议记录,ACM,1983年,pp.117{126.[5] 科贝特,J.,M. Dwyer,J. Hatterman和Robby,一种用于表达动态软件可检查属性的语言框架,SPIN 2000,LNCS(2000)中的第1885号,pp.205 {223.[6] de Roever,W.-P. 和K.王文,《数据挖掘与数据挖掘》,北京:中国科学技术出版社,1998。[7] Detlefs,D.,R. Leino,G.Nelson和J.陈文辉,静态测试,技术报告,第159页,中华民国电子工程师学会(1998)。[8] Dhara,K. K.和G. T. Leavens,Forcing behavioral subtyping through specication inheritance,in:Proceedings of the 18th International Conference onSoftware Engineering,Berlin,Germany(1996),pp. 258{267.[9] Fischer,C.,CSP-OZ:Object-Z和CSP的结合,in:H.鲍曼和J. Derrick,editors,Formal Methods for Open Object-Based DistributedSystems(FMOODS '97),IFIP(1997).423{438.[10] Fischer,C.,过程与数据的结合与实现:从CSP-OZ到Java”,博士论文。论文,奥尔登堡大学(2000年)。[11] 霍尔角A. R.,计算机编程的公理基础,Comm.ACM12(1969),pp.576{580.[12] 霍尔角A. R.,“Communicating Sequential Processes”,Prentice Hall,1985。[13] Holzmann,G. J.,计算机协议的设计和验证,”Prentice Hall,1990年。[14] Huisman,M.和B. Jacobs,Java程序验证通过Hoare逻辑与突然终止,在:T。Maibaum,编辑,FASE 2000:软件工程的基本方法,计算机科学讲义1783(2000),pp. 284 {303.[15] Huzing,K.,R. Kuuiper和SOOP,使用类不变式的面向对象程序验证,在:T。Maibaum,编辑,FASE 2000:软件工程的基本方法,计算机科学讲义1783(2000),pp. 208 {221.[16] 克莱默河, iContract-Java契约式设计工具,技术报告,可靠系统(1998),http://www.reliable-systems.com。[17] Leavens,G.,A. Baker和C. Ruby,JML的初步设计:Java的行为接口规范语言,技术报告,爱荷华州立大学计算机科学系(1998年,2001年修订)。17[18] 利斯科夫湾J. Wing,A behavioural notion of subtyping,ACM Transactionson Programming Languages and Systems16(1994),pp. 1841年。18[19] Lu ckham,D.,F. vonHen ke,B. 克里格布鲁ckner和O.O we,\ANNA-Alanguage for annotating Ada programs , ”Lecture Notes in ComputerScience260,Springer,1987.[20] Meemken , D. , \Programmieren mit Vertrag in Java , ” 硕 士 论 文 ,Universit在Olde nburg(1997),德文。[21] 迈耶湾,《面向对象软件构造》,ISE,1997,第2版。[22] 微米的ller,P. 和A. Potzsch-Heter,面向对象软件构件的建模与验证技术,G. T. Leavens和M. Sitaraman,editors,Foundations of Resilient-Based Systems,CambridgeUniversity Press,2000(to appear).[23] Plath,M., \Trace Zusicherungen in Jass-Erweiterung des Konzepts《Programmieren mit Vertrag》,硕士论文,奥尔登堡大学(2000年),德文。[24] SunMicrosystems , Java 编 程 语 言 的 简 单 断 言 工 具 ,http://jcp.org/jsr/detail/41.jsp。[25] Visser,W.,G. Brat,K. Havelund和S. Park,Model checking programs,in:International Conference on Automated Software Engineering,2000.[26] Woodcock , J. 和 J. Davies , \Using Z : Speci cation , Re nement , andProof,”Prentice-Hall International,1996。
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功