增量建立系统的制作方法

文档序号:6408218阅读:237来源:国知局
专利名称:增量建立系统的制作方法
技术领域
本发明涉及计算机辅助软件工程(CASE),尤其涉及面向人的目标编程系统(HOOPS),该系统为计算机程序建立提供了交互和动态环境。本发明使程序员得以由开发复杂程序(例如操作系统软件及具有图形用户界面(GUI)的大的应用程序)时极为有用的优化增量编译程序对微小的颗粒源码进行编辑。通过使用通用的面向目标编程(OOP)语言C++的最佳实施例来公开本发明,但其原理适用于面向目标以及过程的计算机编程语言,本发明亦可用于建立使用常规的和OOP语言的程序。
OOP是建立用户友好、智能化计算机软件的最佳环境。OOP的关键元素是数据密封(data encapsulation),继承(inheri-tance)以及多形性(Polymorphism),其中,数据密封是指在面向目标的编程中,一个目标的属性和性能被保护而不被其他目标直接存取;继承则是指在面向目标的编程中,目标的一个分类可以被定义为一个一般分类的特例,但自动包括该一般分类的方法及变量定义;而多形性则指面向目标的编程中,通过继承而关联的不同分类的目标唯一地响应同一成员功能调用。这些元素可以用于产生GUI,尤其是由具有图符,鼠标光标以及选择屏的视窗环境所构成的GUI。虽然这三种关键元素在OOP语言中很常见,但大部分OOP语言在实施它们时有很大的区别。
OOP语言的例子包括Smalltalk、Object Pascal和C++、Smalltalk实际上不止是一种语言,更准确地讲,它应该被标识为一种编程环境。该语言是在70年代早期内位于施乐普拉阿图研究中心(PARC)的学习研究小组开发的。在该语言中,一个消息被送到一个目标以对目标本身进行评价。消息完成的任务类似于在常规编程语言中的功能调用,程序员无需关心数据类型而只须关心生成正确顺序的消息及使用正确的消息。Pascal是用于苹果公司的Macintosh计算机上的语言,苹果公司在Pascal语言的设计者-尼古拉期·沃斯(Niklaus Wirth)一的合作下开发出了0bject Pascal语言,C++则是由斯托斯特拉普(Bjarne Stroustrup)在1983年在AT&T贝尔实验室由C语言扩展而成的。C++的主要概念是分类,它是用户定义型的,分类提供了面向目标的编程特性。C++模型与C模型相兼容而且可随意连接,从而现有的C程序库可由C++程序所用。最广泛使用的基于目标和面向目标的编程语言源于60年代由挪威的戴沃(O-J·Dahl),梅阿汉(B·Myhrhaug)以及耐格得(K·Nygard)所开发的Simula语言。有关OOP的信息可参见布克(GradyBooch)所著的“Object Oriented Design With Applications”(Ben-jimin/Cummings Publishing Co.,I nc.,Redwood City,Califormia(1991)。
运行一个计算机程序的完整过程涉及把程序员写出的源码译为机器可执行的格式,通常称为目标码,然后再执行该目标码翻译的过程是由编译程序或解释程序完成。在解释程序中,翻译是随程序的运行而进行的;而在编译程序中,则是在运行该程序之前就进行翻译并将结果作为目标码存贮起来。也就是说在一般的编译和执行系统中,翻译和执行是分开进行的。即编译只进行一次。而在解释系统中,例如Smalltalk解释程序,两者是顺序进行。Smalltalk需要解释程序是因为直到一个目标被实现之前编程环境不允许设定专用寄存器或地址空间。
一个编译程序包括三部分;词法分析程序,语法分析程序,以及代码生成程序。词法分析程序的输入是代表高级语言程序的一序列字符。词法分析程序将该序列字符分为一序列标记以输入到语法分析程序、语法分析程序进而将该序列标记分为指令并利用语法规则的数据库来确定每条指令的语法是否正确。若不正确,则产生错误消息。若正确,则指令被分解为一序列基本指令。这些基本指令被送至代码生成程序以产生低级语言。代码生成程序本身通常又分为三部分;中间代码生成,代码优化,以及代码生成,代码生成程序接收来自语法分析程序的输出并生成机器语言码。
为有助于软件开发,增量编译程序已被开发,在这类程序中,编译程序在批处理操作中生成用于接收的一条语句或一组语句的代码,而与稍后生成的用于其他语句的代码无关。增量编译的优点在于代码可以在部分程序写成时即进行编译和测试,而无需等到整个程序完成时才进行调试处理。但是,常规的增量编译程序必须每次都对一个完整的模块进行再处理。
优化编译程序产生高度优化的目标码,从而在许多情况下使得在源级进行调试比一个非优化编译程序更困难。这一问题源于这一事实,即虽然一个例行程序将被编译以给出适当的答案,但计算该答案的正确方式可能与源码中描述的大相径庭。优化编译程序可以做的一些事情包括删除已知不会影响最终结果的代码或重量,将非变量代码移出循环,合成出用码,在变量不再需要时重新使用分配给这些变量的寄存器等等。如此,源码到目标码或目标码到源码的映射在给定某些优化时可能会有困难。由于变量的值可能并非在例行程序中任意位置处总是可用的,所以可能班于校验变量的值。在优化代码中修改变量值尤为困难。除非专门说明为易失的,否则编译程序会“记住”分配给变量的值并可能在以后的代码中不再读该变量而使用“已知”的值。因此,在该值中的改变产生了错误的程序结果。
虽然在先有技术的计算机程序建立,测试及开发中有许多优点,但已知的软件开发工具仍给程序员带来极大负担,从而通常要求有直觉的洞悉力。其次,常规的面向批处理的编程系统需要很长的编辑——编译——测试周期。这对编程的创造性行为带来的极大的不利影响。
因此,本发明的一个目的是提供一种用于使程序员有高效率的工作的计算机程序建立的面向人的交互动态处理。本发明的目的还包括提供一种将程序建立所需的编辑——编译——测试周期缩至最短的自动程序建立操作。
根据本发明,程序建立可由增量程序模型(称为项目Project)和三个主要的功能程序相互作用而成。一个程序被作为语义单元来建立,语义单元被称之为部件并由称为特性的命名数据项目表构成。不是象常规系统那样把程序作为一个松散的文件集存储起来,本发明的面向人的目标编程系统把项目中有关程序的所有信息存起来。
在本发明的实施中,一个计算机程序被作为一个项目部件和一个可建立部件集来建立,每一个都代表一个可编译的语言元素并定义了一个增量级。提供计算机程序模型的部件被存起来以便在建立过程中进行存取。存储的部件被依序存取并由一个编译程序计算与一个部件的相关性,从而开发客户和参照表。最后,用部件的特性和编译程序产生的相关性对部件进行编译以建立计算机程序。
本发明的最佳实施例是以C++书写的并用来建立C++、C以及汇编语言的程序,这些语言是当前最流行的。本发明的程序建立一般可用这三种语言完成。虽然本发明本身是以面向目标的编程语言写成的面向目标的程序,但其并不仅限于以面向目标的程序语言建立程序。本发明可同样用于以过程语言建立程序。进而,本发明不限于C++语言,它也可由其他编程语言实现。而且本发明的原理可用于更为一般应用的面向人的目标编程系统。
上述目的,优点可从本发明的详细叙述以及附图中有更好的理解。其中,

图1展示了一种可以支持高分辨率图形显示设备和光标指示设备(例如鼠标器)的常规计算机系统,本发明即可在该系统上实施;图2是图1所示计算机系统的主要部件框图;图3是构成一个程序的部件集的概念形式框图;图4是本发明的原理功能程序框图;图5A到图5D为通过建立状态(Build State)寄存编辑变化的逻辑流程图;图6是根据本发明在建立处理操作的第一阶段确定可能的部件的逻辑流程图;图7是根据本发明在建立处理操作的第二阶段处理界面的逻辑流程图;图8是根据本发明在建立处理操作的第三阶段处理实施的逻辑流程图;图9是根据本发明由编译程序调用的获取说明(GetDec-laration)功能的逻辑流程图;图10A和10B展示了有条件地编译功能(CorditionallyCompile funetion)的逻辑流程图;在根据本发明的面向人的目标编程系统(HOOPS)中,部件是增量编译的颗粒,即一个部件表示一个可编译的语言元素,例如一个分类或功能,一个部件由一组特性组成。该组特性分为外部可见(或公开)部分,称为界面(Interface)和实施(Implementation)(隐私)部分。这意味着一个部件仅可依赖于另一部件的界面,一个项目中的所有部件被组合成为一个树结构,其底部为叫做项目部件的根部件。
三个主要功能程序是数据库,编译程序及建立处理(build mechanism)。数据库持久地存储和检索部件以及其特性。而编译程序则在编译一个特性的源码的同时,负责计算与一个部件有关的相关性。建立处理则利用部件的特性以及编译程序生成的相关性在建立处理过程中正确有效地对部件的编译进行排序。建立处理在任何时候都对一个程序有全局的观察。这与常规方式形成了鲜明对比。在常规方式中,程序由一组相互独立编译的文件所表示。在常规编译环境中采用的文件把处理的特定顺序施加于文件中包含的语义单元。
本发明的系统自动追踪部件中的编辑变化,包括是否在界面或实现中的变化,这与只在文件级上进行跟踪的常规系统形成了对比。相关性分析自动进行且基于两个部件之间的关系。本系统包括一个机制,它允许编译程序记录一个相关性存在的事实以及是哪种相关性。
这使得建立处理可以更准确地确定哪个部件需要编译,从而使本系统与对所有存在相关性的部件进行再编译而无论该再编译是否需要的系统相比而更为有效。
常规的编译程序利用编程环境中的软件构造工具(con-struction tool)来简化软件生成。例如,在一般程序构造中,通常是把总的程序分为模块,模块一般存在多个文件中,每个模块可以不同方式进行处理。一个Make命令用来管理和维护构成计算机程序的模块;也就是说,Make功能追踪两个程序模块之间的关系,并且只发出需要使模块在改变发生之后仍然一致的那些命令。然而,程序员必须要生成一个Makefile说明以定义两个模块之间的关系(相关性)。对Makefile说明的要求意味着程序员必须能决定何时发生相关并把同步相关性的负担加到程序员身上。实际上,这通常意味着存在有不必要的相关性以及遗失必要的相关性,这两者可能是在建立计算机程序过程中的错误源。
与Make功能相比,本发明的建立处理不同,它无须程序员生成象Makefile说明之类的说明,建立处理假设没有相关性的预备知识;实际上,它会“发现”部件的相关性并追踪相关性。这意味着建立处理将在没有先有相关信息时从擦除中建立一个程序。在建立操作开始阶段,所有部件列在一个变化表中。将试图对变化表上的部件进行编译,但若编译是由另一部件的编译所决定时,第一个部件的编译或者被中止,或者被暂停,而且第二个部件的编译会试着开始,如此直到找到一个可以编译的部件。然后,建立处理利用任何在该处理中先前产生的信息经由早先暂停或中止的部件返回进行。
该建立处理对编译排序以致所有界面(Interface)在任何实施(Implementation)之前被编译。这样便减少了可能的交叉相关性数目而且因此增加效率。建立处理利用有限状态机的形式控制部件处理并有助于通过把部件的中止或暂停编译减至最少的方式保证部件处理的正确排序。
在变化发生(编辑一个部件或加入、删除一个部件)之后的建立操作与起始建立操作相似,其不同之处只在于变化表只包括已经改变的那些部件,建立处理使用以前开发的客户以及源参照表来只对需要再编译的那些部件进行再编译。由本发明实现的功能级增量编译极大地减少了编程变化到测试的长周期,这是因为只有很少一部分程序将被再建立。
本程序模型提供了一种存储和再使用用于界面的内部处理的格式(称为说明特性(Declaration property)。本编译程序存储界面的处理过的内部格式从而可以在编译一些其他部件时更有效地使用它。这与常规系统相反,在常规系统中,所用的界面包括在每个使用的文件中而且每次编译程序都对界面进行再处理成为内部格式。此外,部件和特征的程序模块提供了一种很自然的方法来存储与特定部件密切相关的信息。该信息可为程序员直接使用,亦可由其它工具间接使用。在常规系统中,这类数据或者在编译结束时被遗忘了,或者只是很松散地与程序源相关联。
错误处理使建立处理避免对与错误部件有关的部件进行编译。建立处理将正确地建立尽可能多的项目。这两者与通常停下在第一个错误文件或即使进行进一步处理,也会重复处理包括错误的文件的常规系统相比较,是完全不同的,错误处理使编译程序发出告警消息而不致使特定部件被错误地处理。这一处理可在发出告警消息时仍然建立正确的程序。
硬件平台参照图1,示出了一个常规计算机10。该计算机10包括一系统单元12,一个多分辨率显示设备14,例如一个阴极射线管(CRT),或者一个液晶显示器(LCD)。显示的类型并不重要,除非要求用于显示视窗系统,尤其是图形用户界面时需要高分辨率,用户对计算机的输入由键盘16以及光标指示设备,例如鼠标器18完成,鼠标器18可连到系统单元12的一个专用或串行口。图1所示的计算机是AppleMachintosh(苹果计算机的注册商标)及IBM PS/2。其他机型包括各种工作站,例如IBM RISC System/6000以及SunMicrosystems计算机。
图2展示了图1所示计算机的基本部件,系统单元12包括连到总线24上的一个中央处理单元(CPO)21,随机存取存储器(RAM)22,以及只读存储器(ROU)23。CPU21可以是任何商业化的微处理器,例如Motorola 68030和68040(它们通常用于Apple Machintosh计算机中)或Intel 8038及80486(它们通常用在IBM PS/2计算机中)。其他微处理器,例如RISC(用于精简指全集计算机)微处理器(通常用于工作站)也可使用。ROM24存储用于CPU的基本微码,包括基本输入/输出系统(BIOS)。计算机系统10的操作系统(OS)也可存在于ROM24中,或者把OS作为初始程序装入(IPL)的一部分存入RAM22中。RAM22也用于存储部分应用程序以及执行该程序过程中生成的临时数据。总线24可以是Apple NuBus,IBM MicroChannel或工业标准之一的总线,例如ISA(工业标准适配器)或EISA(扩展的工业标准适配器)。
与总线24相连的还有多个输入/输出(I/O)适配器,包括一个用户接口适配器25以及一个I/O适配器26。键盘16与用户接口适配器25相连,而I/O适配器26与软盘驱动器27和硬盘驱动器28相连。软盘驱动器27允许把数据和程序读写到可擦除介质,而硬盘驱动器28通常存储页入页出RAM22的数据和程序。显示设备14通过显示器适配器29而与总线24相连。通信适配器30为网络提供接口。其他支持电路(未示出)为集成电路芯片,它们被连到总线24和/或CPU21。这些芯片包括例如控制总线24上的信息量的总线主控芯片。总线24在某些计算机中可以是双总线;数据总线和允许在图形用户界面中需要的高速显示操作的显示总线。
定义程序如在本发明的描述中所使用的那样,一个HOOPS程序包括一个叫做“项目”的“不可建立部件”以及一个“可建立部件”集。不可建立部件亦可存储,但在本说明书中,只要谈到不合格的部件,就是指一个“可建立部件”,不可建立部件在建立操作中将不被编译。
部件一个部件有一个唯一的标识并被命名。不同的部件由称为ID的不同形式的唯一标识符加以区分。有一个称为空ID(NullID)的区别ID,它不属于部件。该ID在一个部件被生成时被赋予而且在该部件存在期间不会改变。若一个部件被删除了,它的ID不会再被使用。在实际中,ID通常是数字的。
一个部件也有一个“名字”,它包括一串没有白空格的文本。不同部件不必有不同名字。可以获得包括所有部件的表(可能是空的),其中,所有部件的名字与某些给定文本串相吻合。一个部件的名字可以在部件存在期间被改变任意多次。
每个“可建立部件”与特定的计算机语言相关。实践中,计算机语言通常由一串文本标识。每一计算机语言有一个与其相关的编译程序。在用该语言编译任意部件时使用这一编译程序。实际上,可能使一种给定的计算机语言与不止一个编译程序相关联。在本例中,部件必须记录语言以及标识该特定编译程序的某些方式。
一种特定的语言有一与之相关的特定的部件种类集以及一特定的特性实施集,通常可能每一种类都不同。如此,在一特定语言中的区别语义元素可以根据需要以不同方式进行组合。
部件有“建立状态(Build States)”。“建立状态”是一个来自表“不可编译”(Never Compile),“编译的”(Compiled),“需要编译”(Need To Compile),“不确定”(Uncertain),“正被编译”(Being Compiled),“编译错误”(Compile Error),以及“不确定错误”(Uncertain Error)的值。实际中,这些值通常是数字,每个部件有一对称为“Interface Build State(界面建立状态)”和“Implementation Build State(实施建立状态)”的“建立状态”。无论是可建立的或不可建立的,每个部件都有这两个建立状态。对不可建立的部件而言,这些建立状态是都“不可编译”的。
“建立状态”可被存取和改变。可以把一个部件的“建立状态”设置到同一值并且不会导致任何影响。改变一个“建立状态”可能很好地限定了副作用,例如改变同一部件或不同部件的另一特性的“建立状态”,或者例如从诸如改变表或错误表之类的某些表中加入或删除引用。
部件用于表达语义语言元素。表达的方式取决于被设计的特定计算机语言。例如在C++中由部件表达的一部分语言元素包括全局数据,全局功能,分类,数据成员,成员功能,typedef,enums,仿真程序,宏指令,“或”运算以及结构。通常,每个语义元素将有一相关联的区别种类。
特性一个部件包括一个命名的“特性”(Property)集。一个特性表示与该部件有关的一些数据。给定部件的ID和特性名之后,可以存取和检索这些数据。特性名字通常由标识名字的数字(有时称为记号)在内部表示。也有不属于特性的区别特性名,叫做“空特性”(Null Property)。
与一给定特性相关的数据对不同的部件而言是不同的。改变一个部件给定特性的数据并不意味着改变用于任何其他部件的同样特性的数据。但是,有可能在一个部件的一个特性中的改变会导致同一或另一部件的另一特性的改变。
“引用(reference)”包括一个ID和一个特性名。一个引用唯一地标识特定的部分特性数据。一个引用通常被松散地使用,就象它是部件和/或与之相关的特性。实际上,一个引用通常包含不在程序建立过程中直接使用的其他信息,从而标识该特性中的哪种数据版本及哪种数据子节将被引用。
所有部件必须有特性“名字(Name)”和“贮存器(Contain-er)”,该特性“名字(Name)”存有部件的名字,特性“贮存器”则包含了特性名为“空特性”的一个引用,从任一部件开始并相继地由贮存器ID引用的部件取代前一部件将总是最终导致“项目部件”(Project Component)。该项目的“贮存器ID”是“空ID”(NulID)。如此,所有部件在项目中被描述。
建立特性(亦称为部件建立表)以建立顺序记录最后建立中被正确编译的特性表,相同的特性应该在该表中最多实现一项,建立特性用于测试和调试。
项目部件一个项目是一个还有特性“变化表(Changelist)”和“错误表(Errorlist)”的部件。特性变化表是一个引用表,这些引用描述部件以及最后一次建立以来发生了改变的特性。实际上,“变化表”可以由某种可以在建立一个程序的过程中有效地存储的多个表来表示,特性“错误表”也是一个引用表,这些引用描述在最后程序建立过程中列为有错误的部件,这些引用都有“错误”特性,与每个引用相关的是一个数字键,它用于关联特定的特性“错误”以确定一个专用消息的设置以及部件特定特性的一个特定子范围。
可建立部件一个可建立部件必须有这些特性“说明”(Declaration),“目标码(Object code)”,“客户(Clients)”,“源引用”(SourceReference),“错误”亦可有这些特性“界面(Interface)”,“实施(Implementation)”,以及“成员(Members)。
特性“说明”表示用于编译程序的一个数据高速缓冲存储器,它可能在部件已被编译之前是空的。实际上,它可被认为是编译程序符号表的入口,尽管存储的表示可能与编译程序的内部表示不同。
特性“目标码”表示了用于部件的可执行码,它可能在部件被编译前是空的,或者由于没有目标码与该部件相关而是空的。实际上,它通常提供一个手段指向被存在它处的实际码。
特性“客户”和“源引用”是一对集合,它们包括一个引用和一个“相关性(Dependency)”,一个相关性是一个变化表,变化可以表示为从一个有区别的有限表串中选取的一个文本串。一个称为“公开(Public)”的有区别的变化用来区分只在实施特性中对部件的引用,这与界面特性中的应用相反,一个相关性可表示为一个位向量,其中若第n位数变化在表中表示,则该位向量的第n位为“1”,否则为“0”。
特性“错误”包括一个三个一组的表,每一组包括一个“键”,一个特性名,以及一个消息,一个键即为一个数字标识符,一个给定键在特定的特性“错误”中在一个时刻只出现一项,该特性名常是“界面”或“实施”,而消息则是文本或/和图形的某些部分。
特性“界面”和“实施”表示部件的源文本,该源文本可作为记号而非文本存起来并在需要时以不同格式访问,由这些特性表示的文本可通过编程环境中的人工编辑而予改变,一种可能性是把界面数据作为结构区存起来,而从结构区中,源文本可按需要重新构造。
特性“成员”是引用集(可能空的),每一引用用于“项目”中的每个部件,而“项目”将该部件作为其贮存器。
属性一个部件有多个属性,一个属性为“真”或“假”,实际上,一个属性通常是由其“真”值和“假”值由数字“1”和“0”表示的一个存储位所表示的,所有部件都有“是可建立的(Is Build-able)”属性,若该属性为“真”,则该部件是可能建立的;否则便为不可建立的。一个部件可能总是不可建立的或暂时不可建立的(因为某些暂时条件的作用)。
可建立部件也有“在内部(Is In Line)”属性,当该属性为“真”时,部件的“实施”是公开的,这意味着另外的部件可以依赖于实施的改变,若其为“假”,则实施改变永远不会导致其他部件改变。
可建立部件还有“合成(Is Synthetic)”属性,这一属性对由编译程序在建立处理过程中生成的部件为“真”。而对程序员人工生成的部件为“假”,提供合成部件是使编译程序生成与系统设定语言元素对应的部件,系统设置语言元素是需要的,但其不必由程序员直接生成,实际上有可能将“合成”属性从“真”改为“假”,例如当一个合成的部件被人工编辑时,但从“假”到“真”的反向改变是绝不允许的,合成部件通常没有特性“界面”或“实施”,但无论在何种情况下,合成部件使“界面”和“实施建立状态”被编译。
类别每一部件都有一“类别”(Kind),一个类别是指用来把部件分为例如共享同样特性或同样语言专用行为的各个组的一个文本串。大部分类别是专用于一种特定的计算机语言并用于指定语义区别语言元素。
然而,有一些由系统定义的类别,它们分别为“项目”,“库”,以及“贮存器”,这些类别只用于不可建立部件。类别“项目”是“项目”部件的类别。类别“库”则是用于连接到目标码的一个外部块(例如一个共享库或应用程序)的部件集。类别“贮存器”则应用于把其他分量分组归类以便组织的部件。实际上,类别通常在内部由数字表示。
图3提供了包括一组部件31的程序的概念表达,每个部件由一组特性组成,这组特性分为两部分,即称为界面的外部可见(公开)部分31l以及实施(专用)部分312。如图3所示,部件只依赖于另一部件的界面,在一个项目中的所有部件被组织成树结构,其底部为根部件32(称为项目部件)。本技术领域的一般技术人员可知,部件不必本身包含实体,但可以包括指向实际代码的存储位置的指针。然而,这一树结构表达用于展示程序的结构,因此,类似的树结构表示被用于其后所述的用户屏幕之一。
图4是一框图,示出了本发明的三个主要功能程序。它们是数据库41,编译程序42,以及建立处理43。数据库41包括一组部件,图中所示为一个项目部件411和一个可建立部件集412,该可建立部件集412被设计为将被建立的一个程序。编译程序42计算数据库41中部件的相关性,建立处理43利用部件特性和编译程序生成的相关性来建立该程序。
程序员可用编辑程序44改变该程序,编辑程序必须可以生成和删除部件,尤其是剪裁,复制,粘贴和移动部件,编辑程序必须可以改变“界面”和“实施”特性中的数据,其方式通常是对文本直接进行修改。然而,其他更为结构化的途径(例如从选项屏进行选择)亦可采用。实际上,编辑程序44通常将包括多个编辑程序,每个用于每种“界面”或“实施”特性,或甚至可能为特性中的数据分区配置编辑程序。
寄存编辑改变的方法参见图5A到图5D,其中示出了与增量建立有关的编辑程序44所执行的逻辑功能流程图。对于可建立的非合成部件,“建立状态”被限为在建立处理之外的“编译”的值和“需要编译”值。若特性“界面”不存在,则“界面建立状态”是“编辑的”。若特性“实施”不存在,则“实施建立状态”是“编译的”。图5A中,展示了各种编辑状态变化。在500处,当系统标识了一个“生成部件”(Create Component),“再命名部件”(Rename Component),“粘贴部件”(Paste Component),或“编辑界面”(Edit Interface)命令时,控制去往功能框510对界面变化进行处理,该变化的详细逻辑示于图5B中。
图5B中,处理始于判别框511,在该处,进行测试以确定是否界面建立状态是否为“需要编译”,若是,则控制通过514进行继续编辑,这些动作发生在编辑而非再建立过程中,下一动作很可能是另一编辑动作。若否,则在功能框512处把界面建立状态设置成“需要编译”并因此更新界面变化表。然后,在功能框513处完成实施已改变和贮存器已改变的处理。实施已改变操作的细节示于图5C中而贮存器已改变的操作细节示于图5D中。
图5C示出了与实施已改变有关的详细处理,判别框571进行测试以确定是否实施建立状态已设定为“需要编译”。若是,控制通过572进行继续编辑,若否,则在功能框573处把实施建立状态设为等于“需要编译”且实施变化表被因此而更新。然后,控制通过574返回。
图5D示出了与贮存器改变操作有关的详细逻辑。功能框542处将进行测试以确定是否该贮存器可建立。若可以,则在功能框543处由部件的贮存器按图5B讨论的细节调用已改变“界面”,然后,控制通过544返回。
若“编辑实施”(Edit Implementation)命令在图5A的560处被检测到,则处理按照功能框570所示和图5C的讨论执行实施已改变的动作。
若在图5A的530处检测到“删除部件”(Delete Compo-nent)命令,则对于部件A的贮存器已改变处理起始于功能框540,其细节示于图5D中,然后,贮存器A被删除且控制由550返回。
若在图5A中的580处检测到一个“移动部件”(MoveComponent)命令,则部件A的贮存器已改变处理起始于功能框590并详细示于图5D中,然后,部件的贮存器被设定于等于新的贮存器,且对于部件A的界面已改变的处理详细示于图5B中,最后,处理由595返回。
确定一个建立的部件的方法在建立一个程序的过程中,“项目”部件维护改为编译表的专用引用表。有一个“界面编译表”和一个“实施编译表”。“项目”还维护一个叫做“内部错误表”的专用引用表。实际上,每个表可由不止一个表物理地表示,以提高效率。
图6展示的处理中,对于“项目”的“改变表”中的每个引用(如功能框601所示),从表的前部选中一个引用。若在表上有多个引用,处理由框602所示完成。若引用是一个界面,如在框603所判定的,则将该引用的复制放在“界面编译表”中并且在601继续处理之前,在功能框604处把“加客户”(Add Clients)功能调用到该引用。若其特性名不是“界面”,则其特性名为“实施”,如框605所示。此时,由判别框606进行测试以确定是否“在内部”(ISInLine)属性为真。若是,则将引用的复制放入“界面编译表”并在框601的处理继续之前在功能框607处从该引用中调用“加客户”功能。否则,其特性名肯定是“实施”且其“在内部”属性肯定为“假”,而且在框601的处理继续之前,该引用的复制由功能框608放在“实施编译表”中。
“生成编译表”功能的伪代码如下
<pre listing-type="program-listing"><![CDATA[  CreateCompileLists(){   for each A in ChangeList{   if(A.PropertyName==Interface){   InterfaceCompileList.Add(A);   AddClients(A);   }  else if(A.PropertyName==Implementation){   if(IsInLine==True){   InterfaceCompileList.Add(A);   AddClients(A);  }   else if(IsInLine==False){   ImplementationCompileIist.Add(A);   }   }   }  }]]></pre>
“加客户”功能对于参数中每个引用适当地引用客户检查引用,并在其“建立状态”被编译时,把该引用的“建立状态”设为“不确定”,把该引用的复制加到适当的“编译表”,并在该引用中调用“加客户”。这一处理称为生成“改变表”的“客户封闭(Client Closure)”。该“客户封闭”表示需要作为一个建立的结果而被再次编译的那些部件的子集。实际上,由建立过程的编译程序生成的相关性及变化用于避免在“客户封闭”中编译过多的部件。
以下是“加客户”的伪码功能<pre listing-type="program-listing"><![CDATA[  AddClients(A){  for each B in A.ClientList{  if(B.BuildState==Compiled){   B.SetBuildState(Uncertain);   if(B.PropertyName==Interface){  InterfaceCompileList.Add(B);  AddClients(B);   }   else if( B.PropertyName==Implementation){  ImplementationCompileList.Add(B);   AddClients(B);   }  } } }]]></pre>
处理“界面”的方法这是“建立”处理的第二阶段。对于“界面编译表”上的项而言,可能的“建立状态”是“编译的”、“被编译”,“需要编译”,“不确定”,“编译错误”或“不定错误”。“界面编译表”被处理直到它空了为止,如图7的流程图所示。处理始于701处,在该处,从“界面编译表”的前部选中一个引用。如果在表上没有更多的引用,便在框702处完成处理。若与该引用相关联的部件的界面“建立状态”是“编译的”,“编译错误”或“不确定错误”,如框703所示,则从表的前部去除该引用并且在框701中继续处理。若与该引用相关的部件的界面“建立状态”是“被编译”或“需要编译”,如框704所示,则部件的“建立状态”在框705中被设置为“被编译”。然后,在部件的“界面”调用“编译”功能(它调用编译程序42)。该功能将返回到“异常中止”值,“完成”值和“错误”值之一。若在框70%处返回“异常中止”值,则部件的“界面建立状态”被设为“编译的”且处理在框701处继续之前,在框708处将把引用从表的前部去除掉。若返回的值是框709处的“错误”,则该部件的“界面建立状态”设定为“编译错误”,则从表的前部去掉该引用,并在701处继续处理之前,在功能框710中的部件中调用“传播错误”功能。若与该引用相关联的“界面建立状态”为“不确定”,如框711所示,则该部件的“建立状态”在功能框712处设为“被编译”。然后在该部件的“界面”上调用“有条件地编译”功能(可以调用也可以不调用编译程序42)。该功能也返回到“异常中止”值,“完成”值和“错误”值之一。若返回到“异常中止”值,则在步骤701处的处理继续进行。若返回到框713处的“完成”值,则在功能框708中从表的痈部去掉该引用并继续进行框701处的处理。若返回框714处的“错误”值,则从表的前部去掉该引用并在框701的处理继续进行之前,在功能框715中的部件里调用“传播错误”功能。
用于“处理界面”功能的伪码如下<pre listing-type="program-listing"><![CDATA[  ProcessInterfaces(){   until((A=InterfaceCompileList.First)==NIL){   state=A.BuildState;   if(A=Compiled_CompileError_Uncertainerror){  InterfaceCompileList.RemoveFirst();   }   else if(A=BeingCompiled_NeedToCompile){   A.SetBuildState(BeingCompiled);   value=Compile(A);   if(value==Abort){   continue;   }else if(value==Done){   A.SetBuildState(Compiled);   InterfaceCompileList.RemoveFirst();  }  else if(value==Error){   A.SetBuildState(CompileError);   InterfaceCompileList.RemoveFirst();   PropagateError(A);  } }  else if(A=Uncertain){   A.SetBuildState(BeingCompiled);   Value=ConditionallyCompile(A);   if(value==Abort){   continue;  }  else if(value==Done){   A.SetBuildState(Compiled);   InterfaceCompileList.RemoveFirst();  }  else if(value==Error){   A.SetBuildState(UncertainError);   InterfaceCompileList.RemoveFirst();   PropagateError(A); } } }}]]></pre>
功能“传播错误”把一个与部件对应的引用加到“项目”的“内部错误表”中并对部件的“客户”表中的每个引用执行如下若该引用的“建立状态”是“编译错误”或“不确定错误”,处理继续下一个引用。若该引用的“建立状态”是“需要编译”,处理把它的“建立状态”设为“编译错误”,把引用加到“内部错误表”,并在继续下一引用之前为引用调用“传播错误”。若引用的“建立状态”为“不确定”,则处理把其“建立状态”设到“不确定错误”,把引用加到“内部错误表”,并在继续下一引用之前在引用上调用“传播错误”。
“传播错误”功能的伪码如下<pre listing-type="program-listing"><![CDATA[  PropagateError(A){   for each B in A.ClientList{   state=B.BuildState;   if(state==CompileError_UncertainError){   continue;   }   else if(state==NeedToCompile){   B.SetBuildState(CompileError){   InternalErrorList.Add(B);   PropagateError(B);   }   else if(state==Uncertain){   B.SetBuildState(UncertainError);   InternalErrorList.Add(B);   PropagateError(B);  } } }]]></pre>
处理“实施”的方法这是“建立”处理的第三阶段。如图8的流程图所示,在“实施编译”表中的每个引用都被处理。该处理始于801处,在该处,从“实施编译表”的前部选中一个引用。若无更多的引用,在框802处完成处理。若该引用的“建立状态”为“不确定”,如框803所示,则在框801继续处理之前在功能框804中把“建立状态”设置为“编译的”。若该引用的“建立状态”是“需要编译”,如框805所示,则在功能框806处编译该部件。从编译程序42返回的值可能是“完成”和“错误”。若在框807处返回值是“完成”,则在框80l继续处理之前,在功能框804中把该引用的“建立状态”设为“编译的”。若在框808中返回的值为“错误”,则将该引用的“建立状态”设定为“编辑错误”并在框801继续处理之前,在功能框809的部件中调用“传播错误”功能。若该引用的“建立状态”是“编译错误”或“不确定错误”,将不作任何事情。注意“实施”的处理在这一阶段是顺序独立的,因为相关性只可以在其“在内部”属性是“真”而且已被处理过的“界面”或“实施”中。
“处理实施”的伪码如下
<pre listing-type="program-listing"><![CDATA[  ProcessImplementations(){   for each A in ImplementationCompileList{   state=A.BuildState;   if(A=Uncertain){  A.SetBuildState(Compiled);   }   else if(A=NeedToCompile){   value=Compile(A);   if(value==Done){   A.SetBuildState(Compiled);   }   else if(value==Error){  A.SetBuildState(CompileError);  PropagateError(A);   }   }   else if(A=CompileError_UncertainError){   }   }]]></pre>
支持“建立”处理的编译程序编译程序将通过“编译”功能而被调用,两者可作为同义词使用。编译程序42处理源文本,并标识可能的外部部件的名字。编辑程序下一步获取所有部件的引用表。该编辑程序可用语言专用知识(例如部件类别)从该表中删除引用。编译程序然后为文本中标识的每个外部部件调用“获得说明(Get Declaration)”功能。该“编译”功能在调用编译程序之前清除任何现存的错误。这也将清除任何来自特性“错误”的错误消息并从“项目”的“错误表”特性中去除任何引用。
编译程序首先调用“获得说明”功能,如图9的流程图所示。“获得说明”功能返回到“异常中止”值,“完成”值,“循环相关性”值或“错误”值的其中之一,并可返回该“说明”的数据。处理起始于框901,在该处,每个引用的“建立状态”被检查。若没有更多的引用要处理,便在框902处完成处理并返回。若该部件的“建立状态”在框903处为“编译的”,则功能返回到“完成”,如框904所示,而且在框901继续处理之前,存储的说明数据也被返回。若部件的“建立状态”在框905处示为“需要编辑”或“不确定”,则相应于该部件的引用在功能框906中被加到“界面编译表”的前部,并在框901继续其处理之前,该功能返回到功能框907的“异常中止”。“说明”数据在这一情况下不返回。若部件的“建立状态”为框908所示的“被编辑”,则在框901继续处理之前,功能将去往功能框909处的“循环相关性”。“说明”数据在这一情况下亦不返回。若部件的“建立状态”是框910所示的“编辑错误”或“不确定错误”,则在框901继续其处理之前,功能返回到功能框911的“错误”。在这种情况下亦无“说明”数据返回。
“获得说明”功能的伪码如下<pre listing-type="program-listing"><![CDATA[  value GetDeclaration(A,Declaration){   Declaration=NIL;   state=A.BuildState;   if(state==Compiled){  Declaration=CurrentDeclaration();  return(Done);  }  else if(state==NeedToCompile_Uncertain){   InterfaceCompileList.AddToFront(A);   return(Abort);  }  else if(state==BeingCompiled){   return(Circulardependency);  }  else if(state==CompileError_UncertainError){   return(Error);  }   }]]></pre>在调用“获得说明”功能之后,编译程序继续进行如下。若返回值为“异常中止”,则编译程序必须中止处理并返回“异常中止”值,一个替代实施方案是编译程序在编译了返回的部件之后中止编译,放弃或重新启动编译程序。这会要求编译程序再次进入。但不需要对上述的步骤作实质性的改变。若返回的值是“编译的”,则编译程序可继续其处理。若采用“说明”,则将构成“源引用相关性”,而且编译程序会追踪相关性及其性质。若返回值是“循环相关性”或“错误”,则编译程序必须中止处理,在部件上调用“设置错误(Set Error)”功能,并返回“错误”值。编译程序可以选择继续处理以便在结束之前可能发现更多的错误。
若对“获得说明”的调用返回“编译的”,则编译程序将以常规方式继续处理源文本。若在处理过程中遇到任何错误,编辑程序将调用部件的“设置错误”功能并返回“错误”值。若没有遇到错误,则编译程序返回“完成”值。若编译程序已经在对一个界面进行处理,则它将存贮该“说明”特性的新值。
处理“错误”的方法在编译程序被调用以处理一个“界面”或“实施”之前,清除所有现有的“错误”这将保证所有的错误消息被更新。由于“界面”和“实施”之间的内部相关性以及这样的事实,即错误是可传播的,所以将不可能在同一建立上在“界面”和“实施”上同时得到编译程序错误。
当编译程序遇到错误时,它调用传送关于错误的信息的功能“设置错误”,该信息包括错误的集合,以及返加错误部件的描述错误的消息,该信息存在“错误”特性和部件的适当源特性(“界面”或“实施”)之中。一个引用也存在由“项目”维护的,允许对所有错误进行方便的存取的总错误表中。
错误将传播到任意相关部件以便这些部件无需在其后被编译,因为已知道这些编译将会失败。进而,遇到错误后将继续建立并尽可能多的正确建立那些本身并无明显错误的部件或与错误部件有关联的部件。
“设置错误”功能获取由编辑程序42传给它的错误消息并在相应于适当特性(界面或实施)的部件的“错误”特性中生成一个入口。以这一方式生成的两个入口共享用一键,以致它们保持“连接”。这一功能通常还用一个“粘接标记(Sticky marker)”把错误的位置记录在程序源之中。该“粘接标记”在稍后的用户编辑过程中一直附属到字符的相同范围。
若编译程序成功地完成了源文本的处理,则其将产生目标码并将其传送给“连接程序”功能以便进行增量连接。或者,目标码可存到建立处理结束并以常规方式连接。
编译程序现在将更新部件的“源引用(SourceReference)”特性以及每个“源引用”的“客户”特性。对每一个引用,例如部件A的“源引用”特性中的部件B,将必须有一与部件B的“客户”特性中的部件A相对应的引用(它具有同样的相关性信息)。
编辑程序将生成一个“变化”以描述“说明”如何从其是前值改变的。编辑程序将在部件上调用“传播改变(Propa-gate Change)”功能并把计算出来的改变传播给该部件。该编译程序然后将设定“说明”的新值。“传播改变”功能与针对部件的“客户”表中的每个引用的相关性的变化相吻合。若该吻合指出引用的部件已为改变所影响且其“建立状态”不是“编译错误”或“不确定错误”,则其“建立状态”设为“需要编译”。
有可能要编译程序使用“设置错误”功能以发布告警消息或各种形式的建议。在这种情况下,若只有告警消息返回,则“编译”功能应返回到“完成”。告警消息将被加到“错误”特性且引用将被加到“项目错误表”特性。否则编译将被认为成功。适当的“建立状态”将被设置为“编辑的”,而将无错误被传播。若只发布了告警或建议,则程序将被完全地及正确地建立。
“有条件地编译”一个部件的处理图10A和10B示出了“有条件编译”功能的流程图,其中进行了引用。在部件A的“源引用”中的每个部件B在框1001处进行处理。若框1002处指出所有部件B均已被处理过,则对部件B的处理结束而处理去往图10B以编译部件A。若部件B的“建立状态”是“被编译”或“需要编译”,如框1003所示,则该部件的“建立状态”被设定为“被编译”且该部件在功能框1004中被编译。该编译功能可以返回“完成”值,“异常中止”值和“错误”值其中之一。若返回框1005的“完成”值,处理将继续在框1001处进行。
若返回值是框1006的“异常中止”,则功能中止且“异常中止”返回到框1007。若返回值是框1008中的“错误”,则原始部件的“建立状态”被设置为“不确定错误”,功能被停止且“错误”返回到功能框1009中。若部件B的“建立状态”是“不确定”,如框1010所示,则“建立状态”被设定为“被编译”且该部件在功能框1011中被有条件地编译。“有条件地编译”功能可以再次返回“完成”,“异常中止”或“错误”值之 一。若“完成”值返回框1005,处理在框1001处继续。若“错误”返回到框1012,部件的“建立状态”被设为“不确定错误”,从“界面编译表”中去除部件A,并在功能结束之前在功能框1014中调用“传播错误”功能。若返回框1015的“异常中止”,则在功能结束之前“异常中止”返回框1007。
现在再来看图10B,若所有引用已被处理过,则它们都使“建立状态”被“编译”。但是,“源引用”之一可能在处理进行到此处时已经把一个变化传播到部件,所以它的“建立状态”可以是“被编译”或“需要编译”。因此,部件A的“建立状态”在框1016中决定。若框1017处指出该“建立状态”是“需要编译”,则该“编译状态”被设定为“被编辑”且部件A在功能框1018中被编译。编译程序可返回到“错误”或“完成”。注意“异常中止”不会发生,因为所有的“源引用”都在这一阶段被编译了。若“错误”返回到框1019,则“建立状态”设为“编译错误”而且“错误”去往功能框1020。若“完成”去往框1021,则“建立状态”设为“编译的”且“完成”去往框1023。若部件A的“建立状态”是“被编译的”,如框1024所示,则“建立状态”被设为“编译的”而且“完成”去往功能框1023。
“在条件地编译”功能的伪码如下<pre listing-type="program-listing"><![CDATA[  valie ConditionallyCompile(A){   for each B in A.SourceReference{   state=B.BuildState;   if(state==NeedToCompile_BeingCompiled){  B.SetBuildState(BeingCompiled);  valuie=Compile(B);  if(value==Done){   continue;  }  else if(valuie==Abort){   return(Abort);  }  else if(value==Error){   A.SetBuildState(UncertainError);   return(Error);   }   }   else if(state==Uncertain);  A.SetBuildState(BeingCompiled);  value=ConditionallyCompile(A);   if(value==Done){   continue;   }else if(value==Abort){   return(Abort);  }  else if(value==Error){   A.SetBuildState(UncertainError);   InterfaceCompileList.Remove(A);   PropagateError(A);  } }}state=A.BuildState;if(state==NeedToCompile){ A.SetBuildState(Being Compiled); value=Compile(A); if(value==Done){   A.SetBuildState(Compiled);   return(Done); } else if(value==Error){   A.SetBuildState(CompileError);   return(Error); } } A.SetBuildState(Compiled); return(Done);]]></pre>
后处理错误的方法后处理错误的方法是“建立”处理的第四阶段。若在建立过程中发生了任何错误,则“后处理错误(Post ProcessingErrors)功能便在建立结束时被调用。对每个在“内部错误表”中的引用而言,若引用的“建立状态”是“编译错误”,则“建立状态”改变成“需要编译”。若引用的“建立状态”是“不确定错误”,则“建立状态”变为“编译的”。
当所有在“内部错误表”上的引用已修理完毕后,该表的所有入口被清除。为便于程序员,将在“项目”的“错误表”上开一个视窗或测览窗。
“后处理错误”功能的伪码如下<pre listing-type="program-listing"><![CDATA[  PostProcessErrors(){   for each A in InternalErrorList{   state=A.BuildState;   if(state==CompileError){  A.SetBuildState(NeedToCompile);   }   else if(state==UncertainError){  A.SetBuildState(Compiled);   }  }   InternalErrorList.ClearAll();   if(ErrorList.Count!=0){   OpenErrorWindow(); } }]]></pre>
虽然本发明以实施例的方式叙述了本发明,但一般技术人员可在发明的原理下对本发明进行修改和变型,本发明的范围受权利要求的保护。
权利要求
1一种用于建立计算机程序的方法,其特征在于包括以下步骤(a)将计算机程序作为部件集来设计;(b)在存储器中存储上述部件;(c)访问所存储的部件并计算与每个部件有关的相关性从而产生相关性表;以及(d)根据该相关性表对部件进行编译以建立该计算机程序。
2权利要求1所述的方法,包括以下步骤(a)进行编辑以便生成,改变或删除部件以及;(b)在变化表中存储部件的编辑改变。
3权利要求2所述的方法,其中部件具有“建立状态”值,该值表示基于变化表中编辑变化的部件的状态。
4权利要求3所述的方法,包括对变化表进行处理以确定建立操作的可能部件的步骤。
5权利要求4所述的方法,包括在编译中存储每个变化表项以及当变化表项被加到编译表时对变化表项进行处理以便标识从属于改变的部件的部件并把该从属部件加入到编译表的步骤。
6权利要求5所述的方法,包括用“未确定”值增加从属部件的步骤。
7权利要求5所述的方法,包括对加入到编译表的每项进行循环处理之步骤。
8权利要求1所述的方法,其中每个部件由一组特性组成,该组特性分为称做“界面”的公开部分和称为“实施”的专用部分,部件的相关性只与“界面”部分相关联,维护一个相关性表的步骤分别由维护部件的公开和专用部分的一个“界面编译表”和一个“实施编译表”而完成。
9权利要求8所述的方法,其中的编译步骤通过对在“实施编译表”中引用的部件进行编译之前,首先对“界面编译表”中引用的部件进行编译的予以实现。
10权利要求9所述的方法,其中的部件有“建立状态”值,在“界面编译表”上的“建立状态”值包括“被编译”,“需要编译”或“不确定”,对于在“界面编译表”上的每个引用,该方法包括以下步骤若“建立状态”值是“被编译”或“需要编译”则将“建立状态”设为“被编译”并然后编译该部件;若“建立状态”值是“不确定”,则将“建立状态”值设为“被编译”并然后有条件地编译该部件。
11权利要求10所述的方法,其中,若编译程序成功地编译了部件,则在处理下一部件之前执行把部件的“建立状态”值设定为“编译的”步骤。
12权利要求10所述的方法,其中,若编译程序返回“异常中止”值,则处理下一部件。
13权利要求10所述的方法,其中,若编译程序在编译步骤中返回到“错误”值,则将该部件的“建立状态”值设置为“编译错误”并在处理下一部件之前把引用加到所述项目部件中的错误表中。
14权利要求10所述的方法,其中,若编译程序返回“错误”值,则将该部件的“建立状态”值设置为“不确定错误”,并在处理下一部件之前把一个引用加到所述项目部件中的错误表中。
15权利要求10所述的方法,其中,若编译程序编译了该部件,则执行以下步骤在处理下一部件之前,把该部件的“建立状态”值设置成“编译的”,但若该编译程序返回“异常中止”值,则在处理下一部件之前,把部件的“建立状态”值设置为“编译错误”并把引用加到所述项目部件中的错误表中,但若该编译程序返回“错误”值,则在处理下一部件之前,将部件的“建立状态”值设为“不确定错误”并把引用加到所述项目部件中的错误表中。
16权利要求10所述的方法,其中,在“实施编译表”上的“建立状态”值是“需要编译”,或“不确定”,对于在“实施编译表”上的每个引用,该方法包括以下步骤(a)若“建立状态”值是“需要编译”,则为“建立状态”设置为“被编译”并然后编译该部件以及(b)若“建立状态”是“不确定”,则在处理下一部件之前将“建立状态”值设置为“编译的”。
17权利要求14所述的方法,其中,若编译程序在所述编译步骤中成功地编译了该部件,则还执行在处理下一部件之前把该部件的“建立状态”值设置为“编译的”的步骤。
18权利要求14所述的方法,其中,若该编译程序在编译步骤中返回值“错误”,则在处理下一部件之前把该部件的“建立状态”值设置为“编译错误”并把引用加到所述项目部件中的错误表中。
19权利要求14所述的方法,其中,若编译程序成功地编译了该部件,则执行以下步骤在处理下一部件之前,将部件的“建立状态”值设置成“编译的”。若编译程序在编译步骤中返回“错误”值,则在处理下一部件之前,将该部件的“建立状态”值设置成“编译错误”并把引用加到所述项目部件中的错误表中。
20权利要求14所述的方法,其中,对所述变化表中的每个部件而言,若“界面”部分已被改变,则部件被加到“界面编译表”中,若“实施”部分已被改变且该改变可以影响其他部件,则该部件被加到“界面编译表”中,否则,该部件被加到“实施编译表”中。
21权利要求19所述的方法,其中,若编译程序在编译步骤或有条件的编译步骤中成功地编译了该引用,则对下一引用进行处理直到所有引用被处理。
22一种用于建立计算机程序的方法,包括以下步骤(a)将计算机程序作为部件集来进生成;(b)在存储器中存储所述部件;(c)访问所存储的部件并计算与每个部件关联的相关性,从而产生相关性表;(d)编译部件并检测部件的至少一个名字;(e)查询说明数据库以确定部件说明的至少一个名字;以及(f)确定该部件说明的状态。
23权利要求22所述的方法,包括当状态被标明为编译的状态时,利用部件说明的状态继续进行编译的步骤。
24权利要求22所述的方法,包括当状态被标明为错误状态时,返回错误值并停止处理该部件说明的现行部件状态的步骤。
25权利要求22所述的方法,包括在状态被标明为异常中止状态时,返回异常中止值并停止处理部件说明的现行部件状态的步骤。
26权利要求22所述的方法,其中查询说明数据库以确定部件说明的至少一个名字的步骤包括以下步骤(a)确定该部件的状态是否编译的;以及(b)若该状态是编译的,返回该编译的说明和相关的编译状态。
27权利要求26所述的方法,包括如果编译状态被断言为错误时就返回错误的编译状态的步骤。
28权利要求22所述的方法,包括以下步骤(a)确定部件的状态是不确定还是需要编译;以及(b)把部件作为在编译表上的第一项进行存储,并返回到异常中止状态。
29一种用于建立计算机程序的系统,其特征在于包括(a)将计算机程序作为部件集来设计的装置;(b)在存储器中存储所述部件的装置;(c)访问所存储的部件并计算与每个部件相关的相关性以产生相关性表的装置;以及(d)根据相关性表编译部件以建立计算机程序的装置。
30权利要求29所述的系统,包括(a)进行编辑以便生成,改变或删除部件的装置;以及(b)在改变表中存储部件的编辑改变的装置。
31权利要求30所述的装置,其中,部件具有“建立状态”值,该值标明了基于该变化表中的编辑改变的部件的状态。
32权利要求31所述的系统,还包括对变化表进行处理以确定建立操作的可能部件的装置。
33权利要求32所述的系统,还包括在编译表中存储每个变化表项以及当变化表项被加到编译表时对变化表项进行处理以便标识从属于改变的部件的部件并把该从属的部件加入到编译表的装置。
34权利要求33所述的系统,包括有“不确定”值增加从属部件的装置。
35权利要求33所述的系统,包括对加入到编译表的每项进行循环处理的装置。
36权利要求29所述的系统,其中每个部件由一组分为称做(“界面”)的和称做(“实施”)专用部分的特性所组成,部件的相关性只与“界面”部分相关。通过对部件的公开部分和专用部分分别维护“界面编译表”和“实施编译表”而完成了对相关性表的维护。
全文摘要
一个面向人的目标编程系统为计算机程序的增量建立提供了交互和动态的处理,该处理简化的操作系统及有图形用户界面的大应用程序分类的复杂计算机程序的开发,程序被作为称为部件的单元集进行设计所成型,部件表示一个象分类或功能之类的可编译语言元素,三个主要的功能程序是数据库,编译程序和建立处理。
文档编号G06F9/44GK1105802SQ94190017
公开日1995年7月26日 申请日期1994年1月3日 优先权日1993年6月28日
发明者彼得·约瑟夫·麦金内尔尼, 比尔·吉本斯 申请人:塔里根特公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1