專利名稱:增量建立系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)輔助軟件工程(CASE),尤其涉及面向人的目標(biāo)編程系統(tǒng)(HOOPS),該系統(tǒng)為計(jì)算機(jī)程序建立提供了交互和動(dòng)態(tài)環(huán)境。本發(fā)明使程序員得以由開(kāi)發(fā)復(fù)雜程序(例如操作系統(tǒng)軟件及具有圖形用戶界面(GUI)的大的應(yīng)用程序)時(shí)極為有用的優(yōu)化增量編譯程序?qū)ξ⑿〉念w粒源碼進(jìn)行編輯。通過(guò)使用通用的面向目標(biāo)編程(OOP)語(yǔ)言C++的最佳實(shí)施例來(lái)公開(kāi)本發(fā)明,但其原理適用于面向目標(biāo)以及過(guò)程的計(jì)算機(jī)編程語(yǔ)言,本發(fā)明亦可用于建立使用常規(guī)的和OOP語(yǔ)言的程序。
OOP是建立用戶友好、智能化計(jì)算機(jī)軟件的最佳環(huán)境。OOP的關(guān)鍵元素是數(shù)據(jù)密封(data encapsulation),繼承(inheri-tance)以及多形性(Polymorphism),其中,數(shù)據(jù)密封是指在面向目標(biāo)的編程中,一個(gè)目標(biāo)的屬性和性能被保護(hù)而不被其他目標(biāo)直接存取;繼承則是指在面向目標(biāo)的編程中,目標(biāo)的一個(gè)分類可以被定義為一個(gè)一般分類的特例,但自動(dòng)包括該一般分類的方法及變量定義;而多形性則指面向目標(biāo)的編程中,通過(guò)繼承而關(guān)聯(lián)的不同分類的目標(biāo)唯一地響應(yīng)同一成員功能調(diào)用。這些元素可以用于產(chǎn)生GUI,尤其是由具有圖符,鼠標(biāo)光標(biāo)以及選擇屏的視窗環(huán)境所構(gòu)成的GUI。雖然這三種關(guān)鍵元素在OOP語(yǔ)言中很常見(jiàn),但大部分OOP語(yǔ)言在實(shí)施它們時(shí)有很大的區(qū)別。
OOP語(yǔ)言的例子包括Smalltalk、Object Pascal和C++、Smalltalk實(shí)際上不止是一種語(yǔ)言,更準(zhǔn)確地講,它應(yīng)該被標(biāo)識(shí)為一種編程環(huán)境。該語(yǔ)言是在70年代早期內(nèi)位于施樂(lè)普拉阿圖研究中心(PARC)的學(xué)習(xí)研究小組開(kāi)發(fā)的。在該語(yǔ)言中,一個(gè)消息被送到一個(gè)目標(biāo)以對(duì)目標(biāo)本身進(jìn)行評(píng)價(jià)。消息完成的任務(wù)類似于在常規(guī)編程語(yǔ)言中的功能調(diào)用,程序員無(wú)需關(guān)心數(shù)據(jù)類型而只須關(guān)心生成正確順序的消息及使用正確的消息。Pascal是用于蘋果公司的Macintosh計(jì)算機(jī)上的語(yǔ)言,蘋果公司在Pascal語(yǔ)言的設(shè)計(jì)者-尼古拉期·沃斯(Niklaus Wirth)一的合作下開(kāi)發(fā)出了0bject Pascal語(yǔ)言,C++則是由斯托斯特拉普(Bjarne Stroustrup)在1983年在AT&T貝爾實(shí)驗(yàn)室由C語(yǔ)言擴(kuò)展而成的。C++的主要概念是分類,它是用戶定義型的,分類提供了面向目標(biāo)的編程特性。C++模型與C模型相兼容而且可隨意連接,從而現(xiàn)有的C程序庫(kù)可由C++程序所用。最廣泛使用的基于目標(biāo)和面向目標(biāo)的編程語(yǔ)言源于60年代由挪威的戴沃(O-J·Dahl),梅阿漢(B·Myhrhaug)以及耐格得(K·Nygard)所開(kāi)發(fā)的Simula語(yǔ)言。有關(guān)OOP的信息可參見(jiàn)布克(GradyBooch)所著的“Object Oriented Design With Applications”(Ben-jimin/Cummings Publishing Co.,I nc.,Redwood City,Califormia(1991)。
運(yùn)行一個(gè)計(jì)算機(jī)程序的完整過(guò)程涉及把程序員寫出的源碼譯為機(jī)器可執(zhí)行的格式,通常稱為目標(biāo)碼,然后再執(zhí)行該目標(biāo)碼翻譯的過(guò)程是由編譯程序或解釋程序完成。在解釋程序中,翻譯是隨程序的運(yùn)行而進(jìn)行的;而在編譯程序中,則是在運(yùn)行該程序之前就進(jìn)行翻譯并將結(jié)果作為目標(biāo)碼存貯起來(lái)。也就是說(shuō)在一般的編譯和執(zhí)行系統(tǒng)中,翻譯和執(zhí)行是分開(kāi)進(jìn)行的。即編譯只進(jìn)行一次。而在解釋系統(tǒng)中,例如Smalltalk解釋程序,兩者是順序進(jìn)行。Smalltalk需要解釋程序是因?yàn)橹钡揭粋€(gè)目標(biāo)被實(shí)現(xiàn)之前編程環(huán)境不允許設(shè)定專用寄存器或地址空間。
一個(gè)編譯程序包括三部分;詞法分析程序,語(yǔ)法分析程序,以及代碼生成程序。詞法分析程序的輸入是代表高級(jí)語(yǔ)言程序的一序列字符。詞法分析程序?qū)⒃撔蛄凶址譃橐恍蛄袠?biāo)記以輸入到語(yǔ)法分析程序、語(yǔ)法分析程序進(jìn)而將該序列標(biāo)記分為指令并利用語(yǔ)法規(guī)則的數(shù)據(jù)庫(kù)來(lái)確定每條指令的語(yǔ)法是否正確。若不正確,則產(chǎn)生錯(cuò)誤消息。若正確,則指令被分解為一序列基本指令。這些基本指令被送至代碼生成程序以產(chǎn)生低級(jí)語(yǔ)言。代碼生成程序本身通常又分為三部分;中間代碼生成,代碼優(yōu)化,以及代碼生成,代碼生成程序接收來(lái)自語(yǔ)法分析程序的輸出并生成機(jī)器語(yǔ)言碼。
為有助于軟件開(kāi)發(fā),增量編譯程序已被開(kāi)發(fā),在這類程序中,編譯程序在批處理操作中生成用于接收的一條語(yǔ)句或一組語(yǔ)句的代碼,而與稍后生成的用于其他語(yǔ)句的代碼無(wú)關(guān)。增量編譯的優(yōu)點(diǎn)在于代碼可以在部分程序?qū)懗蓵r(shí)即進(jìn)行編譯和測(cè)試,而無(wú)需等到整個(gè)程序完成時(shí)才進(jìn)行調(diào)試處理。但是,常規(guī)的增量編譯程序必須每次都對(duì)一個(gè)完整的模塊進(jìn)行再處理。
優(yōu)化編譯程序產(chǎn)生高度優(yōu)化的目標(biāo)碼,從而在許多情況下使得在源級(jí)進(jìn)行調(diào)試比一個(gè)非優(yōu)化編譯程序更困難。這一問(wèn)題源于這一事實(shí),即雖然一個(gè)例行程序?qū)⒈痪幾g以給出適當(dāng)?shù)拇鸢福?jì)算該答案的正確方式可能與源碼中描述的大相徑庭。優(yōu)化編譯程序可以做的一些事情包括刪除已知不會(huì)影響最終結(jié)果的代碼或重量,將非變量代碼移出循環(huán),合成出用碼,在變量不再需要時(shí)重新使用分配給這些變量的寄存器等等。如此,源碼到目標(biāo)碼或目標(biāo)碼到源碼的映射在給定某些優(yōu)化時(shí)可能會(huì)有困難。由于變量的值可能并非在例行程序中任意位置處總是可用的,所以可能班于校驗(yàn)變量的值。在優(yōu)化代碼中修改變量值尤為困難。除非專門說(shuō)明為易失的,否則編譯程序會(huì)“記住”分配給變量的值并可能在以后的代碼中不再讀該變量而使用“已知”的值。因此,在該值中的改變產(chǎn)生了錯(cuò)誤的程序結(jié)果。
雖然在先有技術(shù)的計(jì)算機(jī)程序建立,測(cè)試及開(kāi)發(fā)中有許多優(yōu)點(diǎn),但已知的軟件開(kāi)發(fā)工具仍給程序員帶來(lái)極大負(fù)擔(dān),從而通常要求有直覺(jué)的洞悉力。其次,常規(guī)的面向批處理的編程系統(tǒng)需要很長(zhǎng)的編輯——編譯——測(cè)試周期。這對(duì)編程的創(chuàng)造性行為帶來(lái)的極大的不利影響。
因此,本發(fā)明的一個(gè)目的是提供一種用于使程序員有高效率的工作的計(jì)算機(jī)程序建立的面向人的交互動(dòng)態(tài)處理。本發(fā)明的目的還包括提供一種將程序建立所需的編輯——編譯——測(cè)試周期縮至最短的自動(dòng)程序建立操作。
根據(jù)本發(fā)明,程序建立可由增量程序模型(稱為項(xiàng)目Project)和三個(gè)主要的功能程序相互作用而成。一個(gè)程序被作為語(yǔ)義單元來(lái)建立,語(yǔ)義單元被稱之為部件并由稱為特性的命名數(shù)據(jù)項(xiàng)目表構(gòu)成。不是象常規(guī)系統(tǒng)那樣把程序作為一個(gè)松散的文件集存儲(chǔ)起來(lái),本發(fā)明的面向人的目標(biāo)編程系統(tǒng)把項(xiàng)目中有關(guān)程序的所有信息存起來(lái)。
在本發(fā)明的實(shí)施中,一個(gè)計(jì)算機(jī)程序被作為一個(gè)項(xiàng)目部件和一個(gè)可建立部件集來(lái)建立,每一個(gè)都代表一個(gè)可編譯的語(yǔ)言元素并定義了一個(gè)增量級(jí)。提供計(jì)算機(jī)程序模型的部件被存起來(lái)以便在建立過(guò)程中進(jìn)行存取。存儲(chǔ)的部件被依序存取并由一個(gè)編譯程序計(jì)算與一個(gè)部件的相關(guān)性,從而開(kāi)發(fā)客戶和參照表。最后,用部件的特性和編譯程序產(chǎn)生的相關(guān)性對(duì)部件進(jìn)行編譯以建立計(jì)算機(jī)程序。
本發(fā)明的最佳實(shí)施例是以C++書(shū)寫的并用來(lái)建立C++、C以及匯編語(yǔ)言的程序,這些語(yǔ)言是當(dāng)前最流行的。本發(fā)明的程序建立一般可用這三種語(yǔ)言完成。雖然本發(fā)明本身是以面向目標(biāo)的編程語(yǔ)言寫成的面向目標(biāo)的程序,但其并不僅限于以面向目標(biāo)的程序語(yǔ)言建立程序。本發(fā)明可同樣用于以過(guò)程語(yǔ)言建立程序。進(jìn)而,本發(fā)明不限于C++語(yǔ)言,它也可由其他編程語(yǔ)言實(shí)現(xiàn)。而且本發(fā)明的原理可用于更為一般應(yīng)用的面向人的目標(biāo)編程系統(tǒng)。
上述目的,優(yōu)點(diǎn)可從本發(fā)明的詳細(xì)敘述以及附圖中有更好的理解。其中,
圖1展示了一種可以支持高分辨率圖形顯示設(shè)備和光標(biāo)指示設(shè)備(例如鼠標(biāo)器)的常規(guī)計(jì)算機(jī)系統(tǒng),本發(fā)明即可在該系統(tǒng)上實(shí)施;圖2是圖1所示計(jì)算機(jī)系統(tǒng)的主要部件框圖;圖3是構(gòu)成一個(gè)程序的部件集的概念形式框圖;圖4是本發(fā)明的原理功能程序框圖;圖5A到圖5D為通過(guò)建立狀態(tài)(Build State)寄存編輯變化的邏輯流程圖;圖6是根據(jù)本發(fā)明在建立處理操作的第一階段確定可能的部件的邏輯流程圖;圖7是根據(jù)本發(fā)明在建立處理操作的第二階段處理界面的邏輯流程圖;圖8是根據(jù)本發(fā)明在建立處理操作的第三階段處理實(shí)施的邏輯流程圖;圖9是根據(jù)本發(fā)明由編譯程序調(diào)用的獲取說(shuō)明(GetDec-laration)功能的邏輯流程圖;圖10A和10B展示了有條件地編譯功能(CorditionallyCompile funetion)的邏輯流程圖;在根據(jù)本發(fā)明的面向人的目標(biāo)編程系統(tǒng)(HOOPS)中,部件是增量編譯的顆粒,即一個(gè)部件表示一個(gè)可編譯的語(yǔ)言元素,例如一個(gè)分類或功能,一個(gè)部件由一組特性組成。該組特性分為外部可見(jiàn)(或公開(kāi))部分,稱為界面(Interface)和實(shí)施(Implementation)(隱私)部分。這意味著一個(gè)部件僅可依賴于另一部件的界面,一個(gè)項(xiàng)目中的所有部件被組合成為一個(gè)樹(shù)結(jié)構(gòu),其底部為叫做項(xiàng)目部件的根部件。
三個(gè)主要功能程序是數(shù)據(jù)庫(kù),編譯程序及建立處理(build mechanism)。數(shù)據(jù)庫(kù)持久地存儲(chǔ)和檢索部件以及其特性。而編譯程序則在編譯一個(gè)特性的源碼的同時(shí),負(fù)責(zé)計(jì)算與一個(gè)部件有關(guān)的相關(guān)性。建立處理則利用部件的特性以及編譯程序生成的相關(guān)性在建立處理過(guò)程中正確有效地對(duì)部件的編譯進(jìn)行排序。建立處理在任何時(shí)候都對(duì)一個(gè)程序有全局的觀察。這與常規(guī)方式形成了鮮明對(duì)比。在常規(guī)方式中,程序由一組相互獨(dú)立編譯的文件所表示。在常規(guī)編譯環(huán)境中采用的文件把處理的特定順序施加于文件中包含的語(yǔ)義單元。
本發(fā)明的系統(tǒng)自動(dòng)追蹤部件中的編輯變化,包括是否在界面或?qū)崿F(xiàn)中的變化,這與只在文件級(jí)上進(jìn)行跟蹤的常規(guī)系統(tǒng)形成了對(duì)比。相關(guān)性分析自動(dòng)進(jìn)行且基于兩個(gè)部件之間的關(guān)系。本系統(tǒng)包括一個(gè)機(jī)制,它允許編譯程序記錄一個(gè)相關(guān)性存在的事實(shí)以及是哪種相關(guān)性。
這使得建立處理可以更準(zhǔn)確地確定哪個(gè)部件需要編譯,從而使本系統(tǒng)與對(duì)所有存在相關(guān)性的部件進(jìn)行再編譯而無(wú)論該再編譯是否需要的系統(tǒng)相比而更為有效。
常規(guī)的編譯程序利用編程環(huán)境中的軟件構(gòu)造工具(con-struction tool)來(lái)簡(jiǎn)化軟件生成。例如,在一般程序構(gòu)造中,通常是把總的程序分為模塊,模塊一般存在多個(gè)文件中,每個(gè)模塊可以不同方式進(jìn)行處理。一個(gè)Make命令用來(lái)管理和維護(hù)構(gòu)成計(jì)算機(jī)程序的模塊;也就是說(shuō),Make功能追蹤兩個(gè)程序模塊之間的關(guān)系,并且只發(fā)出需要使模塊在改變發(fā)生之后仍然一致的那些命令。然而,程序員必須要生成一個(gè)Makefile說(shuō)明以定義兩個(gè)模塊之間的關(guān)系(相關(guān)性)。對(duì)Makefile說(shuō)明的要求意味著程序員必須能決定何時(shí)發(fā)生相關(guān)并把同步相關(guān)性的負(fù)擔(dān)加到程序員身上。實(shí)際上,這通常意味著存在有不必要的相關(guān)性以及遺失必要的相關(guān)性,這兩者可能是在建立計(jì)算機(jī)程序過(guò)程中的錯(cuò)誤源。
與Make功能相比,本發(fā)明的建立處理不同,它無(wú)須程序員生成象Makefile說(shuō)明之類的說(shuō)明,建立處理假設(shè)沒(méi)有相關(guān)性的預(yù)備知識(shí);實(shí)際上,它會(huì)“發(fā)現(xiàn)”部件的相關(guān)性并追蹤相關(guān)性。這意味著建立處理將在沒(méi)有先有相關(guān)信息時(shí)從擦除中建立一個(gè)程序。在建立操作開(kāi)始階段,所有部件列在一個(gè)變化表中。將試圖對(duì)變化表上的部件進(jìn)行編譯,但若編譯是由另一部件的編譯所決定時(shí),第一個(gè)部件的編譯或者被中止,或者被暫停,而且第二個(gè)部件的編譯會(huì)試著開(kāi)始,如此直到找到一個(gè)可以編譯的部件。然后,建立處理利用任何在該處理中先前產(chǎn)生的信息經(jīng)由早先暫?;蛑兄沟牟考祷剡M(jìn)行。
該建立處理對(duì)編譯排序以致所有界面(Interface)在任何實(shí)施(Implementation)之前被編譯。這樣便減少了可能的交叉相關(guān)性數(shù)目而且因此增加效率。建立處理利用有限狀態(tài)機(jī)的形式控制部件處理并有助于通過(guò)把部件的中止或暫停編譯減至最少的方式保證部件處理的正確排序。
在變化發(fā)生(編輯一個(gè)部件或加入、刪除一個(gè)部件)之后的建立操作與起始建立操作相似,其不同之處只在于變化表只包括已經(jīng)改變的那些部件,建立處理使用以前開(kāi)發(fā)的客戶以及源參照表來(lái)只對(duì)需要再編譯的那些部件進(jìn)行再編譯。由本發(fā)明實(shí)現(xiàn)的功能級(jí)增量編譯極大地減少了編程變化到測(cè)試的長(zhǎng)周期,這是因?yàn)橹挥泻苌僖徊糠殖绦驅(qū)⒈辉俳ⅰ?br>
本程序模型提供了一種存儲(chǔ)和再使用用于界面的內(nèi)部處理的格式(稱為說(shuō)明特性(Declaration property)。本編譯程序存儲(chǔ)界面的處理過(guò)的內(nèi)部格式從而可以在編譯一些其他部件時(shí)更有效地使用它。這與常規(guī)系統(tǒng)相反,在常規(guī)系統(tǒng)中,所用的界面包括在每個(gè)使用的文件中而且每次編譯程序都對(duì)界面進(jìn)行再處理成為內(nèi)部格式。此外,部件和特征的程序模塊提供了一種很自然的方法來(lái)存儲(chǔ)與特定部件密切相關(guān)的信息。該信息可為程序員直接使用,亦可由其它工具間接使用。在常規(guī)系統(tǒng)中,這類數(shù)據(jù)或者在編譯結(jié)束時(shí)被遺忘了,或者只是很松散地與程序源相關(guān)聯(lián)。
錯(cuò)誤處理使建立處理避免對(duì)與錯(cuò)誤部件有關(guān)的部件進(jìn)行編譯。建立處理將正確地建立盡可能多的項(xiàng)目。這兩者與通常停下在第一個(gè)錯(cuò)誤文件或即使進(jìn)行進(jìn)一步處理,也會(huì)重復(fù)處理包括錯(cuò)誤的文件的常規(guī)系統(tǒng)相比較,是完全不同的,錯(cuò)誤處理使編譯程序發(fā)出告警消息而不致使特定部件被錯(cuò)誤地處理。這一處理可在發(fā)出告警消息時(shí)仍然建立正確的程序。
硬件平臺(tái)參照?qǐng)D1,示出了一個(gè)常規(guī)計(jì)算機(jī)10。該計(jì)算機(jī)10包括一系統(tǒng)單元12,一個(gè)多分辨率顯示設(shè)備14,例如一個(gè)陰極射線管(CRT),或者一個(gè)液晶顯示器(LCD)。顯示的類型并不重要,除非要求用于顯示視窗系統(tǒng),尤其是圖形用戶界面時(shí)需要高分辨率,用戶對(duì)計(jì)算機(jī)的輸入由鍵盤16以及光標(biāo)指示設(shè)備,例如鼠標(biāo)器18完成,鼠標(biāo)器18可連到系統(tǒng)單元12的一個(gè)專用或串行口。圖1所示的計(jì)算機(jī)是AppleMachintosh(蘋果計(jì)算機(jī)的注冊(cè)商標(biāo))及IBM PS/2。其他機(jī)型包括各種工作站,例如IBM RISC System/6000以及SunMicrosystems計(jì)算機(jī)。
圖2展示了圖1所示計(jì)算機(jī)的基本部件,系統(tǒng)單元12包括連到總線24上的一個(gè)中央處理單元(CPO)21,隨機(jī)存取存儲(chǔ)器(RAM)22,以及只讀存儲(chǔ)器(ROU)23。CPU21可以是任何商業(yè)化的微處理器,例如Motorola 68030和68040(它們通常用于Apple Machintosh計(jì)算機(jī)中)或Intel 8038及80486(它們通常用在IBM PS/2計(jì)算機(jī)中)。其他微處理器,例如RISC(用于精簡(jiǎn)指全集計(jì)算機(jī))微處理器(通常用于工作站)也可使用。ROM24存儲(chǔ)用于CPU的基本微碼,包括基本輸入/輸出系統(tǒng)(BIOS)。計(jì)算機(jī)系統(tǒng)10的操作系統(tǒng)(OS)也可存在于ROM24中,或者把OS作為初始程序裝入(IPL)的一部分存入RAM22中。RAM22也用于存儲(chǔ)部分應(yīng)用程序以及執(zhí)行該程序過(guò)程中生成的臨時(shí)數(shù)據(jù)。總線24可以是Apple NuBus,IBM MicroChannel或工業(yè)標(biāo)準(zhǔn)之一的總線,例如ISA(工業(yè)標(biāo)準(zhǔn)適配器)或EISA(擴(kuò)展的工業(yè)標(biāo)準(zhǔn)適配器)。
與總線24相連的還有多個(gè)輸入/輸出(I/O)適配器,包括一個(gè)用戶接口適配器25以及一個(gè)I/O適配器26。鍵盤16與用戶接口適配器25相連,而I/O適配器26與軟盤驅(qū)動(dòng)器27和硬盤驅(qū)動(dòng)器28相連。軟盤驅(qū)動(dòng)器27允許把數(shù)據(jù)和程序讀寫到可擦除介質(zhì),而硬盤驅(qū)動(dòng)器28通常存儲(chǔ)頁(yè)入頁(yè)出RAM22的數(shù)據(jù)和程序。顯示設(shè)備14通過(guò)顯示器適配器29而與總線24相連。通信適配器30為網(wǎng)絡(luò)提供接口。其他支持電路(未示出)為集成電路芯片,它們被連到總線24和/或CPU21。這些芯片包括例如控制總線24上的信息量的總線主控芯片??偩€24在某些計(jì)算機(jī)中可以是雙總線;數(shù)據(jù)總線和允許在圖形用戶界面中需要的高速顯示操作的顯示總線。
定義程序如在本發(fā)明的描述中所使用的那樣,一個(gè)HOOPS程序包括一個(gè)叫做“項(xiàng)目”的“不可建立部件”以及一個(gè)“可建立部件”集。不可建立部件亦可存儲(chǔ),但在本說(shuō)明書(shū)中,只要談到不合格的部件,就是指一個(gè)“可建立部件”,不可建立部件在建立操作中將不被編譯。
部件一個(gè)部件有一個(gè)唯一的標(biāo)識(shí)并被命名。不同的部件由稱為ID的不同形式的唯一標(biāo)識(shí)符加以區(qū)分。有一個(gè)稱為空ID(NullID)的區(qū)別ID,它不屬于部件。該ID在一個(gè)部件被生成時(shí)被賦予而且在該部件存在期間不會(huì)改變。若一個(gè)部件被刪除了,它的ID不會(huì)再被使用。在實(shí)際中,ID通常是數(shù)字的。
一個(gè)部件也有一個(gè)“名字”,它包括一串沒(méi)有白空格的文本。不同部件不必有不同名字。可以獲得包括所有部件的表(可能是空的),其中,所有部件的名字與某些給定文本串相吻合。一個(gè)部件的名字可以在部件存在期間被改變?nèi)我舛啻巍?br>
每個(gè)“可建立部件”與特定的計(jì)算機(jī)語(yǔ)言相關(guān)。實(shí)踐中,計(jì)算機(jī)語(yǔ)言通常由一串文本標(biāo)識(shí)。每一計(jì)算機(jī)語(yǔ)言有一個(gè)與其相關(guān)的編譯程序。在用該語(yǔ)言編譯任意部件時(shí)使用這一編譯程序。實(shí)際上,可能使一種給定的計(jì)算機(jī)語(yǔ)言與不止一個(gè)編譯程序相關(guān)聯(lián)。在本例中,部件必須記錄語(yǔ)言以及標(biāo)識(shí)該特定編譯程序的某些方式。
一種特定的語(yǔ)言有一與之相關(guān)的特定的部件種類集以及一特定的特性實(shí)施集,通??赡苊恳环N類都不同。如此,在一特定語(yǔ)言中的區(qū)別語(yǔ)義元素可以根據(jù)需要以不同方式進(jìn)行組合。
部件有“建立狀態(tài)(Build States)”?!敖顟B(tài)”是一個(gè)來(lái)自表“不可編譯”(Never Compile),“編譯的”(Compiled),“需要編譯”(Need To Compile),“不確定”(Uncertain),“正被編譯”(Being Compiled),“編譯錯(cuò)誤”(Compile Error),以及“不確定錯(cuò)誤”(Uncertain Error)的值。實(shí)際中,這些值通常是數(shù)字,每個(gè)部件有一對(duì)稱為“Interface Build State(界面建立狀態(tài))”和“Implementation Build State(實(shí)施建立狀態(tài))”的“建立狀態(tài)”。無(wú)論是可建立的或不可建立的,每個(gè)部件都有這兩個(gè)建立狀態(tài)。對(duì)不可建立的部件而言,這些建立狀態(tài)是都“不可編譯”的。
“建立狀態(tài)”可被存取和改變??梢园岩粋€(gè)部件的“建立狀態(tài)”設(shè)置到同一值并且不會(huì)導(dǎo)致任何影響。改變一個(gè)“建立狀態(tài)”可能很好地限定了副作用,例如改變同一部件或不同部件的另一特性的“建立狀態(tài)”,或者例如從諸如改變表或錯(cuò)誤表之類的某些表中加入或刪除引用。
部件用于表達(dá)語(yǔ)義語(yǔ)言元素。表達(dá)的方式取決于被設(shè)計(jì)的特定計(jì)算機(jī)語(yǔ)言。例如在C++中由部件表達(dá)的一部分語(yǔ)言元素包括全局?jǐn)?shù)據(jù),全局功能,分類,數(shù)據(jù)成員,成員功能,typedef,enums,仿真程序,宏指令,“或”運(yùn)算以及結(jié)構(gòu)。通常,每個(gè)語(yǔ)義元素將有一相關(guān)聯(lián)的區(qū)別種類。
特性一個(gè)部件包括一個(gè)命名的“特性”(Property)集。一個(gè)特性表示與該部件有關(guān)的一些數(shù)據(jù)。給定部件的ID和特性名之后,可以存取和檢索這些數(shù)據(jù)。特性名字通常由標(biāo)識(shí)名字的數(shù)字(有時(shí)稱為記號(hào))在內(nèi)部表示。也有不屬于特性的區(qū)別特性名,叫做“空特性”(Null Property)。
與一給定特性相關(guān)的數(shù)據(jù)對(duì)不同的部件而言是不同的。改變一個(gè)部件給定特性的數(shù)據(jù)并不意味著改變用于任何其他部件的同樣特性的數(shù)據(jù)。但是,有可能在一個(gè)部件的一個(gè)特性中的改變會(huì)導(dǎo)致同一或另一部件的另一特性的改變。
“引用(reference)”包括一個(gè)ID和一個(gè)特性名。一個(gè)引用唯一地標(biāo)識(shí)特定的部分特性數(shù)據(jù)。一個(gè)引用通常被松散地使用,就象它是部件和/或與之相關(guān)的特性。實(shí)際上,一個(gè)引用通常包含不在程序建立過(guò)程中直接使用的其他信息,從而標(biāo)識(shí)該特性中的哪種數(shù)據(jù)版本及哪種數(shù)據(jù)子節(jié)將被引用。
所有部件必須有特性“名字(Name)”和“貯存器(Contain-er)”,該特性“名字(Name)”存有部件的名字,特性“貯存器”則包含了特性名為“空特性”的一個(gè)引用,從任一部件開(kāi)始并相繼地由貯存器ID引用的部件取代前一部件將總是最終導(dǎo)致“項(xiàng)目部件”(Project Component)。該項(xiàng)目的“貯存器ID”是“空ID”(NulID)。如此,所有部件在項(xiàng)目中被描述。
建立特性(亦稱為部件建立表)以建立順序記錄最后建立中被正確編譯的特性表,相同的特性應(yīng)該在該表中最多實(shí)現(xiàn)一項(xiàng),建立特性用于測(cè)試和調(diào)試。
項(xiàng)目部件一個(gè)項(xiàng)目是一個(gè)還有特性“變化表(Changelist)”和“錯(cuò)誤表(Errorlist)”的部件。特性變化表是一個(gè)引用表,這些引用描述部件以及最后一次建立以來(lái)發(fā)生了改變的特性。實(shí)際上,“變化表”可以由某種可以在建立一個(gè)程序的過(guò)程中有效地存儲(chǔ)的多個(gè)表來(lái)表示,特性“錯(cuò)誤表”也是一個(gè)引用表,這些引用描述在最后程序建立過(guò)程中列為有錯(cuò)誤的部件,這些引用都有“錯(cuò)誤”特性,與每個(gè)引用相關(guān)的是一個(gè)數(shù)字鍵,它用于關(guān)聯(lián)特定的特性“錯(cuò)誤”以確定一個(gè)專用消息的設(shè)置以及部件特定特性的一個(gè)特定子范圍。
可建立部件一個(gè)可建立部件必須有這些特性“說(shuō)明”(Declaration),“目標(biāo)碼(Object code)”,“客戶(Clients)”,“源引用”(SourceReference),“錯(cuò)誤”亦可有這些特性“界面(Interface)”,“實(shí)施(Implementation)”,以及“成員(Members)。
特性“說(shuō)明”表示用于編譯程序的一個(gè)數(shù)據(jù)高速緩沖存儲(chǔ)器,它可能在部件已被編譯之前是空的。實(shí)際上,它可被認(rèn)為是編譯程序符號(hào)表的入口,盡管存儲(chǔ)的表示可能與編譯程序的內(nèi)部表示不同。
特性“目標(biāo)碼”表示了用于部件的可執(zhí)行碼,它可能在部件被編譯前是空的,或者由于沒(méi)有目標(biāo)碼與該部件相關(guān)而是空的。實(shí)際上,它通常提供一個(gè)手段指向被存在它處的實(shí)際碼。
特性“客戶”和“源引用”是一對(duì)集合,它們包括一個(gè)引用和一個(gè)“相關(guān)性(Dependency)”,一個(gè)相關(guān)性是一個(gè)變化表,變化可以表示為從一個(gè)有區(qū)別的有限表串中選取的一個(gè)文本串。一個(gè)稱為“公開(kāi)(Public)”的有區(qū)別的變化用來(lái)區(qū)分只在實(shí)施特性中對(duì)部件的引用,這與界面特性中的應(yīng)用相反,一個(gè)相關(guān)性可表示為一個(gè)位向量,其中若第n位數(shù)變化在表中表示,則該位向量的第n位為“1”,否則為“0”。
特性“錯(cuò)誤”包括一個(gè)三個(gè)一組的表,每一組包括一個(gè)“鍵”,一個(gè)特性名,以及一個(gè)消息,一個(gè)鍵即為一個(gè)數(shù)字標(biāo)識(shí)符,一個(gè)給定鍵在特定的特性“錯(cuò)誤”中在一個(gè)時(shí)刻只出現(xiàn)一項(xiàng),該特性名常是“界面”或“實(shí)施”,而消息則是文本或/和圖形的某些部分。
特性“界面”和“實(shí)施”表示部件的源文本,該源文本可作為記號(hào)而非文本存起來(lái)并在需要時(shí)以不同格式訪問(wèn),由這些特性表示的文本可通過(guò)編程環(huán)境中的人工編輯而予改變,一種可能性是把界面數(shù)據(jù)作為結(jié)構(gòu)區(qū)存起來(lái),而從結(jié)構(gòu)區(qū)中,源文本可按需要重新構(gòu)造。
特性“成員”是引用集(可能空的),每一引用用于“項(xiàng)目”中的每個(gè)部件,而“項(xiàng)目”將該部件作為其貯存器。
屬性一個(gè)部件有多個(gè)屬性,一個(gè)屬性為“真”或“假”,實(shí)際上,一個(gè)屬性通常是由其“真”值和“假”值由數(shù)字“1”和“0”表示的一個(gè)存儲(chǔ)位所表示的,所有部件都有“是可建立的(Is Build-able)”屬性,若該屬性為“真”,則該部件是可能建立的;否則便為不可建立的。一個(gè)部件可能總是不可建立的或暫時(shí)不可建立的(因?yàn)槟承簳r(shí)條件的作用)。
可建立部件也有“在內(nèi)部(Is In Line)”屬性,當(dāng)該屬性為“真”時(shí),部件的“實(shí)施”是公開(kāi)的,這意味著另外的部件可以依賴于實(shí)施的改變,若其為“假”,則實(shí)施改變永遠(yuǎn)不會(huì)導(dǎo)致其他部件改變。
可建立部件還有“合成(Is Synthetic)”屬性,這一屬性對(duì)由編譯程序在建立處理過(guò)程中生成的部件為“真”。而對(duì)程序員人工生成的部件為“假”,提供合成部件是使編譯程序生成與系統(tǒng)設(shè)定語(yǔ)言元素對(duì)應(yīng)的部件,系統(tǒng)設(shè)置語(yǔ)言元素是需要的,但其不必由程序員直接生成,實(shí)際上有可能將“合成”屬性從“真”改為“假”,例如當(dāng)一個(gè)合成的部件被人工編輯時(shí),但從“假”到“真”的反向改變是絕不允許的,合成部件通常沒(méi)有特性“界面”或“實(shí)施”,但無(wú)論在何種情況下,合成部件使“界面”和“實(shí)施建立狀態(tài)”被編譯。
類別每一部件都有一“類別”(Kind),一個(gè)類別是指用來(lái)把部件分為例如共享同樣特性或同樣語(yǔ)言專用行為的各個(gè)組的一個(gè)文本串。大部分類別是專用于一種特定的計(jì)算機(jī)語(yǔ)言并用于指定語(yǔ)義區(qū)別語(yǔ)言元素。
然而,有一些由系統(tǒng)定義的類別,它們分別為“項(xiàng)目”,“庫(kù)”,以及“貯存器”,這些類別只用于不可建立部件。類別“項(xiàng)目”是“項(xiàng)目”部件的類別。類別“庫(kù)”則是用于連接到目標(biāo)碼的一個(gè)外部塊(例如一個(gè)共享庫(kù)或應(yīng)用程序)的部件集。類別“貯存器”則應(yīng)用于把其他分量分組歸類以便組織的部件。實(shí)際上,類別通常在內(nèi)部由數(shù)字表示。
圖3提供了包括一組部件31的程序的概念表達(dá),每個(gè)部件由一組特性組成,這組特性分為兩部分,即稱為界面的外部可見(jiàn)(公開(kāi))部分31l以及實(shí)施(專用)部分312。如圖3所示,部件只依賴于另一部件的界面,在一個(gè)項(xiàng)目中的所有部件被組織成樹(shù)結(jié)構(gòu),其底部為根部件32(稱為項(xiàng)目部件)。本技術(shù)領(lǐng)域的一般技術(shù)人員可知,部件不必本身包含實(shí)體,但可以包括指向?qū)嶋H代碼的存儲(chǔ)位置的指針。然而,這一樹(shù)結(jié)構(gòu)表達(dá)用于展示程序的結(jié)構(gòu),因此,類似的樹(shù)結(jié)構(gòu)表示被用于其后所述的用戶屏幕之一。
圖4是一框圖,示出了本發(fā)明的三個(gè)主要功能程序。它們是數(shù)據(jù)庫(kù)41,編譯程序42,以及建立處理43。數(shù)據(jù)庫(kù)41包括一組部件,圖中所示為一個(gè)項(xiàng)目部件411和一個(gè)可建立部件集412,該可建立部件集412被設(shè)計(jì)為將被建立的一個(gè)程序。編譯程序42計(jì)算數(shù)據(jù)庫(kù)41中部件的相關(guān)性,建立處理43利用部件特性和編譯程序生成的相關(guān)性來(lái)建立該程序。
程序員可用編輯程序44改變?cè)摮绦?,編輯程序必須可以生成和刪除部件,尤其是剪裁,復(fù)制,粘貼和移動(dòng)部件,編輯程序必須可以改變“界面”和“實(shí)施”特性中的數(shù)據(jù),其方式通常是對(duì)文本直接進(jìn)行修改。然而,其他更為結(jié)構(gòu)化的途徑(例如從選項(xiàng)屏進(jìn)行選擇)亦可采用。實(shí)際上,編輯程序44通常將包括多個(gè)編輯程序,每個(gè)用于每種“界面”或“實(shí)施”特性,或甚至可能為特性中的數(shù)據(jù)分區(qū)配置編輯程序。
寄存編輯改變的方法參見(jiàn)圖5A到圖5D,其中示出了與增量建立有關(guān)的編輯程序44所執(zhí)行的邏輯功能流程圖。對(duì)于可建立的非合成部件,“建立狀態(tài)”被限為在建立處理之外的“編譯”的值和“需要編譯”值。若特性“界面”不存在,則“界面建立狀態(tài)”是“編輯的”。若特性“實(shí)施”不存在,則“實(shí)施建立狀態(tài)”是“編譯的”。圖5A中,展示了各種編輯狀態(tài)變化。在500處,當(dāng)系統(tǒng)標(biāo)識(shí)了一個(gè)“生成部件”(Create Component),“再命名部件”(Rename Component),“粘貼部件”(Paste Component),或“編輯界面”(Edit Interface)命令時(shí),控制去往功能框510對(duì)界面變化進(jìn)行處理,該變化的詳細(xì)邏輯示于圖5B中。
圖5B中,處理始于判別框511,在該處,進(jìn)行測(cè)試以確定是否界面建立狀態(tài)是否為“需要編譯”,若是,則控制通過(guò)514進(jìn)行繼續(xù)編輯,這些動(dòng)作發(fā)生在編輯而非再建立過(guò)程中,下一動(dòng)作很可能是另一編輯動(dòng)作。若否,則在功能框512處把界面建立狀態(tài)設(shè)置成“需要編譯”并因此更新界面變化表。然后,在功能框513處完成實(shí)施已改變和貯存器已改變的處理。實(shí)施已改變操作的細(xì)節(jié)示于圖5C中而貯存器已改變的操作細(xì)節(jié)示于圖5D中。
圖5C示出了與實(shí)施已改變有關(guān)的詳細(xì)處理,判別框571進(jìn)行測(cè)試以確定是否實(shí)施建立狀態(tài)已設(shè)定為“需要編譯”。若是,控制通過(guò)572進(jìn)行繼續(xù)編輯,若否,則在功能框573處把實(shí)施建立狀態(tài)設(shè)為等于“需要編譯”且實(shí)施變化表被因此而更新。然后,控制通過(guò)574返回。
圖5D示出了與貯存器改變操作有關(guān)的詳細(xì)邏輯。功能框542處將進(jìn)行測(cè)試以確定是否該貯存器可建立。若可以,則在功能框543處由部件的貯存器按圖5B討論的細(xì)節(jié)調(diào)用已改變“界面”,然后,控制通過(guò)544返回。
若“編輯實(shí)施”(Edit Implementation)命令在圖5A的560處被檢測(cè)到,則處理按照功能框570所示和圖5C的討論執(zhí)行實(shí)施已改變的動(dòng)作。
若在圖5A的530處檢測(cè)到“刪除部件”(Delete Compo-nent)命令,則對(duì)于部件A的貯存器已改變處理起始于功能框540,其細(xì)節(jié)示于圖5D中,然后,貯存器A被刪除且控制由550返回。
若在圖5A中的580處檢測(cè)到一個(gè)“移動(dòng)部件”(MoveComponent)命令,則部件A的貯存器已改變處理起始于功能框590并詳細(xì)示于圖5D中,然后,部件的貯存器被設(shè)定于等于新的貯存器,且對(duì)于部件A的界面已改變的處理詳細(xì)示于圖5B中,最后,處理由595返回。
確定一個(gè)建立的部件的方法在建立一個(gè)程序的過(guò)程中,“項(xiàng)目”部件維護(hù)改為編譯表的專用引用表。有一個(gè)“界面編譯表”和一個(gè)“實(shí)施編譯表”。“項(xiàng)目”還維護(hù)一個(gè)叫做“內(nèi)部錯(cuò)誤表”的專用引用表。實(shí)際上,每個(gè)表可由不止一個(gè)表物理地表示,以提高效率。
圖6展示的處理中,對(duì)于“項(xiàng)目”的“改變表”中的每個(gè)引用(如功能框601所示),從表的前部選中一個(gè)引用。若在表上有多個(gè)引用,處理由框602所示完成。若引用是一個(gè)界面,如在框603所判定的,則將該引用的復(fù)制放在“界面編譯表”中并且在601繼續(xù)處理之前,在功能框604處把“加客戶”(Add Clients)功能調(diào)用到該引用。若其特性名不是“界面”,則其特性名為“實(shí)施”,如框605所示。此時(shí),由判別框606進(jìn)行測(cè)試以確定是否“在內(nèi)部”(ISInLine)屬性為真。若是,則將引用的復(fù)制放入“界面編譯表”并在框601的處理繼續(xù)之前在功能框607處從該引用中調(diào)用“加客戶”功能。否則,其特性名肯定是“實(shí)施”且其“在內(nèi)部”屬性肯定為“假”,而且在框601的處理繼續(xù)之前,該引用的復(fù)制由功能框608放在“實(shí)施編譯表”中。
“生成編譯表”功能的偽代碼如下
<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>
“加客戶”功能對(duì)于參數(shù)中每個(gè)引用適當(dāng)?shù)匾每蛻魴z查引用,并在其“建立狀態(tài)”被編譯時(shí),把該引用的“建立狀態(tài)”設(shè)為“不確定”,把該引用的復(fù)制加到適當(dāng)?shù)摹熬幾g表”,并在該引用中調(diào)用“加客戶”。這一處理稱為生成“改變表”的“客戶封閉(Client Closure)”。該“客戶封閉”表示需要作為一個(gè)建立的結(jié)果而被再次編譯的那些部件的子集。實(shí)際上,由建立過(guò)程的編譯程序生成的相關(guān)性及變化用于避免在“客戶封閉”中編譯過(guò)多的部件。
以下是“加客戶”的偽碼功能<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>
處理“界面”的方法這是“建立”處理的第二階段。對(duì)于“界面編譯表”上的項(xiàng)而言,可能的“建立狀態(tài)”是“編譯的”、“被編譯”,“需要編譯”,“不確定”,“編譯錯(cuò)誤”或“不定錯(cuò)誤”?!敖缑婢幾g表”被處理直到它空了為止,如圖7的流程圖所示。處理始于701處,在該處,從“界面編譯表”的前部選中一個(gè)引用。如果在表上沒(méi)有更多的引用,便在框702處完成處理。若與該引用相關(guān)聯(lián)的部件的界面“建立狀態(tài)”是“編譯的”,“編譯錯(cuò)誤”或“不確定錯(cuò)誤”,如框703所示,則從表的前部去除該引用并且在框701中繼續(xù)處理。若與該引用相關(guān)的部件的界面“建立狀態(tài)”是“被編譯”或“需要編譯”,如框704所示,則部件的“建立狀態(tài)”在框705中被設(shè)置為“被編譯”。然后,在部件的“界面”調(diào)用“編譯”功能(它調(diào)用編譯程序42)。該功能將返回到“異常中止”值,“完成”值和“錯(cuò)誤”值之一。若在框70%處返回“異常中止”值,則部件的“界面建立狀態(tài)”被設(shè)為“編譯的”且處理在框701處繼續(xù)之前,在框708處將把引用從表的前部去除掉。若返回的值是框709處的“錯(cuò)誤”,則該部件的“界面建立狀態(tài)”設(shè)定為“編譯錯(cuò)誤”,則從表的前部去掉該引用,并在701處繼續(xù)處理之前,在功能框710中的部件中調(diào)用“傳播錯(cuò)誤”功能。若與該引用相關(guān)聯(lián)的“界面建立狀態(tài)”為“不確定”,如框711所示,則該部件的“建立狀態(tài)”在功能框712處設(shè)為“被編譯”。然后在該部件的“界面”上調(diào)用“有條件地編譯”功能(可以調(diào)用也可以不調(diào)用編譯程序42)。該功能也返回到“異常中止”值,“完成”值和“錯(cuò)誤”值之一。若返回到“異常中止”值,則在步驟701處的處理繼續(xù)進(jìn)行。若返回到框713處的“完成”值,則在功能框708中從表的癰部去掉該引用并繼續(xù)進(jìn)行框701處的處理。若返回框714處的“錯(cuò)誤”值,則從表的前部去掉該引用并在框701的處理繼續(xù)進(jìn)行之前,在功能框715中的部件里調(diào)用“傳播錯(cuò)誤”功能。
用于“處理界面”功能的偽碼如下<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>
功能“傳播錯(cuò)誤”把一個(gè)與部件對(duì)應(yīng)的引用加到“項(xiàng)目”的“內(nèi)部錯(cuò)誤表”中并對(duì)部件的“客戶”表中的每個(gè)引用執(zhí)行如下若該引用的“建立狀態(tài)”是“編譯錯(cuò)誤”或“不確定錯(cuò)誤”,處理繼續(xù)下一個(gè)引用。若該引用的“建立狀態(tài)”是“需要編譯”,處理把它的“建立狀態(tài)”設(shè)為“編譯錯(cuò)誤”,把引用加到“內(nèi)部錯(cuò)誤表”,并在繼續(xù)下一引用之前為引用調(diào)用“傳播錯(cuò)誤”。若引用的“建立狀態(tài)”為“不確定”,則處理把其“建立狀態(tài)”設(shè)到“不確定錯(cuò)誤”,把引用加到“內(nèi)部錯(cuò)誤表”,并在繼續(xù)下一引用之前在引用上調(diào)用“傳播錯(cuò)誤”。
“傳播錯(cuò)誤”功能的偽碼如下<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>
處理“實(shí)施”的方法這是“建立”處理的第三階段。如圖8的流程圖所示,在“實(shí)施編譯”表中的每個(gè)引用都被處理。該處理始于801處,在該處,從“實(shí)施編譯表”的前部選中一個(gè)引用。若無(wú)更多的引用,在框802處完成處理。若該引用的“建立狀態(tài)”為“不確定”,如框803所示,則在框801繼續(xù)處理之前在功能框804中把“建立狀態(tài)”設(shè)置為“編譯的”。若該引用的“建立狀態(tài)”是“需要編譯”,如框805所示,則在功能框806處編譯該部件。從編譯程序42返回的值可能是“完成”和“錯(cuò)誤”。若在框807處返回值是“完成”,則在框80l繼續(xù)處理之前,在功能框804中把該引用的“建立狀態(tài)”設(shè)為“編譯的”。若在框808中返回的值為“錯(cuò)誤”,則將該引用的“建立狀態(tài)”設(shè)定為“編輯錯(cuò)誤”并在框801繼續(xù)處理之前,在功能框809的部件中調(diào)用“傳播錯(cuò)誤”功能。若該引用的“建立狀態(tài)”是“編譯錯(cuò)誤”或“不確定錯(cuò)誤”,將不作任何事情。注意“實(shí)施”的處理在這一階段是順序獨(dú)立的,因?yàn)橄嚓P(guān)性只可以在其“在內(nèi)部”屬性是“真”而且已被處理過(guò)的“界面”或“實(shí)施”中。
“處理實(shí)施”的偽碼如下
<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>
支持“建立”處理的編譯程序編譯程序?qū)⑼ㄟ^(guò)“編譯”功能而被調(diào)用,兩者可作為同義詞使用。編譯程序42處理源文本,并標(biāo)識(shí)可能的外部部件的名字。編輯程序下一步獲取所有部件的引用表。該編輯程序可用語(yǔ)言專用知識(shí)(例如部件類別)從該表中刪除引用。編譯程序然后為文本中標(biāo)識(shí)的每個(gè)外部部件調(diào)用“獲得說(shuō)明(Get Declaration)”功能。該“編譯”功能在調(diào)用編譯程序之前清除任何現(xiàn)存的錯(cuò)誤。這也將清除任何來(lái)自特性“錯(cuò)誤”的錯(cuò)誤消息并從“項(xiàng)目”的“錯(cuò)誤表”特性中去除任何引用。
編譯程序首先調(diào)用“獲得說(shuō)明”功能,如圖9的流程圖所示?!矮@得說(shuō)明”功能返回到“異常中止”值,“完成”值,“循環(huán)相關(guān)性”值或“錯(cuò)誤”值的其中之一,并可返回該“說(shuō)明”的數(shù)據(jù)。處理起始于框901,在該處,每個(gè)引用的“建立狀態(tài)”被檢查。若沒(méi)有更多的引用要處理,便在框902處完成處理并返回。若該部件的“建立狀態(tài)”在框903處為“編譯的”,則功能返回到“完成”,如框904所示,而且在框901繼續(xù)處理之前,存儲(chǔ)的說(shuō)明數(shù)據(jù)也被返回。若部件的“建立狀態(tài)”在框905處示為“需要編輯”或“不確定”,則相應(yīng)于該部件的引用在功能框906中被加到“界面編譯表”的前部,并在框901繼續(xù)其處理之前,該功能返回到功能框907的“異常中止”。“說(shuō)明”數(shù)據(jù)在這一情況下不返回。若部件的“建立狀態(tài)”為框908所示的“被編輯”,則在框901繼續(xù)處理之前,功能將去往功能框909處的“循環(huán)相關(guān)性”?!罢f(shuō)明”數(shù)據(jù)在這一情況下亦不返回。若部件的“建立狀態(tài)”是框910所示的“編輯錯(cuò)誤”或“不確定錯(cuò)誤”,則在框901繼續(xù)其處理之前,功能返回到功能框911的“錯(cuò)誤”。在這種情況下亦無(wú)“說(shuō)明”數(shù)據(jù)返回。
“獲得說(shuō)明”功能的偽碼如下<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>在調(diào)用“獲得說(shuō)明”功能之后,編譯程序繼續(xù)進(jìn)行如下。若返回值為“異常中止”,則編譯程序必須中止處理并返回“異常中止”值,一個(gè)替代實(shí)施方案是編譯程序在編譯了返回的部件之后中止編譯,放棄或重新啟動(dòng)編譯程序。這會(huì)要求編譯程序再次進(jìn)入。但不需要對(duì)上述的步驟作實(shí)質(zhì)性的改變。若返回的值是“編譯的”,則編譯程序可繼續(xù)其處理。若采用“說(shuō)明”,則將構(gòu)成“源引用相關(guān)性”,而且編譯程序會(huì)追蹤相關(guān)性及其性質(zhì)。若返回值是“循環(huán)相關(guān)性”或“錯(cuò)誤”,則編譯程序必須中止處理,在部件上調(diào)用“設(shè)置錯(cuò)誤(Set Error)”功能,并返回“錯(cuò)誤”值。編譯程序可以選擇繼續(xù)處理以便在結(jié)束之前可能發(fā)現(xiàn)更多的錯(cuò)誤。
若對(duì)“獲得說(shuō)明”的調(diào)用返回“編譯的”,則編譯程序?qū)⒁猿R?guī)方式繼續(xù)處理源文本。若在處理過(guò)程中遇到任何錯(cuò)誤,編輯程序?qū)⒄{(diào)用部件的“設(shè)置錯(cuò)誤”功能并返回“錯(cuò)誤”值。若沒(méi)有遇到錯(cuò)誤,則編譯程序返回“完成”值。若編譯程序已經(jīng)在對(duì)一個(gè)界面進(jìn)行處理,則它將存貯該“說(shuō)明”特性的新值。
處理“錯(cuò)誤”的方法在編譯程序被調(diào)用以處理一個(gè)“界面”或“實(shí)施”之前,清除所有現(xiàn)有的“錯(cuò)誤”這將保證所有的錯(cuò)誤消息被更新。由于“界面”和“實(shí)施”之間的內(nèi)部相關(guān)性以及這樣的事實(shí),即錯(cuò)誤是可傳播的,所以將不可能在同一建立上在“界面”和“實(shí)施”上同時(shí)得到編譯程序錯(cuò)誤。
當(dāng)編譯程序遇到錯(cuò)誤時(shí),它調(diào)用傳送關(guān)于錯(cuò)誤的信息的功能“設(shè)置錯(cuò)誤”,該信息包括錯(cuò)誤的集合,以及返加錯(cuò)誤部件的描述錯(cuò)誤的消息,該信息存在“錯(cuò)誤”特性和部件的適當(dāng)源特性(“界面”或“實(shí)施”)之中。一個(gè)引用也存在由“項(xiàng)目”維護(hù)的,允許對(duì)所有錯(cuò)誤進(jìn)行方便的存取的總錯(cuò)誤表中。
錯(cuò)誤將傳播到任意相關(guān)部件以便這些部件無(wú)需在其后被編譯,因?yàn)橐阎肋@些編譯將會(huì)失敗。進(jìn)而,遇到錯(cuò)誤后將繼續(xù)建立并盡可能多的正確建立那些本身并無(wú)明顯錯(cuò)誤的部件或與錯(cuò)誤部件有關(guān)聯(lián)的部件。
“設(shè)置錯(cuò)誤”功能獲取由編輯程序42傳給它的錯(cuò)誤消息并在相應(yīng)于適當(dāng)特性(界面或?qū)嵤?的部件的“錯(cuò)誤”特性中生成一個(gè)入口。以這一方式生成的兩個(gè)入口共享用一鍵,以致它們保持“連接”。這一功能通常還用一個(gè)“粘接標(biāo)記(Sticky marker)”把錯(cuò)誤的位置記錄在程序源之中。該“粘接標(biāo)記”在稍后的用戶編輯過(guò)程中一直附屬到字符的相同范圍。
若編譯程序成功地完成了源文本的處理,則其將產(chǎn)生目標(biāo)碼并將其傳送給“連接程序”功能以便進(jìn)行增量連接。或者,目標(biāo)碼可存到建立處理結(jié)束并以常規(guī)方式連接。
編譯程序現(xiàn)在將更新部件的“源引用(SourceReference)”特性以及每個(gè)“源引用”的“客戶”特性。對(duì)每一個(gè)引用,例如部件A的“源引用”特性中的部件B,將必須有一與部件B的“客戶”特性中的部件A相對(duì)應(yīng)的引用(它具有同樣的相關(guān)性信息)。
編輯程序?qū)⑸梢粋€(gè)“變化”以描述“說(shuō)明”如何從其是前值改變的。編輯程序?qū)⒃诓考险{(diào)用“傳播改變(Propa-gate Change)”功能并把計(jì)算出來(lái)的改變傳播給該部件。該編譯程序然后將設(shè)定“說(shuō)明”的新值?!皞鞑ジ淖儭惫δ芘c針對(duì)部件的“客戶”表中的每個(gè)引用的相關(guān)性的變化相吻合。若該吻合指出引用的部件已為改變所影響且其“建立狀態(tài)”不是“編譯錯(cuò)誤”或“不確定錯(cuò)誤”,則其“建立狀態(tài)”設(shè)為“需要編譯”。
有可能要編譯程序使用“設(shè)置錯(cuò)誤”功能以發(fā)布告警消息或各種形式的建議。在這種情況下,若只有告警消息返回,則“編譯”功能應(yīng)返回到“完成”。告警消息將被加到“錯(cuò)誤”特性且引用將被加到“項(xiàng)目錯(cuò)誤表”特性。否則編譯將被認(rèn)為成功。適當(dāng)?shù)摹敖顟B(tài)”將被設(shè)置為“編輯的”,而將無(wú)錯(cuò)誤被傳播。若只發(fā)布了告警或建議,則程序?qū)⒈煌耆丶罢_地建立。
“有條件地編譯”一個(gè)部件的處理圖10A和10B示出了“有條件編譯”功能的流程圖,其中進(jìn)行了引用。在部件A的“源引用”中的每個(gè)部件B在框1001處進(jìn)行處理。若框1002處指出所有部件B均已被處理過(guò),則對(duì)部件B的處理結(jié)束而處理去往圖10B以編譯部件A。若部件B的“建立狀態(tài)”是“被編譯”或“需要編譯”,如框1003所示,則該部件的“建立狀態(tài)”被設(shè)定為“被編譯”且該部件在功能框1004中被編譯。該編譯功能可以返回“完成”值,“異常中止”值和“錯(cuò)誤”值其中之一。若返回框1005的“完成”值,處理將繼續(xù)在框1001處進(jìn)行。
若返回值是框1006的“異常中止”,則功能中止且“異常中止”返回到框1007。若返回值是框1008中的“錯(cuò)誤”,則原始部件的“建立狀態(tài)”被設(shè)置為“不確定錯(cuò)誤”,功能被停止且“錯(cuò)誤”返回到功能框1009中。若部件B的“建立狀態(tài)”是“不確定”,如框1010所示,則“建立狀態(tài)”被設(shè)定為“被編譯”且該部件在功能框1011中被有條件地編譯。“有條件地編譯”功能可以再次返回“完成”,“異常中止”或“錯(cuò)誤”值之 一。若“完成”值返回框1005,處理在框1001處繼續(xù)。若“錯(cuò)誤”返回到框1012,部件的“建立狀態(tài)”被設(shè)為“不確定錯(cuò)誤”,從“界面編譯表”中去除部件A,并在功能結(jié)束之前在功能框1014中調(diào)用“傳播錯(cuò)誤”功能。若返回框1015的“異常中止”,則在功能結(jié)束之前“異常中止”返回框1007。
現(xiàn)在再來(lái)看圖10B,若所有引用已被處理過(guò),則它們都使“建立狀態(tài)”被“編譯”。但是,“源引用”之一可能在處理進(jìn)行到此處時(shí)已經(jīng)把一個(gè)變化傳播到部件,所以它的“建立狀態(tài)”可以是“被編譯”或“需要編譯”。因此,部件A的“建立狀態(tài)”在框1016中決定。若框1017處指出該“建立狀態(tài)”是“需要編譯”,則該“編譯狀態(tài)”被設(shè)定為“被編輯”且部件A在功能框1018中被編譯。編譯程序可返回到“錯(cuò)誤”或“完成”。注意“異常中止”不會(huì)發(fā)生,因?yàn)樗械摹霸匆谩倍荚谶@一階段被編譯了。若“錯(cuò)誤”返回到框1019,則“建立狀態(tài)”設(shè)為“編譯錯(cuò)誤”而且“錯(cuò)誤”去往功能框1020。若“完成”去往框1021,則“建立狀態(tài)”設(shè)為“編譯的”且“完成”去往框1023。若部件A的“建立狀態(tài)”是“被編譯的”,如框1024所示,則“建立狀態(tài)”被設(shè)為“編譯的”而且“完成”去往功能框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>
后處理錯(cuò)誤的方法后處理錯(cuò)誤的方法是“建立”處理的第四階段。若在建立過(guò)程中發(fā)生了任何錯(cuò)誤,則“后處理錯(cuò)誤(Post ProcessingErrors)功能便在建立結(jié)束時(shí)被調(diào)用。對(duì)每個(gè)在“內(nèi)部錯(cuò)誤表”中的引用而言,若引用的“建立狀態(tài)”是“編譯錯(cuò)誤”,則“建立狀態(tài)”改變成“需要編譯”。若引用的“建立狀態(tài)”是“不確定錯(cuò)誤”,則“建立狀態(tài)”變?yōu)椤熬幾g的”。
當(dāng)所有在“內(nèi)部錯(cuò)誤表”上的引用已修理完畢后,該表的所有入口被清除。為便于程序員,將在“項(xiàng)目”的“錯(cuò)誤表”上開(kāi)一個(gè)視窗或測(cè)覽窗。
“后處理錯(cuò)誤”功能的偽碼如下<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?。?){ OpenErrorWindow(); } }]]></pre>
雖然本發(fā)明以實(shí)施例的方式敘述了本發(fā)明,但一般技術(shù)人員可在發(fā)明的原理下對(duì)本發(fā)明進(jìn)行修改和變型,本發(fā)明的范圍受權(quán)利要求的保護(hù)。
權(quán)利要求
1一種用于建立計(jì)算機(jī)程序的方法,其特征在于包括以下步驟(a)將計(jì)算機(jī)程序作為部件集來(lái)設(shè)計(jì);(b)在存儲(chǔ)器中存儲(chǔ)上述部件;(c)訪問(wèn)所存儲(chǔ)的部件并計(jì)算與每個(gè)部件有關(guān)的相關(guān)性從而產(chǎn)生相關(guān)性表;以及(d)根據(jù)該相關(guān)性表對(duì)部件進(jìn)行編譯以建立該計(jì)算機(jī)程序。
2權(quán)利要求1所述的方法,包括以下步驟(a)進(jìn)行編輯以便生成,改變或刪除部件以及;(b)在變化表中存儲(chǔ)部件的編輯改變。
3權(quán)利要求2所述的方法,其中部件具有“建立狀態(tài)”值,該值表示基于變化表中編輯變化的部件的狀態(tài)。
4權(quán)利要求3所述的方法,包括對(duì)變化表進(jìn)行處理以確定建立操作的可能部件的步驟。
5權(quán)利要求4所述的方法,包括在編譯中存儲(chǔ)每個(gè)變化表項(xiàng)以及當(dāng)變化表項(xiàng)被加到編譯表時(shí)對(duì)變化表項(xiàng)進(jìn)行處理以便標(biāo)識(shí)從屬于改變的部件的部件并把該從屬部件加入到編譯表的步驟。
6權(quán)利要求5所述的方法,包括用“未確定”值增加從屬部件的步驟。
7權(quán)利要求5所述的方法,包括對(duì)加入到編譯表的每項(xiàng)進(jìn)行循環(huán)處理之步驟。
8權(quán)利要求1所述的方法,其中每個(gè)部件由一組特性組成,該組特性分為稱做“界面”的公開(kāi)部分和稱為“實(shí)施”的專用部分,部件的相關(guān)性只與“界面”部分相關(guān)聯(lián),維護(hù)一個(gè)相關(guān)性表的步驟分別由維護(hù)部件的公開(kāi)和專用部分的一個(gè)“界面編譯表”和一個(gè)“實(shí)施編譯表”而完成。
9權(quán)利要求8所述的方法,其中的編譯步驟通過(guò)對(duì)在“實(shí)施編譯表”中引用的部件進(jìn)行編譯之前,首先對(duì)“界面編譯表”中引用的部件進(jìn)行編譯的予以實(shí)現(xiàn)。
10權(quán)利要求9所述的方法,其中的部件有“建立狀態(tài)”值,在“界面編譯表”上的“建立狀態(tài)”值包括“被編譯”,“需要編譯”或“不確定”,對(duì)于在“界面編譯表”上的每個(gè)引用,該方法包括以下步驟若“建立狀態(tài)”值是“被編譯”或“需要編譯”則將“建立狀態(tài)”設(shè)為“被編譯”并然后編譯該部件;若“建立狀態(tài)”值是“不確定”,則將“建立狀態(tài)”值設(shè)為“被編譯”并然后有條件地編譯該部件。
11權(quán)利要求10所述的方法,其中,若編譯程序成功地編譯了部件,則在處理下一部件之前執(zhí)行把部件的“建立狀態(tài)”值設(shè)定為“編譯的”步驟。
12權(quán)利要求10所述的方法,其中,若編譯程序返回“異常中止”值,則處理下一部件。
13權(quán)利要求10所述的方法,其中,若編譯程序在編譯步驟中返回到“錯(cuò)誤”值,則將該部件的“建立狀態(tài)”值設(shè)置為“編譯錯(cuò)誤”并在處理下一部件之前把引用加到所述項(xiàng)目部件中的錯(cuò)誤表中。
14權(quán)利要求10所述的方法,其中,若編譯程序返回“錯(cuò)誤”值,則將該部件的“建立狀態(tài)”值設(shè)置為“不確定錯(cuò)誤”,并在處理下一部件之前把一個(gè)引用加到所述項(xiàng)目部件中的錯(cuò)誤表中。
15權(quán)利要求10所述的方法,其中,若編譯程序編譯了該部件,則執(zhí)行以下步驟在處理下一部件之前,把該部件的“建立狀態(tài)”值設(shè)置成“編譯的”,但若該編譯程序返回“異常中止”值,則在處理下一部件之前,把部件的“建立狀態(tài)”值設(shè)置為“編譯錯(cuò)誤”并把引用加到所述項(xiàng)目部件中的錯(cuò)誤表中,但若該編譯程序返回“錯(cuò)誤”值,則在處理下一部件之前,將部件的“建立狀態(tài)”值設(shè)為“不確定錯(cuò)誤”并把引用加到所述項(xiàng)目部件中的錯(cuò)誤表中。
16權(quán)利要求10所述的方法,其中,在“實(shí)施編譯表”上的“建立狀態(tài)”值是“需要編譯”,或“不確定”,對(duì)于在“實(shí)施編譯表”上的每個(gè)引用,該方法包括以下步驟(a)若“建立狀態(tài)”值是“需要編譯”,則為“建立狀態(tài)”設(shè)置為“被編譯”并然后編譯該部件以及(b)若“建立狀態(tài)”是“不確定”,則在處理下一部件之前將“建立狀態(tài)”值設(shè)置為“編譯的”。
17權(quán)利要求14所述的方法,其中,若編譯程序在所述編譯步驟中成功地編譯了該部件,則還執(zhí)行在處理下一部件之前把該部件的“建立狀態(tài)”值設(shè)置為“編譯的”的步驟。
18權(quán)利要求14所述的方法,其中,若該編譯程序在編譯步驟中返回值“錯(cuò)誤”,則在處理下一部件之前把該部件的“建立狀態(tài)”值設(shè)置為“編譯錯(cuò)誤”并把引用加到所述項(xiàng)目部件中的錯(cuò)誤表中。
19權(quán)利要求14所述的方法,其中,若編譯程序成功地編譯了該部件,則執(zhí)行以下步驟在處理下一部件之前,將部件的“建立狀態(tài)”值設(shè)置成“編譯的”。若編譯程序在編譯步驟中返回“錯(cuò)誤”值,則在處理下一部件之前,將該部件的“建立狀態(tài)”值設(shè)置成“編譯錯(cuò)誤”并把引用加到所述項(xiàng)目部件中的錯(cuò)誤表中。
20權(quán)利要求14所述的方法,其中,對(duì)所述變化表中的每個(gè)部件而言,若“界面”部分已被改變,則部件被加到“界面編譯表”中,若“實(shí)施”部分已被改變且該改變可以影響其他部件,則該部件被加到“界面編譯表”中,否則,該部件被加到“實(shí)施編譯表”中。
21權(quán)利要求19所述的方法,其中,若編譯程序在編譯步驟或有條件的編譯步驟中成功地編譯了該引用,則對(duì)下一引用進(jìn)行處理直到所有引用被處理。
22一種用于建立計(jì)算機(jī)程序的方法,包括以下步驟(a)將計(jì)算機(jī)程序作為部件集來(lái)進(jìn)生成;(b)在存儲(chǔ)器中存儲(chǔ)所述部件;(c)訪問(wèn)所存儲(chǔ)的部件并計(jì)算與每個(gè)部件關(guān)聯(lián)的相關(guān)性,從而產(chǎn)生相關(guān)性表;(d)編譯部件并檢測(cè)部件的至少一個(gè)名字;(e)查詢說(shuō)明數(shù)據(jù)庫(kù)以確定部件說(shuō)明的至少一個(gè)名字;以及(f)確定該部件說(shuō)明的狀態(tài)。
23權(quán)利要求22所述的方法,包括當(dāng)狀態(tài)被標(biāo)明為編譯的狀態(tài)時(shí),利用部件說(shuō)明的狀態(tài)繼續(xù)進(jìn)行編譯的步驟。
24權(quán)利要求22所述的方法,包括當(dāng)狀態(tài)被標(biāo)明為錯(cuò)誤狀態(tài)時(shí),返回錯(cuò)誤值并停止處理該部件說(shuō)明的現(xiàn)行部件狀態(tài)的步驟。
25權(quán)利要求22所述的方法,包括在狀態(tài)被標(biāo)明為異常中止?fàn)顟B(tài)時(shí),返回異常中止值并停止處理部件說(shuō)明的現(xiàn)行部件狀態(tài)的步驟。
26權(quán)利要求22所述的方法,其中查詢說(shuō)明數(shù)據(jù)庫(kù)以確定部件說(shuō)明的至少一個(gè)名字的步驟包括以下步驟(a)確定該部件的狀態(tài)是否編譯的;以及(b)若該狀態(tài)是編譯的,返回該編譯的說(shuō)明和相關(guān)的編譯狀態(tài)。
27權(quán)利要求26所述的方法,包括如果編譯狀態(tài)被斷言為錯(cuò)誤時(shí)就返回錯(cuò)誤的編譯狀態(tài)的步驟。
28權(quán)利要求22所述的方法,包括以下步驟(a)確定部件的狀態(tài)是不確定還是需要編譯;以及(b)把部件作為在編譯表上的第一項(xiàng)進(jìn)行存儲(chǔ),并返回到異常中止?fàn)顟B(tài)。
29一種用于建立計(jì)算機(jī)程序的系統(tǒng),其特征在于包括(a)將計(jì)算機(jī)程序作為部件集來(lái)設(shè)計(jì)的裝置;(b)在存儲(chǔ)器中存儲(chǔ)所述部件的裝置;(c)訪問(wèn)所存儲(chǔ)的部件并計(jì)算與每個(gè)部件相關(guān)的相關(guān)性以產(chǎn)生相關(guān)性表的裝置;以及(d)根據(jù)相關(guān)性表編譯部件以建立計(jì)算機(jī)程序的裝置。
30權(quán)利要求29所述的系統(tǒng),包括(a)進(jìn)行編輯以便生成,改變或刪除部件的裝置;以及(b)在改變表中存儲(chǔ)部件的編輯改變的裝置。
31權(quán)利要求30所述的裝置,其中,部件具有“建立狀態(tài)”值,該值標(biāo)明了基于該變化表中的編輯改變的部件的狀態(tài)。
32權(quán)利要求31所述的系統(tǒng),還包括對(duì)變化表進(jìn)行處理以確定建立操作的可能部件的裝置。
33權(quán)利要求32所述的系統(tǒng),還包括在編譯表中存儲(chǔ)每個(gè)變化表項(xiàng)以及當(dāng)變化表項(xiàng)被加到編譯表時(shí)對(duì)變化表項(xiàng)進(jìn)行處理以便標(biāo)識(shí)從屬于改變的部件的部件并把該從屬的部件加入到編譯表的裝置。
34權(quán)利要求33所述的系統(tǒng),包括有“不確定”值增加從屬部件的裝置。
35權(quán)利要求33所述的系統(tǒng),包括對(duì)加入到編譯表的每項(xiàng)進(jìn)行循環(huán)處理的裝置。
36權(quán)利要求29所述的系統(tǒng),其中每個(gè)部件由一組分為稱做(“界面”)的和稱做(“實(shí)施”)專用部分的特性所組成,部件的相關(guān)性只與“界面”部分相關(guān)。通過(guò)對(duì)部件的公開(kāi)部分和專用部分分別維護(hù)“界面編譯表”和“實(shí)施編譯表”而完成了對(duì)相關(guān)性表的維護(hù)。
全文摘要
一個(gè)面向人的目標(biāo)編程系統(tǒng)為計(jì)算機(jī)程序的增量建立提供了交互和動(dòng)態(tài)的處理,該處理簡(jiǎn)化的操作系統(tǒng)及有圖形用戶界面的大應(yīng)用程序分類的復(fù)雜計(jì)算機(jī)程序的開(kāi)發(fā),程序被作為稱為部件的單元集進(jìn)行設(shè)計(jì)所成型,部件表示一個(gè)象分類或功能之類的可編譯語(yǔ)言元素,三個(gè)主要的功能程序是數(shù)據(jù)庫(kù),編譯程序和建立處理。
文檔編號(hào)G06F9/44GK1105802SQ94190017
公開(kāi)日1995年7月26日 申請(qǐng)日期1994年1月3日 優(yōu)先權(quán)日1993年6月28日
發(fā)明者彼得·約瑟夫·麥金內(nèi)爾尼, 比爾·吉本斯 申請(qǐng)人:塔里根特公司