无需修改现有代码即可增加新软件特征的方法

文档序号:6363803阅读:218来源:国知局
专利名称:无需修改现有代码即可增加新软件特征的方法
技术领域
本发明涉及计算机编程语言领域、使用此类编程语言的方法及执行和分析以此类编程语言编写的程序的过程。背景本申请是非临时申请,根据35U. S. C. § 120要求序列号为60/313364的临时申请的优先权,该临时申请于2001年8月17日提出,与本申请同一名称且发明人相同。在软件开发中,常常需要为已用现有代码实现的应用程序增加新特征。这是软件开发中最困难的任务之一,特别是在新特征可能改变原程序执行流程时。例如,在电话交换系统中,要增加程序以实现“呼叫转移”特征将会改变现有“一般旧式电话服务”和其它特征的执行流程。要使用现有通用编程语言增加此类新特征,程序员必须修改现有代码。这要求程序员十分熟悉现有代码,并能够逐行跟踪现有代码的不同执行流程以确定要在何处进行更改。利用现有技术,由于没有自动化工具可帮助程序员,因此,这是一项工作量很大的过程。最终,程序员经常怀疑是否已经正确确定了要更改的代码,是否已找到了所有这些代码及其更改会对现有特征有什么影响。这将要求在可结束该工作前,需要周密的测试,经历很多试验和错误。另外,在大规模软件开发中,经常有必要安排不同的程序员来开发应用程序的不同特征。使用诸如C++或Java等现在通用的编程语言,“呼叫等待”程序将要求更改“三方通话”程序,并且由于这些特征影响彼此的控制流程,因此反之亦然。程序员需要彼此协调而使他们的设计任务变得复杂化了。其设计变得缠结不清,并且所得软件使各种特征的逻辑不够清楚,从而使难以对它们进行维护。每种特征无法成为独立的库组件。它们都将作为单一对象加载,而无论用户是否需要它们全部。因此,需要使程序员能够独立设计它们的特征并将它们打包为组件库。以下将几个组成单个执行程序,其中一个程序可改变另一程序的执行流程的程序称之为交互作用程序。或者,我们可以说一个程序与另一程序交互作用,或者它们交互作用。由于特征程序是实现特征的程序,因此,在说到两个或两个以上特征程序交互作用时,我们指一种特征的一些程序与另一特征的一些程序的彼此交互作用。使用诸如C++或Java等现有通用计算机编程语言时,程序员必须将程序语句的执行流程排成序列。这使得在必须将交互作用的特征程序集成在一起时有必要更改代码。此夕卜,以现有通用语言编写的程序不易于分析。目前不存在可帮助程序员识别新特征程序要增加到现有代码中何处的工具。概述我们通过增加几个非过程语言结构,并指定用以执行和分析以此语言编写的程序的方法,解决了这些问题。所述语言允许程序员将交互作用的特征程序编写为独立的库组件。当把特征程序打包时,工具可自动确定它们交互作用的条件。程序员随后可以使用所述语言提供的工具软件(utility)解决交互作用而无需更改现有代码。一个非过程语言结构是由条件部分和程序体部分组成的程序单元。当对应的条件部分为真时执行程序体部分。不同于使用诸如C++或Java等常规过程语言,程序员不指定非过程语言中程序单元的执行顺序。计算机操作系统中的一些先有技术部分地满足了本发明的类似目标,但针对特殊情况。UNIX操作系统中的流工具软件(stream facility)允许程序员在协议栈的不同层中将计算机通信协议作为不同的流模块来实现。如果应用程序调用它,则程序员可在流中插入或删除协议模块而无需更改同一流中的其它模块。流工具软件利用了公认的协议体系结构,因而不同层中的协议查看消息中的不同首部字段,并加强了协议模块之间的统一接口。然而,它不是其它应用程序的通用解决方案。称为管道的另一 UNIX工具软件允许程序员将几个程序连接起来以形成新的特征而无需更改其中任何程序。但这些程序必须坚持字符串的输入/输出格式,并且它们必须以线性顺序排列以便一个程序的输出成为另一个程序的输入。 目前存在主要为诸如捕获专家知识以及甚至定理证明之类的人工智能应用而设计的多种非过程语言。由于用途不同,这些语言提供的结构和工具软件及使用语言的方法与我们的语言有很大的不同。例如,在以它们编写的程序准备执行前,它们均不要求明确的特征交互作用(也称为冲突)检测和解决过程。它们中一些语言如CLIPS具有可为程序员所用的机制,用于在执行期间两个或两个以上程序单元的条件为真时指定执行优先级。但程序员事先一般不知道哪些程序可能与其程序交互作用。我们以前专门为电信业务开发了一种非过程语言(参见分别于1987年9月22日、1988年2月23日和1988年5月24日授予T. L. Hansen等人的题为“利用非过程语言的实时系统控制”、“利用非过程语言的实时系统状态控制”和“客户可编程实时系统”的美国专利4695977、4727575和4747127,所有这些专利通过引用结合于本文中)。然而,由于先有工作既不足够严密以便自动检测特征交互作用,也未为程序员提供解决特征交互作用而又无需更改现有代码的工具软件,因此,该语言提供的结构和实用工具与本方法有很大的不同。附图简述图I显示了模型、程序单元、锚特征、特征和特征程序包(feature package)之间的关系;图2显示了域数据类型示例;图3显示了事件类型示例;图4显示了电话呼叫处理应用程序的模型语句示例;图5a显示了程序单元集的公共条件语句; 图5b显示了公共事件语句;图5c显示了几个条件和事件语句对的公共程序体;图6显示了程序单元示例;图7a和7b显示了优先顺序列表示例及其到程序单元的转换;图7a显示了将直接-优先顺序列表转换成程序单元的示例;图7b显示了将优先级-优先顺序列表组转换成程序单元的示例;
图8显示了特征示例;图9显示了特征程序包示例;

图10显示了模型扩展示例;图Ila和Ilb显示了特征扩展;图12显示了使用此方法开发软件的过程,它说明使用此方法进行并行开发;图13给出了算法I的流程图,该算法检查两个程序单元之间简单的交互作用条件;图14显示了算法2的流程图,该算法检查两个简单谓词(predicate)公式的合取是否能被满足;

图15显示流程3的流程图,该算法检查在析取范式中的项是否能被满足;图16显示了关联CSR中域变量、其位置和使用它的谓词函数集的表格;图17显示了关联ESRP中事件限定字段、其位置以及使用其谓词函数集的表格;图18显示了算法5的流程图,该流程图描述了在执行特征程序包的初始阶段的运行时系统;图19显示了算法6的流程图,该流程图描述了收到事件时的运行时系统;图20显示了算法7的流程图,该流程图描述了程序单元返回时的运行时系统;图21显示了处理异常的程序单元示例,所述异常指执行运行时遇到未被特征中其它程序单元所覆盖的条件。优选实现例的详细说明使用现有技术的情况下,程序员需要增加改变现有代码控制流程的新功能时,程序员面临两种选择。如果实现语言是诸如C、c++或Java等过程语言,则程序员将不得不进行大量处理以更改现有代码。如果实现语言是诸如CLIPS等非过程语言,则程序员几乎无法控制新功能与现有代码的交互作用方式。在现有软件开发方法中,程序员将新功能作为一项特征来开发。程序员通过计算机辅助过程开发其特征,并将开发的特征与其它特征程序包成。程序员将特征程序包交由一种工具处理,这种工具自动确定这些特征交互作用的条件。随后,程序员指定在特征程序包中应如何解决这些交互作用条件。因为没有修改原先的特征,所以可将它们视为可重用的库组件。因此,本方法允许增加新功能到现有代码中,这是一种自动化方法或工具,可识别程序员应如何将新功能与现有代码合并,以允许利用动态执行流程来重用组件,而使程序员的工作较容易。上述软件开发方法由下列四个组成部分支持(I)软件开发过程;(2)非过程编程语言结构集;(3)确定特征程序之间交互作用条件的算法;以及(4)执行以所述编程语言编写的特征程序的运行时系统。我们将先讨论语言结构和使用语言结构得到的软件组件。然后描述软件开发过程,接着描述交互作用检测算法与运行时系统。必需的软件组件和语言结构以我们的编程语言实现的可执行应用程序是合式(well-formed)特征程序包。特征程序包由特征程序包、程序单元和可能的其它特征程序包组成。每种特征又由一组程序单元和其它可能的特征组成。程序单元是执行单元。它由条件部分和主体部分组成。程序单元的主体部分在条件部分为真时执行。主体部分将执行一些操作,并可调用以其它语言编写的程序。条件部分中的规格引用模型中定义的变量。模型是应用程序的表现形式。它定义了一组域变量和接口事件,这些域变量和接口事件由实现应用的各种特征的模型的程序使用。用于枚举电话应用的IDLE、TALKING和其它状态的状态变量是域变量的示例。如用于终止电话呼叫的“终止请求”消息是接口事件示例。特征和特征程序包是组织概念 。特征包含程序单元集,而特征程序包包含一组特征。人们把特征视为特征,例如“呼叫等待”或POTS(老式电话服务)等。特征程序包是具有一组特征的应用程序。程序单元是执行单元,而特征则是重用单元。程序员可组合不同的特征组以构成不同的特征程序包。程序员甚至可分别解决特征之间的交互作用而利用同一特征组创建不同的特征程序包。我们要求特征中所有程序单元的条件部分以同一模型中定义的变量来表示。因此,我们说特征引用特定的模型。我们还要求同一特征程序包中的所有特征引用同一模型。换言之,特征程序包内的所有程序引用同一模型。这些软件概念之间的关系如图I所示。本部分描述这些软件概念中的每个概念。我们从模型观念开始。撞型模型语句使用关键字Model和名称来识别。它包含域变量(其初始值)和事件接口的定义。它们用于定义程序单元的条件部分。域变量域变量属于布尔(BOOLEAN)类型或域数据类型,布尔类型的变量可取值TRUE(真)或值FALSE(伪)。域数据类型域数据类型类似于C++或Java中的类。除了象在类中那样定义数据集和针对这些数据的运算外,域数据类型还定义了谓词函数集和一个组合函数。谓词函数作用于一个或多个域类型变量,并返回布尔值。例如,整数的域数据类型将包含确定整数变量是否为正值、两个整变量是否相等、一个整变量是否大于另一个整变量等谓词函数。我们使用以下术语具有特定域变量的谓词函数是谓词;谓词或布尔类型的域变量是原子;原子或它的“非”为字母符号。给定域数据类型的字母符号集的合取,则其组合函数返回该合取是否能被满足的结果。如果存在布尔公式的字母符号的一种真值分配使得公式为真,则该布尔公式是能被满足的。在一种实现方式中,组合函数可将字母符号列表作为输入。我们注意到图2中给出的整数域数据类型示例除增加了组合函数以外,几乎与B. Stixmstrup所著、Addison-Wesley出版社于1997年出版的“C++编程语言”第三版中第8页中给出的整数类相同。域变量的无关件要求我们要求域变量彼此无关。也就是说,域变量的值不可为其它域变量的函数。换言之,如果域变量是在赋值语句的左侧,则在同一赋值语句的右侧不会有其它域变量或另一域变量的派生变量。我们的编译器会检查这种情况。有关组合函数的更多情况实现组合函数的直接方法会是产生输入合取的真值表,但这可能导致许多情况。给定域变量的无关性和域数据类型谓词函数的属性,则可以经常开发用于组合函数的有效算法。例如,考虑整数的域数据类型及其通常的谓词函数“等于”、“大于”、“大于或等于”、“小于”和“小于或等于”。这些谓词函数确定了在它们中使用的域变量的偏序。组合函数算法将按谓词指定的那样将域变量排序,并检查诸如一个变量同时大于和小于另一变量之类的茅盾情况。存在针对普通域数据类型的有效算法,如枚举、集合、树和有序或链接表。事件梓口 接口定义了事件类型集。赋予每个事件类型唯一的名称和数据结构。一些数据结构字段可确定为限定变量。限定变量类似于域变量,是布尔类型或域数据类型的变量。图3显示了举电话“Termination_request”消息作为事件类型示例。该消息携带作为限定变量的主叫方号码。将事件发送到特征程序包的实例。事件可来来自程序包中的程序单元,或来自程序包外的某个程序。期待特定事件的程序单元在事件语句中将该事件指定为其条件部分的组成部分。图4提供了实现电话呼叫处理系统的模型示例。模型为程序单元条件部分中的规格定义了公开域。下面更详细描述程序单元。稈序单元程序员使用关键字unit (单元)和名称来识别程序单元。属于同一特征的程序单元具有唯一的名称。每个程序单元由条件部分和程序体部分组成。稈序单元的条件部分条件部分由条件语句和事件语句组成。条件语句条件语句是域变量原子的布尔公式。换言之,条件语句是一阶谓词公式,但我们不使用存在和通用的量词。程序员需要指定象“集合中存在元素”之类的信息时,我们要求程序员指定域数据类型“集合”的谓词函数,例如non-empty (X)。我们下面将这种公式称为简化谓词公式。我们遵循的惯例是,当模型中定义的原子未在条件语句中使用时,原子的值不影响条件语句的真值。换言之,原子是“无关项”。事件语句事件语句识别特征模型语句中定义的接口事件类型列表。列表中的每个事件可与有关事件限定变量的、称为限定条件的布尔公式相关联。所以,这也是简化的谓词公式。如果事件出现并且该事件携带的限定变量值满足限定条件,则该事件语句为真。如果未指定限定条件,则事件出现时限定条件为真。作为一种简便形式,程序员可指定用关键字“任何”来表示,当模型中定义的任何事件出现时事件语句为真。程序员可将“任何”附加到限定条件中。在这种情况下,在具有满足限定条件的限定变量的任何事件出现时,事件语句为真。程序员也可指定关键字“空”表示程序单元未在等待事件。因此,程序单元的条件语句一为真,就会执行程序体。如果评估时在给定域变量值的情况下条件语句的布尔值为真,则该条件语句为真。如果列表中的任何接口事件为当前事件且有关其限定变量的布尔公式为真,则该事件语句为真。如果事件已由运行时系统接收但尚未处理,则该事件是当前事件,在评估时被视为最高优先级的事件。我们将在描述运行时系统时给出当前事件的更全面的定义。程序单元的条件语句和事件语句都为真时,程序单元就就绪,准备执行。程序单元的条件部分可以图形方式说明。例如,条件语句可用维恩图(Venndiagram)说明或用D. Harel所著的题为“关于视觉形式主义”(“On Visual Formalism,’D.Harel, Communications of the ACM, May, 1998)的论文中第11页中所述的一种形式更复杂的系统来说明。 简要地说,我们允许程序员只为程序单元组声明公共条件语句或事件语句一次。图5a给出的示例显示了具有相同条件语句的两个程序单元。图5b给出的示例显示了具有相同事件语句的两个程序单元。程序员还可能想将同一程序体部分应用于不同的条件语句和事件语句对。我们允许对其中条件语句将显示条件与事件语句对析取的这种情况的简便表示形式。图5c提供了示例。程序体部分程序体部分包含诸如赋值语句、过程调用、迭代语句等常规程序语句,包括程序单元局部变量的声明和操作。如同C和C++中的用法一样,这些局部变量可以是自动或静态的。自动变量在程序单元执行时存在,而一旦程序单元退出则消失;静态变量在程序单元退出后保持其值。程序体中的程序语句可更新域变量,发送模型系统内或外的接口事件,或者调用用其它语言程序描述的程序。图6给出了电话应用程序的程序单元示例。它只指出如果电话处于DIALING (拨号)状态且收到挂机事件,则交换系统应释放数字接收器并将电话置于IDLE(空闲)状态。程序体更新域变量或者发送接口事件时,它可使一些其它程序单元的条件部分(甚至其本身)为真。因为开发过程中检测并解决特征交互的综合效果以及运行时系统的设计,一次最多只有一个程序单元的条件部分为真。因此,我们可选择继续执行当前程序体或者进行切换以执行条件部分正好为真的程序单元。我们选择了前者。换言之,我们考虑程序体原子的执行。从当前程序体发送的事件保持在队列中。只有在我们退出当前程序体后,我们才可使用域变量的最新值评估其它程序单元的条件部分。在描述运行时系统时,我们将回到此主题并进行更详细的描述。编写程序单元是为了实现应用程序的某种特征。我们现在开始描述特征。特征我们区分了两种类型的特征锚特征和附加特征。锚特征提供了应用程序的起点。附加特征为应用程序增加新功能。再次以电话技术为例,实现一般旧式电话服务(POTS)的程序单元将被组织为锚特征,而实现三方通话服务的程序单元将被组织为附加特征。锚特征的特殊要求
我们要求相对于模型中定义的域变量初始值,属于锚特征的至少一个程序单元的条件部分为真。附加特征的特殊要求附加特征必须识别至少一个锚特征,并且附加特征的至少一个程序单元必须与该附加特征引用的每个锚特征的一个程序单元交互作用。编译器可检查这两个要求。我们后面将描述确定两个程序单元是否因附加特征要求而交互作用的算法。检查锚特征要求是简单明了的。下面,我们详细描述锚特征的概念。描述附加特征时,我们将只突出它与锚特征的不同之处。
锚特征程序员使用关键词锚特征和名称来确定锚特征。锚特征由两部分组成引用申明和程序单元列表。一种特征可接受仅由该特征内的程序单元使用的按值传递变元列表。引用串明此处,程序员声明特征使用的模型。另外,程序员可声明并初始化仅由特征内的程序单元使用以及用于变元的局部变量。在特征程序包创建时为这些变量分配了空间,直至特征程序包退出。稈序单元列表程序单元列表识别属于特征的程序单元。程序员不指定程序单元的执行流程,但可为属于特征的一部分程序单元指定优先顺序。程序单元的优先顺序当两个程序单元的条件部分同时为真时,如果它们按序执行,则称这两个程序单元具有优先顺序关系。如果优先顺序列表中有几个程序单元,则程序单元之间的关系是偏序。可以设计不同种类的优先顺序列表以保持程序单元之间的优先顺序关系。例如,程序单元 P1、P2 和 P3 的直接优先顺序(P1、P2、P3) (straight-precedence (P1、P2、P3))表示如果Pl和P3的条件部分为真,则只执行Pl的程序体。另一方面,优先级优先顺序(P1、P3、P3) (priority-precedence (P1、P3、P3))表示如果 Pl 和 P3 的条件部分为真,则 Pl 和 P3的程序体将按指定的顺序执行。一个程序单元可出现在不止一个优先顺序列表中。因此,不在同一优先程序列表中的两个程序单元可能仍有优先顺序关系。程序员可能指定了不一致的优先顺序关系,如在一个列表中指定Pl优先于P2,但在另一列表中指示P2优先于P1。由于所有优先顺序列表指定了偏序,编译器因此可查出这种不一致。用于此目的的算法是众所周知的,例如可参阅“计算机编程技术,第 I卷,基本算法”(D. E. Knuth,“The Art of Computer Programming,Volume I, Fundamental Algorithms, ^Addison-Wesley Publishing Company,1973)。优先顺序列表的语义也可导致不一致。例如,假设我们具有直接优先顺序(P1、P2、P3)和优先级优先顺序(P1、P3、P4)。在Pl和P3的条件部分同时为真时,直接优先顺序列表要求在Pl后停止执行,但优先级优先顺序列表要求继续执行P3。因此,优先顺序列表的设计应通过确定语义不一致的有效方法完成。将优先顺序列表编写为稈序单元
可以按如下所示,将优先顺序列表重新编写为程序单元集。新程序单元的条件语句是列表中程序单元的条件和事件语句对的析取。其程序体包含将执行列表中程序单元相应程序体的条件语句。图7 (a)过程来直接优先顺序列表的示例,而图7(b)给出了优先级优先顺序列表的示例。我们正在讨论的是可使程序单元集和优先顺序列表等效。程序单元交互作用与合式特征当且仅当属于同一特征的两个程序单元具有优先顺序关系且其条件部分可同时为真时,它们才交互作用。后面将给出检测特征交互作用的算法。在我们的系统中,如果未解决两个程序单元之间的交互作用,则运行时系统将无法在两个程序单元的条件部分都为真时确定执行哪一个程序。程序员可使用多种方法来解决两个程序单元之间的交互作用,如将它们置于优先顺序列表中并重新编写其条件部分。不具有交互作用的程序单元的特征称为合式特征。

附加特征程序员使用关键字附加特征和名称来确定特征。附加特征类似于锚特征,但有三个不同之外。(I)附加特征必须在其引用申明中识别其锚特征。(2)在给定域变量的初始值时,特征不需要使其一些程序单元的条件语句为真。(3)附加特征应可从其锚特征达到。如果调用B后,存在会导致A中的一些程序单元被执行的计算,则特征A可从特征B达到。可从锚特征达到附加特征的必要条件是在锚特征中存在一个程序单元以及在附加特征中存在一个程序单元,这样,这两个程序单元的条件语句析取可被满足。图8给出了附加特征示例。它实现“呼叫转移”电话特征。该示例显示了激活和去激活特征的程序单元以及在指定了呼叫转移号码且呼入不是来自转移号码时转移呼入的程序单元。合式锚特征本身是可执行的。但程序员通常将若干特征组成特征程序包以便为应用提供丰富特征。特征稈序包程序员使用关键字特征程序包和名称来识别特征程序包。特征程序包可接受变元列表。变元仅按值传递。特征程序包包含了引用申明和程序单元列表。特征稈序包引用申明在特征程序包的这一部分中,程序员指定该程序包中包括的所有程序和特征列表所用的模型。特征列表必须包括至少一个锚特征,并且程序包中的所有特征必须引用程序包中的至少一个锚特征。编译器检查这两个要求。特征程序包可在其特征列表中包括另一特征程序包。特征程序包的包含关系是偏序(partial ordering)。编译器可有效地检查两个特征程序包(传递性地)彼此包含时的循环包含。此外,程序员可定义特征程序包中的程序使用的变元和局部变量的类型。稈序单元的特征稈序包列表程序单元列表识别属于特征程序包的程序单元。这些程序单元的一个重要目的是解决特征之间的交互作用。因此,程序单元列表可包括程序单元的优先顺序列表和特征的优先顺序列表,这两个列表都是为程序单元解决交互作用的便捷方式。我们已经描述了程序单元的优先顺序列表。特征的优先顺序列表程序员使用特征的优先顺序列表来指定不同特征中程序单元之间的优先顺序关系。如果特征Fl优先于特征F2,则如果属于Fl的程序单元Pl的条件部分和属于F2的另一程序单元P2的条件部分同时为真,则Pl将在P2前执行。类似于程序单元的优先顺序列表,可为特征指定不同类型的优先顺序列表。例如,特征F1、F2和F3的直接优先顺序(F1、F2、F3)表示,如果Fl和F3中某些程序单元的条件部分为真,则将执行Fl中单元的程序体。优先级优先顺序(FI、F2、F3)表示如果Fl和F3中某个程序单元的条件部分为真,则将按指定的顺序执行Fl和F3中单元的程序体。特征的优先顺序列表并不会更改各特征的优先顺序列表指定的 优先顺序关系。可以生成特征和程序单元的优先顺序列表指定的所有程序单元的偏序,但这并不重要。 编译器可检查这些列表中的不一致。特征交互作用与合式特征程序包当且仅当两种特征Fl和F2不具有优先顺序关系且Fl中的程序单元与F2中的程序单元交互作用时,它们才交互作用。程序员可以通过将交互作用的特征或交互作用的程序单元置于优先顺序列表中来解决特征交互作用。或者,程序员可为特征程序包编写程序单元,条件是这两个程序单元交互作用以解决交互作用。建议不要通过修改特征程序单元来解决交互作用。如果特征程序包的程序单元彼此均不交互作用且其任何特征彼此均不交互作用,则特征程序包是合式的。合式特征程序包是可执行的。图9给出了将POTS、呼叫转移和免打扰电话特征组合起来的特征程序包示例。优先顺序列表为特征程序包的程序单元赋予优先级,然后为免打扰(Do-Not-Disturb)、呼叫转移(Cal 1-Forwarding)以及POTS的程序单元赋予优先级。在收到终止请求(Termination-Request)事件时,既可调用免打扰又可调用呼叫转移。根据主叫方是否为特权组(privileged set)成员,“交互作用解决”程序单元通过转移呼叫或者返回免打扰操作来解决交互作用。随着时间推移,即使是设计良好的模型也可能变得不合适。例如,程序员可能想在电话线上的发语音和数据业务。原纯语音电话模型将不再合适。当发生这种情况时,新模型就成了必需,但程序员可能仍然想要重用采用原模型实现的现有特征代码。为支持重用,我们的方法允许通过扩展旧模型而开发新模型以及扩展使用旧模型的现有特征和特征程序包而开发新特征和特征程序包。扩展的目的是重用为现有模型编写的特征。扩展有两种层次从原模型创建新模型;以及重用为原模型编写的现有特征而为扩展的模型创建特征程序包。模型扩展通过增加新域变量或接口事件以及扩展现有域变量或接口事件的定义,程序员可扩展原模型。在扩展现有域变量或接口事件的定义时,程序员可将新元素增加到现有定义中,或者扩展域变量或限定条件的值范围。作为将新元素增加到现有定义中的示例,可考虑图3中所示的模型示例的“终止请求”事件。该事件的现有数据结构可只包含一个字段即“主叫方”。扩展的定义可增加新的“服务类型”字段以识别主叫方是在请求语音连接还是数据连接。作为增加现有定义值范围的示例,程序员可将值“POST-ANNOUNCEMENT” ( “通知后”)增加到枚举集合中,该枚举集合定义图4的模型示例中使用的域变量“状态”的值范围的。我们要求程序员既不能删除现有元素也不能缩小现有的值范围。程序员使用以下语法来说明对现有模型的扩展
Model new-model-name extends existing-model-name {
Domain variables:
/*新域变量的定义和/或现有域变量定义的扩展*/
Interface events:
/*新接口事件的定义和/或现有接口事件定义的扩展*/
};在上述语句中,Model (模型)和extends (扩展)是关键字,而new-model-name (新模型名称)和existing-model-name (现有模型名称)分别是新模型和原模型的名称。扩展模型包括现有模型中定义的所有域变量和接口事件。这些域变量和接口事件可具有新元素或附加的值范围。另外,扩展的模型可具有新域变量和接口事件。新的增加内容和现有定义全部可用于使用扩展模型的程序单元。图10给出了基于(纯语音)电话模型建立的语音和数据呼叫的模型扩展示例。新模型扩展了语音连接STATE域数据类型。它增加了数据连接状态的新域变量并定义了新的数据接口事件。特征扩展在指定扩展模型之后,程序员可以在扩展模型的特征程序包中重用为原模型编写的特征。为此,程序员将重用的特征包括在新特征程序包的特征列表中。重用特征的程序单元成为新特征的程序单元。保持了重用特征的程序单元之间的优先顺序关系。新模型的新域变量和接口事件以及新变量元素或扩展的值范围都是这些重用程序单元的“无关项”。程序员可通过以下方式在特征列表的特征名称旁附加限定条件,为重用特征增加有关新域变量和接口事件的条件特征重用特征{限定条件},另一特征;此上下文中的限定条件由两个语句组成条件语句和事件列表,它们是以与说明程序单元中的那些条件语句和事件列表相同的语法来描述的。限定条件修改了重用特征程序单元的条件部分。其事件语句中的事件列表现在将包括在限定条件中指定的事件。如果程序员将符号AND (逻辑“与”)设置在限定条件的条件语句前,则程序单元的限制语句变为其原条件语句与限定条件的条件语句的合取。如果程序员将符号OR(逻辑“或”)设置在限定条件的条件语句前,则程序单元的条件语句变为两个条件语句的析取。程序员将通过以下方式将不同的限定条件附加到重用特征的不同一部分程序单元Feature :reused_feature{(program-unil,program_unit2)
{qualificationl},{(program_uni3, program-unit4. . . program-unitN){qualification〗}}图Ila和lib给出了重用原模型的POTS的图10的扩展模型的特征示例。新模型利用了让用户指定PIN的扩展模型能力。然后,它利用了扩展模型的新POST-ANNOUNCEMENT状态,以验证主叫方是否能在15秒内输入正确的PIN。软件开发过程软件开发过程包括这些步骤(A)程序员开发应用模型。

(B)根据该模型,程序员开发一组锚特征。(C)在编写锚特征的每个程序单元时,调用交互作用检测工具以检查新完成的程序单元是否与以前完成的程序单元交互作用。或者,在完成一部分程序单元后可调用交互作用检测过程以检查可能的交互作用。(D)程序员解决锚特征的程序单元之间的特征交互作用。当特征交互作用检测工具在锚特征的程序单元之间找不到特征交互作用时,该锚特征就是合式锚特征。合式锚特征是可执行的。(E)根据该模型和一个或多个锚特征,程序员开发一组附加特征。(F)对于每个附加特征,其程序员应用交互作用检测和解决过程序,直至已解决特征的程序单元之间的所有交互作用,从而使特征成为合式特征。(G)模型的合式特征和附加特征的集合是库组件。程序员为特征程序包挑选一组锚特征和附加特征(后面我们将把它们统称为特征)。(H)程序员调用特征交互作用检测过程以检查特征程序包中包括的一组特征彼此是否交互作用。(I)程序员解决交互作用。在解决所有特征交互作用之后,特征程序包称为合式特征程序包,合式特征程序包是可执行的。这种开发过程描述为图12所示的流程图。我们注意到锚特征可独立开发而不需要更改其它锚特征。同样地,附加特征可彼此独立地实现。在将一些特征组成一个特征程序包时就出现了特征的集成。即使特征可能更改彼此的执行流程,将特征组成特征程序包也不需要更改特征代码。编写扩展模型及其特征和特征程序包的开发过程与前述过程相同。交互作用检测我们在两种情况下执行交互作用检测。首先,我们检查同一特征中程序单元之间的交互作用。其次,在将一个合式特征中的任一程序单元与另一特征中的另一程序单元一起置于特征程序包中时,我们检查它们是否交互作用。这一部分我们描述执行两个程序单元交互作用检测的过程。程序交互作用条件早先,我们这样定义交互作用的两个程序当把两个程序合在一起时,其中一个程序会更改另一程序的执行流程。假定采用我们的编程语言结构语义和运行时系统,则当且仅当两个程序的条件部分可同时为真,且这两个程序没有优先顺序关系时,才说明它们交互作用。虽可以检查上述条件,但它涉及证明“可达性”,这需要大量计算。我们使用下面充分条件来代替。简单的交互作用条件(SIC)如果两个程序单元交互作用,则(I)它们等待同一事件并且其相对于该事件的限定条件的合取是能被满足的;(2)其条件语句的合取是能被满足的;以及(3)它们没有优先顺序关系。 交互作用检测算法给定两个程序单元X和Y,以下算法可检查其SIC。算法I:
If (X和Y具有优先顺序关系)注释I
then return (无 SIC); else {
if (X和Y的事件列表不包含相同的事件) then return (无 SIC); else {
for (每个公共X和Y事件)注释2
check (其限定条件的合取 是否能被满足); if (限定条件合取不能被满足) then return (无 SIC); else {check (X和Y的条件注释3 语句的合取是否 能被满足 if (不能被满足) then return (无 SIC);else (报告条件语句和 限定条件的合 取为SIC条件);
}
}
}图13提供了算法I的流程图。要确定两个程序单元是否具有优先顺序关系(算法I中的注释I)相对简单。优先顺序关系是偏序的,并且可通过分析优先顺序列表容易地确定(参阅例如“计算机编程技术,第 I 卷,,(D. E. Knuth, “The Art of Computer Programming, Volume I, FundamentalAlgorithms, ” Addison-Wesley Company)以了解处理偏序的方法)。算法I中的注释2和注释3确定是否需要执行过程以确定两个简化谓词公式,即M和N的合取是否能被满足。算法2解决了该问题。算法2:步骤I :导出M的析取范式D(M);步骤2 :导出N的析取范式D(N);步骤3 :对于D(M)中的每项,检查其与D(N)中每项的合取是否能被满足;我们将合取结果的第i项表示为E (M,N) (i)。
步驟4: If (步骤3中检查的E(M,N)(i)无一能被满足) then return (M和N的合取不能被满足) else return (M和N的合取能被满足,并带有关于步 骤3中确定的所有能被满足的合取的报 告)。图14中提供了算法2的流程图。给定布尔公式,导出其析取范式的过程是众所周知的。析取范式写为一组组件的析取,即“Cl V C2 V . . . Cn”,其中,每个组件Ci是字母符号或字母符号逻辑“非”的合取,例如 “pi A p2Ap3”。为评估步骤3,我们注意到E(M,N)⑴中使用的唯一逻辑运算符是结合性的合取。因此,我们可根据它们是否属于同一域数据类型而重排E(M,N)(i)的字母符号。随后,对于每组谓词字母符号,我们调用其域数据类型的组合函数。我们还注意到(I)同一变量例如A的合取由(A AND A) == A ; (A AND A)== FALSE;( A AND A)== A给出。⑵两个不同的布尔变量在无关时其合取能被满足。(3)布尔字母符号本身是能被满足的。因此,我们可使用以下过程评算法2的步骤3。算法3I.对于每个E(M,N) (i),将属于同一域数据类型的字母符号组合在一起。
2.使用各自的组合函数来评估各组,或者在它们是布尔变量的情况下寻找不一致。如果任一组评为FALSE,则返回(不能被满足),否则返回(能被满足)。利用此算法,我们说明一种检测两个程序单元之间SIC的方法。图15给出了算法3的流程图。联合应用算法1、2和3确定两个程序单元是否交互作用。如果证明两个程序单元为交互作用,则算法2的步骤4确定它们交互作用的条件。概括此部分,SIC是充分条件。当发现两个程序单元不具有SIC时,则它们属于同一优先顺序列表或者其条件部分无法同时为真。这适用于合式特征或特征程序包中的任何两个程序单元。运行时系统运行时系统的作用是管理程序单元的执行。不失一般性,我们语言中的可执行对 象为合式特征程序包。如果特征程序包中的程序单元的条件部分为真,则它准备好执行,但该程序单元属于某个优先顺序列表的情况除外。在后一情况下,优先顺序列表准备好用于执行。已经说明,优先顺序列表可编写为程序单元。为简化我们的讨论,我们假定所有优先顺序列表已编写为程序单元。换言之,特征程序包只包含程序单元。此外,由于特征程序包是合式的,则如果两个程序单元的条件语句可同时为真,那么其事件列表无法同时为真。为简明起见,我们描述了执行单个特征程序包的运行时系统。熟悉多处理操作系统技术的技术人员可轻松地将我们的结果扩展到并发执行几个特征程序包的运行时系统。运行时系统的基本操作相对简单首先,它初始化系统。接着,在初始化后及每次在它完成程序单元的执行后,它检查事件的到达,更新由于执行程序单元而改变的域变量及搜索任何程序单元的条件部分是否已为真。最多可以有一个这样的程序单元。如果有一个程序单元为真,则运行时系统将执行该程序单元至完成。如果没有,则它等待另一事件。在事件到达时,它搜索是否有任一程序的条件部分已为真。它重复这些操作,直至它执行了程序单元的退出命令。然而,以下算法描述了相当优化的运行时系统,特别是在搜索条件部分已为真的程序单元的操作中。未测试过的搜索操作的性能随系统中使用的字母符号数量增加而迅速降低。我们使用一组寄存器,并在寄存器中用各比特表示字母符号,这样,可同时检查许多字母符号的真值(如寄存器的长度一样多)。在描述算法前,我们首先描述运行时系统使用的不同数据结构。运行时系统用于程序单元执行的数据结构我们描述三个数据集。第一个数据集是所有程序单元的全局数据集。第二个数据集特定于各事件类型。第三个数据集为特定程序单元专用。每特征稈序包数据运行时系统维护公共状态寄存器(CSR),该寄存器包含了属于特征程序包的程序单元条件语句中使用的所有不同字母符号的真值。我们将有关两个不同域变量(或不同的域变量组)的相同谓词函数视为两个独特的字母符号。由于这些字母符号中的每个字母符号可能只取TRUE或FALSE值,因此,CSR对每个字母符号使用一个比特。CSR是动态数据。其值在特征程序包执行期间域变量更新时改变。为进行有效的处理,运行时系统可依靠编译器准备的一些静态数据。如图16中所示,我们将每个域变量与在CSR中对应位置使用它的谓词函数集和在条件语句中使用CSR字母符号的程序单元相关联。当运行时系统需要时,它可借助域变量的当前值,利用此数据结构容易地更新CSR和程序单元条件语句的状态。每事件类型数据对于事件队列中的每个事件,运行时系统维护类似于CSR但用于事件限定的事件状态寄存器(ESR)。ESR遵循为相同类型的所有事件生成的ESR模板(ESRT)的格式。如图17所示,对于每个事件类型,我们将每个限定字段与使用它的谓词函数集及ESRT中的对应位置相关联。利用图17中的表格,在特殊类型的事件到达时,运行时系统可直接生成其ESR值。对于每个事件类型,维护在事件语句中引用事件类型的程序单元列表。毎稈序单元数据 对于每个程序单元,我们保持从特征交互作用检测过程生成的两个静态数据集。一个数据集来自条件语句,另一数据集来自事件语句。先描述源于条件语句的数据集对于条件的析取范式中的每项,我们构建记录满足该项的变量值的单元条件寄存器(UCR)。由于在该项中使用的变量是CSR中表示的变量子集,所以UCR的一种可能的实现方法就是使用与CSR相同大小的矢量,并且在与CSR中完全相同的位置记录变量值。UCR中其它比特值将设为FALSE。针对每个UCR,我们构建单元掩码寄存器(UMR)以指示在项中使用的变量的位置。换言之,UMR具有与CSR和UCR相同的大小。UMR在对应于项中所用变量的位置上具有TRUE值,并且在其它变量的位置上具有FALSE值。给定UCR及其对应的UMR,我们有一种简单的方法确定CSR是否如算法4中那样满足UCR。我们将更一般地描述算法4,因为它将在另一上下文中使用。给定寄存器A,其中每一位表示不同布尔变量的值。给定与A具有相同大小的另一寄存器B,并且A和B相同位置上的每一位表示相同的变量。如果B记录可满足布尔公式M的变量值,而另一寄存器C用TRUE或FALSE表示该公式中使用的变量,则算法4确定A中的值是否满足M。算法4 I.在A与C之间执行逐位逻辑“与”运算,并将结果记录到相同大小的临时矢量中。在运算结束时,临时矢量在项中未使用的每个变量上具有FALSE值,并且在项中使用的每个变量上具有与A中相同的值。2.在临时矢量与B之间执行逐位逻辑“异或”运算。如果两个矢量完全匹配(即,“异或”的结果对所有位均为零),则A满足M,否则,它不满足M。从事件语句中对于每个事件,我们构建类似于条件语句的UCR和UMR的事件限定寄存器(EQR)及其对应的事件掩码寄存器(EMR)。可以使用算法4确定给定的ESR是否满足事件限定条件。运行时系统算法我们现在准备描述运行时系统示例。运行时系统可工作在三种状态下最初创建运行时系统时的初始状态、执行程序单元时的活动状态以及等待使某个程序单元的条件部分为真的事件时的空闲状态。运行时系统一旦初始化,即可在下列两种情况下被调用收到事件时或执行的程序单元返回时。
初始状态在为执行而创建特征程序包(一些编程语言使用术语实例化)时,操作系统将为特征程序包及其特征中声明的局部变量分配空间。假设域变量的初始值与模型语句中指定的一样,则编译器或操作系统可通过图16所示的数据结构计算CSR的初始值。因为特征程序包必须包含至少一个锚特征,因此,存在至少一个其条件语句满足CSR的程序单元。利用算法4将此CSR与所有程序单元的UCR和UMR进行比较,我们可以确定这些程序单元并将它们置于当前的程序单元列表中。如前所述,列表中的程序单元不具有可同时为真的事件列表。列表中的至多一个程序单元未在等待任何事件。如果这样的程序单元存在,则运行时系统将执行该程序单元并变迁到活动状态。如果这样的程序单元不存在,则运行时系统将变迁到空闲状态。算法5描述了此操作序列。
算法5I.分配空间并初始化为特征程序包、特征程序包中的特征和程序单元定义的域变量和局部变量。2.确定CSR的值。3.确定当前列表中的程序单元组。
4. If (在当前列表中存在不等待任何事件的程序单元){
运行时系统状态=活动;
执行该程序单元;
} else {
If (事件队列不为空){
If (在队列中存在与当前列表中程序单元相匹配的事 件H
运行时系统状态=活动;
执行程序单元;
退出算法5; }
}
运行时系统状态=空闲;
退出算法5; }图18显示了算法5的流程图。步骤2、3和4可在编译时完成。在算法5执行之后,运行时系统将在下列两种条件下被调用运行时系统收到事件时,或执行的程序单元返回时。算法6(运行时系统收到事件时)If (运行时系统状态=活动){
将事件置于事件队列中;
退出算法6;
} else {
if ((在当前列表中存在等待此类型事件的程序单元)并且(事件的限定变量值满足程序单元的事件限定条件)){运行时系统状=活动;
执行程序单元;注I 退出算法6;
} else {
将事件置于事件队列中;退出算法6;
};图19显示了算法6的流程图。对于注释I中的语句,我们通过对事件的ESR和事件限定条件的EQR和EMR使用算法4,检查事件限定变量值是否满足程序单元的事件限定条件。由于程序单元在当前列表中,因此,当前CSR满足其条件语句。最多有一个程序单元满足两个条件并得到执行。如果当时在执行某个程序单元,或者在事件未使某个程序单元的条件部分为真时,将事件置于事件队列中。算法7(程序单元的执行返回时)步骤I: If (某些域变量已更新)then {
更新CSR;更新当前列表};
If(当前列表为空),则系统终止。
步骤2: If(事件队列不为空){
从事件队列中选择满足当前列表中某个程序单元的事件语句的一个事件;
If (未找到此类事件){
运行时系统状态=空闲;退出算法7;
} else {
运行时系统状态=活动;
执行程序单元;
退出算法7; }
};
} else {
运行时系统状态=空闲; /*未选择要执行的
程序单元*/
退出算法7}图20显示算法7的流程图。在步骤I中我们通过将算法4应用到每个程序单元的CSR和(UCR,UMR)而更新当前列表。通过计算将CSR的某个值与(UCR,UMR)组相关联。同样在步骤I中,如果给定特定的CSR值时未满足任一程序单元的条件语句,则无法进行进一步的计算。在步骤2中,可根据一些用户定义的标准从事件队列中选择事件,如首先选择接收的第一个事件,或辅以事件优先级的第一选定策略中的第一个事件。当事件队列中的事件不满足当前列表中程序单元的事件语句时,系统将不得不等待下一事件。总之,我们描述了一组算法,这些算法规定了运行时系统最初创建时应该做什么(算法5)、收到事件时应该做什么(算法6)及程序单元执行返回时应该做什么(算法7)。这些算法保持了两个重要的属性。首先,程序单元的执行是原子操作。运行时系统不会在执行一个程序单元时中途停止并切换为执行另一个程序单元。其次,一次只处理一个事件(从事件队列中除去),但我们未规定应选择使用何种优先级方案。这些算法是展示灵活性的算法示例。其它变形和优化的算法也是可能的。我们介绍了一组非过程语言结构、执行以这些语言结构编写的程序单元的运行时系统、在程序单元中检测交互作用的算法及使用此技术开发软件的过程。上述内容的一个主要目的是说明这样的可行性,即允许程序员将交互式特征设计成可重用组件,无需修改现有代码即可增加新特征。许多感兴趣主题未在本文明确描述的范围之内,但我们将简单讨论两个主题算法性能以及对采用此语言编写的程序的分析。细心的读者可能注意到,检查两个布尔公式的合取是否能被满足(即检查简化的交互作用条件SIC过程中的基本步骤)是NP完整性(NP-complete)问题。然而,现在的计算机可以相当快的速度(少于I分钟)解决有关具有少于二十个字母符号的公式的这种问题。但是,如果程序员在其条件语句中使用那么多的字母符号,则他们要应付他们自己可能不理解以及可能应避免的情况。在本方法中,由于我们只需要为等待具有兼容限定字段的同一事件的程序单元处理此问题,因此此问题得以减轻。所述的运行时系统算法性能应该是合理的。它还可进一步优化。例如,前面提到编译器实际上可以进行静态分析以将公共状态寄存器(CSR)的不同值链接到不同程序单元。运行时系统可在运行时学习并记住CSR为特定值情况下的程序单元当前列表,这样,它无需在下次确定当前列表。而且操作寄存器的所述算法相当快。 注意,模型中指定的域变量及其谓词函数可定义无限的论域(例如,允许域变量为整数类型,而整数本身是无限的)。然而,合式特征程序包的程序单元条件语句将论域分成有限数量的分区。如果程序单元的条件语句定义一个分区,则特征程序包中分区的数量最多为特征程序包中程序单元的数量。换言之,特征程序包实际上是有限状态机。为有限状态机设计的所有分析算法可用于分析特征程序包。导出未被特征程序包中程序单元的条件语句包括的论域较容易。运行时系统算法在遇到这种条件时将终止特征程序包。导致这种情况发生的条件最可能是异常条件(程序员可指明将正常退出执行的程序单元)。程序员可通过编写如图21所示的程序单元而得以对该异常作更多的控制,并将该程序单元置于特征的优先顺序列表的底部。或者,程序员可编写针对这种异常的特征,并将其置于特征程序包的优先顺序列表的底部。异常处理是编程语言设计中的重要主题。在许多软件系统中,异常处理代码多于正常处理代码。这是本方法比常规编程语言好的一个方面。由于不需要除所述那些语言结构以外的其它语言结构,因此,本文未对此作一详述。注意,虽然具体描述的是将本方法应用于电话,但本方法可应用于任何程序,特别是具有大量模块而且复杂的程序。这类程序的主要实例有因特网应用程序。更改购物车特征是可以利用本方法的一个有价值的编程问题。虽然语言结构使用事件驱动范式,但所述语言并不限于事件驱动应用。例如,从分析文本文件生成的标记可视为事件并用以此语言编写的程序进行分析。虽然显示并描述了本发明的特定实现例,但本领域的技术人员可在不改变本发明的情况下对这些特定实施例加以修改。因此,所附权利要求书旨在涵盖符合本发明真实精神且在其范围之内的所述变化和修改。
权利要求
1.一种无需修改现有代码即可添加新软件特征和开发彼此独立而无论其是否交互作用的库组件的方法,所述方法包括 (A)开发应用模型; (B)根据所述模型开发锚特征,每个锚特征至少包含一个程序单元; (C)确定在开发的每个新锚特征至少一部分新程序单元是否与所述新锚特征的以前完成的程序单元交互作用; (D)解决所述新锚特征的所述程序单元之间的所有交互作用; (E)根据所述模型开发附加特征和至少一个锚特征,每个附加特征包含至少一个程序单元; (F)确定在开发的每个新附加特征至少一部分新程序单元是否与所述新附加特征以前完成的程序单元交互作用,并解决所述新附加特征的所有程序单元之间的交互作用; (G)选择特征程序包的特征,所述特征程序包中的每种所述特征包含一组锚特征和一组附加特征; (H)确定所述特征程序包的各功能是否交互作用;以及 (I)解决所述特征程序包的所述特征之间的交互作用。
2.如权利要求I所述的方法,其特征在于 所述模型包括域变量和事件接口; 每个事件接口定义事件类型集,每个事件类型具有唯一的名称和为了限制而采用的具有限定字段的数据结构; 所述域变量彼此无关并且是包括组合函数的布尔或域数据类型; 所述特征程序包中的每种特征仅引用所述模型且包括程序单元; 每个程序单元仅引用所述模型并包含条件部分,所述条件部分包括条件语句和事件语句及在所述条件语句为真时执行的主体部分。
3.如权利要求2所述的方法,其特征在于还包括,除非其条件部分为真的多个程序单元还具有程序员以前定义的优先顺序关系,否则,一次最多只允许有一个程序单元具有真条件部分。
4.如权利要求2所述的方法,其特征在于还包括,只允许所述程序体部分的原子执行,其中,从当前程序体发送的事件保持在队列中,并且只有在当前程序体部分退出后,才可使用所述域变量的最新值评估另一程序单元的所述条件部分。
5.如权利要求2所述的方法,其特征在于还包括自动检查 相对于所述域变量的初始值,属于所述一个锚特征的至少一个程序单元的所述条件部分是否为真; 每个附加特征识别至少一个锚特征,并且所述附加特征的至少一个程序单元与所述附加特征引用的每个锚特征的一个程序单元交互作用;以及 所述特征程序包包括所述特征程序包中的一系列特征,所述特征程序包中的所有特征引用所述特征程序包中的至少一个所述锚特征。
6.如权利要求2所述的方法,其特征在于还包括,使程序单元集与所述程序单元集中程序单元之间优先顺序关系的优先顺序列表等效。
7.如权利要求I所述的方法,其特征在于还包括,在所述特征程序包中的两种特征传递性地彼此包含或者两个特征程序包传递性地彼此包含时检查循环包含。
8.如权利要求2所述的方法,其特征在于还包括,通过将交互作用的特征和交互作用的程序单元之一置于优先顺序列表中,解决特征组中各特征之间的交互作用。
9.如权利要求8所述的方法,其特征在于还包括,解决多个交互作用的程序单元之间的交互作用。
10.如权利要求2所述的方法,其特征在于还包括,通过将新元素添加到所述现有域变量的现有定义中或者扩展所述域变量或限定条件的现有值范围,扩展现有模型中现有域变量或接口事件的定义。
11.如权利要求10所述的方法,其特征在于还包括,扩展所述定义而无需删除现有元素或缩小所述现有值范围。
12.如权利要求10所述的方法,其特征在于还包括,扩展所述现有模型以包括在所述现有模型中定义的所有域变量和接口事件以形成扩展模型。
13.如权利要求12所述的方法,其特征在于还包括,重用所述扩展模型的特征程序包中现有模型的特征。
14.如权利要求13所述的方法,其特征在于还包括,将所述重用特征包括在所述扩展模型的特征程序包中的特征列表中。
15.如权利要求14所述的方法,其特征在于还包括,保持所述重用特征的程序单元之间的优先顺序关系。
16.如权利要求15所述的方法,其特征在于还包括,通过修改所述重用特征的程序单元的条件部分,使所述程序单元的事件语句中的事件列表包括所述限定条件中指定的事件,从而限制对所述重用特征的重用。
17.如权利要求15所述的方法,其特征在于,所述扩展模型包括新变量,所述方法还包括通过在检查和执行所述现有模型的所述特征以查看所述条件语句是否为真时,将所述现有模型的所述特征的所述条件语句设为与新变量无关,从而限制对所述重用特征的重用。
18.如权利要求I所述的方法,其特征在于还包括,在所述特征程序包中独立地开发所述锚特征而无需更改所述特征程序包中的其它锚特征。
19.如权利要求I所述的方法,其特征在于还包括,在所述特征程序包中独立地开发所述附加特征而无需更改所述特征程序包中的其它附加特征。
20.如权利要求2所述的方法,其特征在于还包括,检查同一特征中各程序单元之间的交互作用,以及在第一特征和第二特征一起置于所述特征程序包中时,检查所述第一特征中的任一程序单元是否与所述第二特征中的程序单元交互作用。
21.如权利要求20所述的方法,其特征在于还包括,通过确定程序单元集是否等待所述同一事件及相对于该同一事件所述程序单元集的限定条件合取是否能被满足,确定所述程序单元集的条件语句合取是否能被满足,以及确定所述程序单元集没有优先顺序关系,从而确定所述程序单元集之间的交互作用。
22.如权利要求21所述的方法,其特征在于还包括,通过获得所述程序单元集的第一条件语句的析取范式,获得所述程序单元集的第二条件语句的析取范式,然后确定所述第一条件语句的所述析取范式中每项与所述第二条件语句的析取范式中每项的合取是否能被满足,从而确定所述程序单元集的条件语句的所述合取是否能被满足。
23.如权利要求22所述的方法,其特征在于还包括,通过将属于同一域数据类型的字母符号成组,并使用所述字母符号组中所述字母符号的组合函数来评估每个字母符号组,或者在所述字母符号是布尔变量时检查茅盾,从而确定所述第一条件语句的所述析取范式中每项与所述第二条件语句的析取范式中每项的所述合取是否能被满足。
24.如权利要求I所述的方法,其特征在于还包括,确定除非具有真条件部分的多个程序单元还具有优先顺序列表中的优先顺序关系,否则,当所述特征程序包中某个特征的某个程序单元的条件为真时,则该程序单元准备好执行。
25.如权利要求24所述的方法,其特征在于还包括,将所有优先顺序列表转换为程序单元,这样,所述特征程序包只包含程序单元。
26.如权利要求2所述的方法,其特征在于还包括,除非所述特征程序包中一个以上的程序单元具有优先顺序关系,否则确保它们的条件语句和事件列表不同时为真。
27.如权利要求2所述的方法,其特征在于还包括,维护在所述特征程序包中的程序单元的条件语句中使用的所有不同字母符号的真值公共状态寄存器,并在所述特征程序包执行期间在期望时间更新所述真值。
28.如权利要求2所述的方法,其特征在于还包括,维护在所述特征程序包的程序单元的事件队列中的每个事件的事件限定条件的事件限定寄存器,并在所述特征程序包执行期间在期望时间更新所述事件限定条件。
29.如权利要求2所述的方法,其特征在于还包括根据所述特征程序包中所述程序单元的所述条件语句,生成第一静态数据集;在第一寄存器中存储所述第一静态数据集;根据从所述特征之间的交互作用检测获得的所述特征程序包中所述程序单元的所述事件语句,生成第二静态数据集;以及对于所述第一和第二静态数据集构造记录满足所述条件或事件的析取范式中每项的变量值的单元条件寄存器或事件限定寄存器,构造指示所述项中所用的变量位置的掩码寄存器,并通过将所述单元条件寄存器或事件限定寄存器与所述对应的掩码寄存器进行比较,从而确定所述公共状态寄存器是否满足所述单元条件寄存器或事件限定寄存器。
30.如权利要求2所述的方法,其特征在于还包括,最初创建运行时系统时工作在初始状态,所述运行时系统在执行所述特征程序包的程序单元时工作在活动状态,以及所述运行时系统在等待事件以使所述特征程序包的某个程序单元条件部分为真时工作在空闲状态,在所述运行时系统收到事件时或在执行的所述特征程序包的程序单元返回时,调用所述运行时系统。
31.如权利要求2所述的方法,其特征在于还包括 初始化运行时系统; 在所述运行时系统初始化后,利用所述运行时系统执行一个所述程序单元; 在完成所述程序单元的执行后,检查事件到达,更新由于所述程序单元的执行而改变的域变量以及搜索任一所述程序单元的所述条件部分是否已为真; 如果特定程序单元的所述条件部分已为真,则执行所述特定程序单元以完成操作;以及 如果所述特定程序单元的所述条件部分未为真,则等待另一事件直至执行了程序单元的退出命令;其中,除非具有真条件部分的多个程序单元也具有优先顺序关系,否则,一次最多一个程序单元的所述条件部分为真。
32.如权利要求I所述的方法,其特征在于还包括,确定在所述程序单元之间是否存在不一致的优先顺序关系,并解决不一致的优先顺序关系。
33.如权利要求2所述的方法,其特征在于还包括 分配空间并初始化为所述特征程序包、所述特征程序包中的特征和程序单元定义的所述域变量和局部变量; 确定公共状态寄存器的值,所述公共状态寄存器包含在属于所述特征程序包的所述程序单元的条件语句中使用的所有不同字母符号的真值; 确定当前列表中的程序单元集; 设置运行时系统的状态为活动如果所述当前列表中存在的程序单元未在等待任何事件及在执行不等待任何事件的程序单元,或者如果事件队列不为空且队列中存在匹配当前列表中的一个所述程序单元的事件;否则将所述运行时系统的所述状态设为空闲状态。
34.如权利要求33所述的方法,其特征在于还包括,在所述运行时系统收到事件时或者正被执行的程序单元返回时,调用所述运行时系统。
35.如权利要求34所述的方法,其特征在于还包括,只允许任一程序单元的原子执行,以便所述运行时系统在特定程序单元执行期间不会停止并切换以执行不同的程序单元。
36.如权利要求35所述的方法,其特征在于还包括,一次只处理一个事件并确定要独立地处理的事件的优先级方案。
37.如权利要求36所述的方法,其特征在于还包括,通过静态分析将所述公共状态寄存器的不同值链接到不同的程序单元,从而使所述运行时系统在运行时能够了解并记住程序单元的当前列表,这样,所述运行时系统在随后处于活动状态时不用确定所述当前列表。
38.如权利要求2所述的方法,其特征在于还包括,利用所述特征程序包的所述程序单元的所述条件语句,将所述模型中指定的所述域变量及相关谓词函数定义的论域分成有限数量的分区,特征程序包中的分区数量最多为所述特征程序包中程序单元的数量。
39.如权利要求I所述的方法,其特征在于可执行锚特征和可执行特征程序包是有限态自动机。
40.如权利要求2所述的方法,其特征在于还包括,在特定功能的至少一个程序单元中包括异常条件,并在所述特定功能的优先顺序表底部插入所述至少程序单元,或者包括含有所述异常条件的新功能并在含有所述新功能的特征程序包的优先顺序列表底部插入所述新功能。
41.如权利要求2所述的方法,其特征在于还包括,通过如下算法I检查两个程序单元X和Y的单交互作用条件(SIC)If (X和Y具有优先顺序关系) then return (无 SIC); else { if (X和Y的事件列表不包含相同的事件)then return (无 SIC);else { for (每个公共X和Y事件) check (其限定条件的合取 是否能被满足);if (限定条件合取不能被满足) then return (无 SIC); else {check (X 和 Y 条件 语句的合取是否能被满足);if (不能被满足)then return (无 SIC); else (将条件语句和 限定条件的合 取作为SIC条 件报告); } }}
42.如权利要求2所述的方法,其特征在于还包括,通过如下算法2确定两个简化谓词公式M和N的合取是否能被满足 算法2 步骤I :取得M的析取范式D (M); 步骤2 :取得N的析取范围D (N); 步骤3:对于D(M)中的每项,检查它与D(N)中每项的合取是否 能被满足;从此合取产生的第i项表示为E (M,N) (i).步骤4: If (步骤3中检查的E(M,N)(i)均不能被满足) then return (M和N的合取不能被满足) else return (M和N的合取能被满足,以及有关步骤 3中确定的所有能被满足的合取的报 告)
43.如权利要求2所述的方法,其特征在于还包括,通过算法3评估算法2的步骤3 算法3 对于每个E (M,N) (i),将属于同一域数据类型的字母符号成组以形成字母符号组; 使用所述字母符号各自的组合函数评估所述字母符号组中的每个字母符号组,或者寻找所述字母符号的布尔变量之间的茅盾;以及 如果任一所述字母符号组被评为FALSE,则返回(不能被满足),否则返回(能被满足)。
44.如权利要求43所述的方法,其特征在于还包括,确定寄存器A中的值是否满足布尔公式M,其中所述寄存器A包含的比特每个表示不同布尔变量的值;寄存器B与A大小相同,寄存器A和B的相同位置上的每个比特表示相同的变量,寄存器B记录可满足布尔公式M的变量值,以及寄存器C表示所述公式M所用的取值为TRUE或FALSE的变量,通过算法4并应用算法4确定公共状态寄存器(CSR)是否满足单元条件寄存器(UCR)和事件状态寄存器(ESR)是否满足事件限定条件,其中,算法4包括 在寄存器A与C之间执行逐位逻辑“与”运算,并将其结果记录到相同大小的临时矢量中,这样,在所述“与”运算结束时,所述临时矢量在所述公式中未使用的每个变量上具有FALSE值,而在所述公式中使用的每个变量上具有与A中相同的值; 在所述临时矢量与B之间执行逐位逻辑“异或”运算;以及 确定仅在所述临时矢量与寄存器B完全匹配时寄存器A满足M。
45.如权利要求2所述的方法,其特征在于还包括,用于所述运行时系统的运算算法5包括 分配空间并初始化为所述合式特征程序包、所述合式特征程序包中的功能和程序单元定义的所述域变量和局部变量; 确定CSR的值; 确定当前列表中的程序单元集;if (在所述当前列表中存在不等待任何事件的程序单元){
46.如权利要求45所述的方法,其特征在于还包括,执行算法5,并且在执行算法5后,在所述运行系统期收到事件时根据算法6调用所述运行时系统,或者当正在执行的程序单元返回时,根据算法7调用所述运行时系统 算法6(所述运行时系统收到事件时) If(运行时系统状态=活动){
47.如权利要求2所述的方法,其特征在于,所述条件语句是布尔域变量的布尔公式和其它类型域变量的谓词,并且事件限定条件包括所述事件的所述限定字段的布尔公式,以及所述主体部分包括在所述域变量上操作和发送事件
48.如权利要求2所述的方法,其特征在于,每种功能中至少一个程序单元与所述锚特征中至少一个程序单元交互作用,所述功能中的至少一个程序单元引用所述锚特征。
49.如权利要求2所述的方法,其特征在于,所述特征程序包还包括在所述特征程序包中包含的程序单元列表。
50.如权利要求2所述的方法,其特征在于,所述特征程序包还包括功能的优先顺序列表和所述特征程序包中包含的程序单元。
51.如权利要求2所述的方法,其特征在于还包括,通过修改所述功能和特征程序包中的程序单元的条件部分以包括含有新域变量的条件,而重用包含所述新域变量的扩展模型中的功能和特征程序包。
52.如权利要求2所述的方法,其特征在于还包括,通过两个寄存器之间的逐位比较,确定特定程序单元的条件语句是否得到满足。
53.如权利要求I所述的方法,其特征在于,还包括通过将所得的可执行程序作为有限状态自动机分析而分析所述可执行程序。
全文摘要
本发明公开了一种用于开发软件的计算机辅助方法,通过该方法,即使应用程序的不同特征会影响彼此的控制流,程序员也可将这些特征实现为无关的可重用组件。程序员可将新特征增加到应用程序而不需执行检查和修改现有代码这种工作量大的任务。程序员使用一组编程语言结构来说明非过程程序单元,将程序单元组织成可重用的特征,并将几种特征集成为特征程序包。交互作用检测算法分析程序单元并确定特征中的程序单元之间以及特征程序包中的特征之间是否存在交互作用。如果检测到交互作用,则在程序可以执行前,程序员必须解决交互作用。运行时系统规格支持编程语言结构的语义,并保持允许交互作用检测的条件。
文档编号G06F9/46GK102681878SQ20121002121
公开日2012年9月19日 申请日期2002年8月9日 优先权日2001年8月17日
发明者梁扶汉 申请人:梁扶汉
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1