專利名稱:無需修改現(xiàn)有代碼即可增加新軟件特征的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)編程語言領(lǐng)域、使用此類編程語言的方法及執(zhí)行和分析以此類編程語言編寫的程序的過程。
背景本申請(qǐng)是非臨時(shí)申請(qǐng),根據(jù)35 U.S.C.§120要求序列號(hào)為60/313364的臨時(shí)申請(qǐng)的優(yōu)先權(quán),該臨時(shí)申請(qǐng)于2001年8月17日提出,與本申請(qǐng)同一名稱且發(fā)明人相同。
在軟件開發(fā)中,常常需要為已用現(xiàn)有代碼實(shí)現(xiàn)的應(yīng)用程序增加新特征。這是軟件開發(fā)中最困難的任務(wù)之一,特別是在新特征可能改變?cè)绦驁?zhí)行流程時(shí)。例如,在電話交換系統(tǒng)中,要增加程序以實(shí)現(xiàn)“呼叫轉(zhuǎn)移”特征將會(huì)改變現(xiàn)有“一般舊式電話服務(wù)”和其它特征的執(zhí)行流程。要使用現(xiàn)有通用編程語言增加此類新特征,程序員必須修改現(xiàn)有代碼。這要求程序員十分熟悉現(xiàn)有代碼,并能夠逐行跟蹤現(xiàn)有代碼的不同執(zhí)行流程以確定要在何處進(jìn)行更改。利用現(xiàn)有技術(shù),由于沒有自動(dòng)化工具可幫助程序員,因此,這是一項(xiàng)工作量很大的過程。最終,程序員經(jīng)常懷疑是否已經(jīng)正確確定了要更改的代碼,是否已找到了所有這些代碼及其更改會(huì)對(duì)現(xiàn)有特征有什么影響。這將要求在可結(jié)束該工作前,需要周密的測(cè)試,經(jīng)歷很多試驗(yàn)和錯(cuò)誤。
另外,在大規(guī)模軟件開發(fā)中,經(jīng)常有必要安排不同的程序員來開發(fā)應(yīng)用程序的不同特征。使用諸如C++或Java等現(xiàn)在通用的編程語言,“呼叫等待”程序?qū)⒁蟾摹叭酵ㄔ挕背绦颍⑶矣捎谶@些特征影響彼此的控制流程,因此反之亦然。程序員需要彼此協(xié)調(diào)而使他們的設(shè)計(jì)任務(wù)變得復(fù)雜化了。其設(shè)計(jì)變得纏結(jié)不清,并且所得軟件使各種特征的邏輯不夠清楚,從而使難以對(duì)它們進(jìn)行維護(hù)。每種特征無法成為獨(dú)立的庫組件。它們都將作為單一對(duì)象加載,而無論用戶是否需要它們?nèi)?。因此,需要使程序員能夠獨(dú)立設(shè)計(jì)它們的特征并將它們打包為組件庫。
以下將幾個(gè)組成單個(gè)執(zhí)行程序,其中一個(gè)程序可改變另一程序的執(zhí)行流程的程序稱之為交互作用程序?;蛘撸覀兛梢哉f一個(gè)程序與另一程序交互作用,或者它們交互作用。由于特征程序是實(shí)現(xiàn)特征的程序,因此,在說到兩個(gè)或兩個(gè)以上特征程序交互作用時(shí),我們指一種特征的一些程序與另一特征的一些程序的彼此交互作用。
使用諸如C++或Java等現(xiàn)有通用計(jì)算機(jī)編程語言時(shí),程序員必須將程序語句的執(zhí)行流程排成序列。這使得在必須將交互作用的特征程序集成在一起時(shí)有必要更改代碼。此外,以現(xiàn)有通用語言編寫的程序不易于分析。目前不存在可幫助程序員識(shí)別新特征程序要增加到現(xiàn)有代碼中何處的工具。
概述我們通過增加幾個(gè)非過程語言結(jié)構(gòu),并指定用以執(zhí)行和分析以此語言編寫的程序的方法,解決了這些問題。所述語言允許程序員將交互作用的特征程序編寫為獨(dú)立的庫組件。當(dāng)把特征程序打包時(shí),工具可自動(dòng)確定它們交互作用的條件。程序員隨后可以使用所述語言提供的工具軟件(utility)解決交互作用而無需更改現(xiàn)有代碼。
一個(gè)非過程語言結(jié)構(gòu)是由條件部分和程序體部分組成的程序單元。當(dāng)對(duì)應(yīng)的條件部分為真時(shí)執(zhí)行程序體部分。不同于使用諸如C++或Java等常規(guī)過程語言,程序員不指定非過程語言中程序單元的執(zhí)行順序。
計(jì)算機(jī)操作系統(tǒng)中的一些先有技術(shù)部分地滿足了本發(fā)明的類似目標(biāo),但針對(duì)特殊情況。UNIX操作系統(tǒng)中的流工具軟件(streamfacility)允許程序員在協(xié)議棧的不同層中將計(jì)算機(jī)通信協(xié)議作為不同的流模塊來實(shí)現(xiàn)。如果應(yīng)用程序調(diào)用它,則程序員可在流中插入或刪除協(xié)議模塊而無需更改同一流中的其它模塊。流工具軟件利用了公認(rèn)的協(xié)議體系結(jié)構(gòu),因而不同層中的協(xié)議查看消息中的不同首部字段,并加強(qiáng)了協(xié)議模塊之間的統(tǒng)一接口。然而,它不是其它應(yīng)用程序的通用解決方案。稱為管道的另一UNIX工具軟件允許程序員將幾個(gè)程序連接起來以形成新的特征而無需更改其中任何程序。但這些程序必須堅(jiān)持字符串的輸入/輸出格式,并且它們必須以線性順序排列以便一個(gè)程序的輸出成為另一個(gè)程序的輸入。
目前存在主要為諸如捕獲專家知識(shí)以及甚至定理證明之類的人工智能應(yīng)用而設(shè)計(jì)的多種非過程語言。由于用途不同,這些語言提供的結(jié)構(gòu)和工具軟件及使用語言的方法與我們的語言有很大的不同。例如,在以它們編寫的程序準(zhǔn)備執(zhí)行前,它們均不要求明確的特征交互作用(也稱為沖突)檢測(cè)和解決過程。它們中一些語言如CLIPS具有可為程序員所用的機(jī)制,用于在執(zhí)行期間兩個(gè)或兩個(gè)以上程序單元的條件為真時(shí)指定執(zhí)行優(yōu)先級(jí)。但程序員事先一般不知道哪些程序可能與其程序交互作用。
我們以前專門為電信業(yè)務(wù)開發(fā)了一種非過程語言(參見分別于1987年9月22日、1988年2月23日和1988年5月24日授予T.L.Hansen等人的題為“利用非過程語言的實(shí)時(shí)系統(tǒng)控制”、“利用非過程語言的實(shí)時(shí)系統(tǒng)狀態(tài)控制”和“客戶可編程實(shí)時(shí)系統(tǒng)”的美國專利4695977、4727575和4747127,所有這些專利通過引用結(jié)合于本文中)。然而,由于先有工作既不足夠嚴(yán)密以便自動(dòng)檢測(cè)特征交互作用,也未為程序員提供解決特征交互作用而又無需更改現(xiàn)有代碼的工具軟件,因此,該語言提供的結(jié)構(gòu)和實(shí)用工具與本方法有很大的不同。
附圖簡述
圖1顯示了模型、程序單元、錨特征、特征和特征程序包(featurepackage)之間的關(guān)系;圖2顯示了域數(shù)據(jù)類型示例;圖3顯示了事件類型示例;圖4顯示了電話呼叫處理應(yīng)用程序的模型語句示例;圖5a顯示了程序單元集的公共條件語句;圖5b顯示了公共事件語句;圖5c顯示了幾個(gè)條件和事件語句對(duì)的公共程序體;圖6顯示了程序單元示例;圖7a和7b顯示了優(yōu)先順序列表示例及其到程序單元的轉(zhuǎn)換;圖7a顯示了將直接-優(yōu)先順序列表轉(zhuǎn)換成程序單元的示例;圖7b顯示了將優(yōu)先級(jí)-優(yōu)先順序列表組轉(zhuǎn)換成程序單元的示例;圖8顯示了特征示例;圖9顯示了特征程序包示例;圖10顯示了模型擴(kuò)展示例;圖11a和11b顯示了特征擴(kuò)展;圖12顯示了使用此方法開發(fā)軟件的過程,它說明使用此方法進(jìn)行并行開發(fā);圖13給出了算法1的流程圖,該算法檢查兩個(gè)程序單元之間簡單的交互作用條件;圖14顯示了算法2的流程圖,該算法檢查兩個(gè)簡單謂詞(predicate)公式的合取是否能被滿足;圖15顯示流程3的流程圖,該算法檢查在析取范式中的項(xiàng)是否能被滿足;圖16顯示了關(guān)聯(lián)CSR中域變量、其位置和使用它的謂詞函數(shù)集的表格;圖17顯示了關(guān)聯(lián)ESRP中事件限定字段、其位置以及使用其謂詞函數(shù)集的表格;圖18顯示了算法5的流程圖,該流程圖描述了在執(zhí)行特征程序包的初始階段的運(yùn)行時(shí)系統(tǒng);圖19顯示了算法6的流程圖,該流程圖描述了收到事件時(shí)的運(yùn)行時(shí)系統(tǒng);圖20顯示了算法7的流程圖,該流程圖描述了程序單元返回時(shí)的運(yùn)行時(shí)系統(tǒng);圖21顯示了處理異常的程序單元示例,所述異常指執(zhí)行運(yùn)行時(shí)遇到未被特征中其它程序單元所覆蓋的條件。
優(yōu)選實(shí)現(xiàn)例的詳細(xì)說明使用現(xiàn)有技術(shù)的情況下,程序員需要增加改變現(xiàn)有代碼控制流程的新功能時(shí),程序員面臨兩種選擇。如果實(shí)現(xiàn)語言是諸如C、C++或Java等過程語言,則程序員將不得不進(jìn)行大量處理以更改現(xiàn)有代碼。如果實(shí)現(xiàn)語言是諸如CLIPS等非過程語言,則程序員幾乎無法控制新功能與現(xiàn)有代碼的交互作用方式。
在現(xiàn)有軟件開發(fā)方法中,程序員將新功能作為一項(xiàng)特征來開發(fā)。程序員通過計(jì)算機(jī)輔助過程開發(fā)其特征,并將開發(fā)的特征與其它特征程序包成。程序員將特征程序包交由一種工具處理,這種工具自動(dòng)確定這些特征交互作用的條件。隨后,程序員指定在特征程序包中應(yīng)如何解決這些交互作用條件。因?yàn)闆]有修改原先的特征,所以可將它們視為可重用的庫組件。
因此,本方法允許增加新功能到現(xiàn)有代碼中,這是一種自動(dòng)化方法或工具,可識(shí)別程序員應(yīng)如何將新功能與現(xiàn)有代碼合并,以允許利用動(dòng)態(tài)執(zhí)行流程來重用組件,而使程序員的工作較容易。
上述軟件開發(fā)方法由下列四個(gè)組成部分支持(1)軟件開發(fā)過程;(2)非過程編程語言結(jié)構(gòu)集;(3)確定特征程序之間交互作用條件的算法;以及(4)執(zhí)行以所述編程語言編寫的特征程序的運(yùn)行時(shí)系統(tǒng)。
我們將先討論語言結(jié)構(gòu)和使用語言結(jié)構(gòu)得到的軟件組件。然后描述軟件開發(fā)過程,接著描述交互作用檢測(cè)算法與運(yùn)行時(shí)系統(tǒng)。必需的軟件組件和語言結(jié)構(gòu)以我們的編程語言實(shí)現(xiàn)的可執(zhí)行應(yīng)用程序是合式(well-formed)特征程序包。特征程序包由特征程序包、程序單元和可能的其它特征程序包組成。每種特征又由一組程序單元和其它可能的特征組成。
程序單元是執(zhí)行單元。它由條件部分和主體部分組成。程序單元的主體部分在條件部分為真時(shí)執(zhí)行。主體部分將執(zhí)行一些操作,并可調(diào)用以其它語言編寫的程序。條件部分中的規(guī)格引用模型中定義的變量。
模型是應(yīng)用程序的表現(xiàn)形式。它定義了一組域變量和接口事件,這些域變量和接口事件由實(shí)現(xiàn)應(yīng)用的各種特征的模型的程序使用。用于枚舉電話應(yīng)用的IDLE、TALKING和其它狀態(tài)的狀態(tài)變量是域變量的示例。如用于終止電話呼叫的“終止請(qǐng)求”消息是接口事件示例。
特征和特征程序包是組織概念。特征包含程序單元集,而特征程序包包含一組特征。人們把特征視為特征,例如“呼叫等待”或POTS(老式電話服務(wù))等。特征程序包是具有一組特征的應(yīng)用程序。程序單元是執(zhí)行單元,而特征則是重用單元。程序員可組合不同的特征組以構(gòu)成不同的特征程序包。程序員甚至可分別解決特征之間的交互作用而利用同一特征組創(chuàng)建不同的特征程序包。
我們要求特征中所有程序單元的條件部分以同一模型中定義的變量來表示。因此,我們說特征引用特定的模型。我們還要求同一特征程序包中的所有特征引用同一模型。換言之,特征程序包內(nèi)的所有程序引用同一模型。這些軟件概念之間的關(guān)系如圖1所示。本部分描述這些軟件概念中的每個(gè)概念。我們從模型觀念開始。
模型模型語句使用關(guān)鍵字Model和名稱來識(shí)別。它包含域變量(其初始值)和事件接口的定義。它們用于定義程序單元的條件部分。
域變量域變量屬于布爾(BOOLEAN)類型或域數(shù)據(jù)類型,布爾類型的變量可取值TRUE(真)或值FALSE(偽)。
域數(shù)據(jù)類型域數(shù)據(jù)類型類似于C++或Java中的類。除了象在類中那樣定義數(shù)據(jù)集和針對(duì)這些數(shù)據(jù)的運(yùn)算外,域數(shù)據(jù)類型還定義了謂詞函數(shù)集和一個(gè)組合函數(shù)。
謂詞函數(shù)作用于一個(gè)或多個(gè)域類型變量,并返回布爾值。例如,整數(shù)的域數(shù)據(jù)類型將包含確定整數(shù)變量是否為正值、兩個(gè)整變量是否相等、一個(gè)整變量是否大于另一個(gè)整變量等謂詞函數(shù)。我們使用以下術(shù)語具有特定域變量的謂詞函數(shù)是謂詞;謂詞或布爾類型的域變量是原子;原子或它的“非”為字母符號(hào)。
給定域數(shù)據(jù)類型的字母符號(hào)集的合取,則其組合函數(shù)返回該合取是否能被滿足的結(jié)果。如果存在布爾公式的字母符號(hào)的一種真值分配使得公式為真,則該布爾公式是能被滿足的。在一種實(shí)現(xiàn)方式中,組合函數(shù)可將字母符號(hào)列表作為輸入。我們注意到圖2中給出的整數(shù)域數(shù)據(jù)類型示例除增加了組合函數(shù)以外,幾乎與B.Stroustrup所著、Addison-Wesley出版社于1997年出版的“C++編程語言”第三版中第8頁中給出的整數(shù)類相同。
域變量的無關(guān)性要求我們要求域變量彼此無關(guān)。也就是說,域變量的值不可為其它域變量的函數(shù)。換言之,如果域變量是在賦值語句的左側(cè),則在同一賦值語句的右側(cè)不會(huì)有其它域變量或另一域變量的派生變量。我們的編譯器會(huì)檢查這種情況。
有關(guān)組合函數(shù)的更多情況實(shí)現(xiàn)組合函數(shù)的直接方法會(huì)是產(chǎn)生輸入合取的真值表,但這可能導(dǎo)致許多情況。給定域變量的無關(guān)性和域數(shù)據(jù)類型謂詞函數(shù)的屬性,則可以經(jīng)常開發(fā)用于組合函數(shù)的有效算法。
例如,考慮整數(shù)的域數(shù)據(jù)類型及其通常的謂詞函數(shù)“等于”、“大于”、“大于或等于”、“小于”和“小于或等于”。這些謂詞函數(shù)確定了在它們中使用的域變量的偏序。組合函數(shù)算法將按謂詞指定的那樣將域變量排序,并檢查諸如一個(gè)變量同時(shí)大于和小于另一變量之類的茅盾情況。
存在針對(duì)普通域數(shù)據(jù)類型的有效算法,如枚舉、集合、樹和有序或鏈接表。
事件接口接口定義了事件類型集。賦予每個(gè)事件類型唯一的名稱和數(shù)據(jù)結(jié)構(gòu)。一些數(shù)據(jù)結(jié)構(gòu)字段可確定為限定變量。限定變量類似于域變量,是布爾類型或域數(shù)據(jù)類型的變量。圖3顯示了舉電話“Termination_request”消息作為事件類型示例。該消息攜帶作為限定變量的主叫方號(hào)碼。
將事件發(fā)送到特征程序包的實(shí)例。事件可來來自程序包中的程序單元,或來自程序包外的某個(gè)程序。期待特定事件的程序單元在事件語句中將該事件指定為其條件部分的組成部分。
圖4提供了實(shí)現(xiàn)電話呼叫處理系統(tǒng)的模型示例。
模型為程序單元條件部分中的規(guī)格定義了公開域。下面更詳細(xì)描述程序單元。
程序單元程序員使用關(guān)鍵字unit(單元)和名稱來識(shí)別程序單元。屬于同一特征的程序單元具有唯一的名稱。
每個(gè)程序單元由條件部分和程序體部分組成。
程序單元的條件部分條件部分由條件語句和事件語句組成。
條件語句條件語句是域變量原子的布爾公式。換言之,條件語句是一階謂詞公式,但我們不使用存在和通用的量詞。程序員需要指定象“集合中存在元素”之類的信息時(shí),我們要求程序員指定域數(shù)據(jù)類型“集合”的謂詞函數(shù),例如non-empty(x)。我們下面將這種公式稱為簡化謂詞公式。
我們遵循的慣例是,當(dāng)模型中定義的原子未在條件語句中使用時(shí),原子的值不影響條件語句的真值。換言之,原子是“無關(guān)項(xiàng)”。
事件語句事件語句識(shí)別特征模型語句中定義的接口事件類型列表。
列表中的每個(gè)事件可與有關(guān)事件限定變量的、稱為限定條件的布爾公式相關(guān)聯(lián)。所以,這也是簡化的謂詞公式。如果事件出現(xiàn)并且該事件攜帶的限定變量值滿足限定條件,則該事件語句為真。如果未指定限定條件,則事件出現(xiàn)時(shí)限定條件為真。
作為一種簡便形式,程序員可指定用關(guān)鍵字“任何”來表示,當(dāng)模型中定義的任何事件出現(xiàn)時(shí)事件語句為真。程序員可將“任何”附加到限定條件中。在這種情況下,在具有滿足限定條件的限定變量的任何事件出現(xiàn)時(shí),事件語句為真。
程序員也可指定關(guān)鍵字“空”表示程序單元未在等待事件。因此,程序單元的條件語句一為真,就會(huì)執(zhí)行程序體。
如果評(píng)估時(shí)在給定域變量值的情況下條件語句的布爾值為真,則該條件語句為真。如果列表中的任何接口事件為當(dāng)前事件且有關(guān)其限定變量的布爾公式為真,則該事件語句為真。如果事件已由運(yùn)行時(shí)系統(tǒng)接收但尚未處理,則該事件是當(dāng)前事件,在評(píng)估時(shí)被視為最高優(yōu)先級(jí)的事件。我們將在描述運(yùn)行時(shí)系統(tǒng)時(shí)給出當(dāng)前事件的更全面的定義。程序單元的條件語句和事件語句都為真時(shí),程序單元就就緒,準(zhǔn)備執(zhí)行。
程序單元的條件部分可以圖形方式說明。例如,條件語句可用維恩圖(Venn diagram)說明或用D.Harel所著的題為“關(guān)于視覺形式主義”(“On Visual Formalism,”D.Harel,Communications of theACM,May,1998)的論文中第11頁中所述的一種形式更復(fù)雜的系統(tǒng)來說明。
簡要地說,我們?cè)试S程序員只為程序單元組聲明公共條件語句或事件語句一次。圖5a給出的示例顯示了具有相同條件語句的兩個(gè)程序單元。圖5b給出的示例顯示了具有相同事件語句的兩個(gè)程序單元。程序員還可能想將同一程序體部分應(yīng)用于不同的條件語句和事件語句對(duì)。我們?cè)试S對(duì)其中條件語句將顯示條件與事件語句對(duì)析取的這種情況的簡便表示形式。圖5c提供了示例。
程序體部分程序體部分包含諸如賦值語句、過程調(diào)用、迭代語句等常規(guī)程序語句,包括程序單元局部變量的聲明和操作。如同C和C++中的用法一樣,這些局部變量可以是自動(dòng)或靜態(tài)的。自動(dòng)變量在程序單元執(zhí)行時(shí)存在,而一旦程序單元退出則消失;靜態(tài)變量在程序單元退出后保持其值。程序體中的程序語句可更新域變量,發(fā)送模型系統(tǒng)內(nèi)或外的接口事件,或者調(diào)用用其它語言程序描述的程序。圖6給出了電話應(yīng)用程序的程序單元示例。它只指出如果電話處于DIALING(撥號(hào))狀態(tài)且收到掛機(jī)事件,則交換系統(tǒng)應(yīng)釋放數(shù)字接收器并將電話置于IDLE(空閑)狀態(tài)。
程序體更新域變量或者發(fā)送接口事件時(shí),它可使一些其它程序單元的條件部分(甚至其本身)為真。因?yàn)殚_發(fā)過程中檢測(cè)并解決特征交互的綜合效果以及運(yùn)行時(shí)系統(tǒng)的設(shè)計(jì),一次最多只有一個(gè)程序單元的條件部分為真。因此,我們可選擇繼續(xù)執(zhí)行當(dāng)前程序體或者進(jìn)行切換以執(zhí)行條件部分正好為真的程序單元。我們選擇了前者。換言之,我們考慮程序體原子的執(zhí)行。從當(dāng)前程序體發(fā)送的事件保持在隊(duì)列中。只有在我們退出當(dāng)前程序體后,我們才可使用域變量的最新值評(píng)估其它程序單元的條件部分。在描述運(yùn)行時(shí)系統(tǒng)時(shí),我們將回到此主題并進(jìn)行更詳細(xì)的描述。
編寫程序單元是為了實(shí)現(xiàn)應(yīng)用程序的某種特征。我們現(xiàn)在開始描述特征。
特征我們區(qū)分了兩種類型的特征錨特征和附加特征。錨特征提供了應(yīng)用程序的起點(diǎn)。附加特征為應(yīng)用程序增加新功能。再次以電話技術(shù)為例,實(shí)現(xiàn)一般舊式電話服務(wù)(POTS)的程序單元將被組織為錨特征,而實(shí)現(xiàn)三方通話服務(wù)的程序單元將被組織為附加特征。
錨特征的特殊要求我們要求相對(duì)于模型中定義的域變量初始值,屬于錨特征的至少一個(gè)程序單元的條件部分為真。
附加特征的特殊要求附加特征必須識(shí)別至少一個(gè)錨特征,并且附加特征的至少一個(gè)程序單元必須與該附加特征引用的每個(gè)錨特征的一個(gè)程序單元交互作用。
編譯器可檢查這兩個(gè)要求。我們后面將描述確定兩個(gè)程序單元是否因附加特征要求而交互作用的算法。檢查錨特征要求是簡單明了的。
下面,我們?cè)敿?xì)描述錨特征的概念。描述附加特征時(shí),我們將只突出它與錨特征的不同之處。
錨特征程序員使用關(guān)鍵詞錨特征和名稱來確定錨特征。錨特征由兩部分組成引用申明和程序單元列表。一種特征可接受僅由該特征內(nèi)的程序單元使用的按值傳遞變?cè)斜怼?br>
引用申明此處,程序員聲明特征使用的模型。另外,程序員可聲明并初始化僅由特征內(nèi)的程序單元使用以及用于變?cè)木植孔兞?。在特征程序包?chuàng)建時(shí)為這些變量分配了空間,直至特征程序包退出。
程序單元列表程序單元列表識(shí)別屬于特征的程序單元。程序員不指定程序單元的執(zhí)行流程,但可為屬于特征的一部分程序單元指定優(yōu)先順序。
程序單元的優(yōu)先順序當(dāng)兩個(gè)程序單元的條件部分同時(shí)為真時(shí),如果它們按序執(zhí)行,則稱這兩個(gè)程序單元具有優(yōu)先順序關(guān)系。如果優(yōu)先順序列表中有幾個(gè)程序單元,則程序單元之間的關(guān)系是偏序。
可以設(shè)計(jì)不同種類的優(yōu)先順序列表以保持程序單元之間的優(yōu)先順序關(guān)系。例如,程序單元P1、P2和P3的直接優(yōu)先順序(P1、P2、P3)(straight-precedence(P1、P2、P3))表示如果P1和P3的條件部分為真,則只執(zhí)行P1的程序體。另一方面,優(yōu)先級(jí)優(yōu)先順序(P1、P3、P3)(priority-precedence(P1、P3、P3))表示如果P1和P3的條件部分為真,則P1和P3的程序體將按指定的順序執(zhí)行。
一個(gè)程序單元可出現(xiàn)在不止一個(gè)優(yōu)先順序列表中。因此,不在同一優(yōu)先程序列表中的兩個(gè)程序單元可能仍有優(yōu)先順序關(guān)系。程序員可能指定了不一致的優(yōu)先順序關(guān)系,如在一個(gè)列表中指定P1優(yōu)先于P2,但在另一列表中指示P2優(yōu)先于P1。由于所有優(yōu)先順序列表指定了偏序,編譯器因此可查出這種不一致。用于此目的的算法是眾所周知的,例如可參閱“計(jì)算機(jī)編程技術(shù),第1卷,基本算法”(D.E.Knuth,“The Art of Computer Programming,Volume 1,F(xiàn)undamental Algorithms,”Addison-Wesley Publishing Company,1973)。
優(yōu)先順序列表的語義也可導(dǎo)致不一致。例如,假設(shè)我們具有直接優(yōu)先順序(P1、P2、P3)和優(yōu)先級(jí)優(yōu)先順序(P1、P3、P4)。在P1和P3的條件部分同時(shí)為真時(shí),直接優(yōu)先順序列表要求在P1后停止執(zhí)行,但優(yōu)先級(jí)優(yōu)先順序列表要求繼續(xù)執(zhí)行P3。因此,優(yōu)先順序列表的設(shè)計(jì)應(yīng)通過確定語義不一致的有效方法完成。
將優(yōu)先順序列表編寫為程序單元可以按如下所示,將優(yōu)先順序列表重新編寫為程序單元集。新程序單元的條件語句是列表中程序單元的條件和事件語句對(duì)的析取。其程序體包含將執(zhí)行列表中程序單元相應(yīng)程序體的條件語句。圖7(a)過程來直接優(yōu)先順序列表的示例,而圖7(b)給出了優(yōu)先級(jí)優(yōu)先順序列表的示例。
我們正在討論的是可使程序單元集和優(yōu)先順序列表等效。
程序單元交互作用與合式特征當(dāng)且僅當(dāng)屬于同一特征的兩個(gè)程序單元具有優(yōu)先順序關(guān)系且其條件部分可同時(shí)為真時(shí),它們才交互作用。后面將給出檢測(cè)特征交互作用的算法。
在我們的系統(tǒng)中,如果未解決兩個(gè)程序單元之間的交互作用,則運(yùn)行時(shí)系統(tǒng)將無法在兩個(gè)程序單元的條件部分都為真時(shí)確定執(zhí)行哪一個(gè)程序。程序員可使用多種方法來解決兩個(gè)程序單元之間的交互作用,如將它們置于優(yōu)先順序列表中并重新編寫其條件部分。不具有交互作用的程序單元的特征稱為合式特征。
附加特征程序員使用關(guān)鍵字附加特征和名稱來確定特征。
附加特征類似于錨特征,但有三個(gè)不同之外。(1)附加特征必須在其引用申明中識(shí)別其錨特征。(2)在給定域變量的初始值時(shí),特征不需要使其一些程序單元的條件語句為真。(3)附加特征應(yīng)可從其錨特征達(dá)到。如果調(diào)用B后,存在會(huì)導(dǎo)致A中的一些程序單元被執(zhí)行的計(jì)算,則特征A可從特征B達(dá)到??蓮腻^特征達(dá)到附加特征的必要條件是在錨特征中存在一個(gè)程序單元以及在附加特征中存在一個(gè)程序單元,這樣,這兩個(gè)程序單元的條件語句析取可被滿足。
圖8給出了附加特征示例。它實(shí)現(xiàn)“呼叫轉(zhuǎn)移”電話特征。該示例顯示了激活和去激活特征的程序單元以及在指定了呼叫轉(zhuǎn)移號(hào)碼且呼入不是來自轉(zhuǎn)移號(hào)碼時(shí)轉(zhuǎn)移呼入的程序單元。
合式錨特征本身是可執(zhí)行的。但程序員通常將若干特征組成特征程序包以便為應(yīng)用提供豐富特征。
特征程序包程序員使用關(guān)鍵字特征程序包和名稱來識(shí)別特征程序包。特征程序包可接受變?cè)斜?。變?cè)獌H按值傳遞。
特征程序包包含了引用申明和程序單元列表。
特征程序包引用申明在特征程序包的這一部分中,程序員指定該程序包中包括的所有程序和特征列表所用的模型。特征列表必須包括至少一個(gè)錨特征,并且程序包中的所有特征必須引用程序包中的至少一個(gè)錨特征。編譯器檢查這兩個(gè)要求。特征程序包可在其特征列表中包括另一特征程序包。特征程序包的包含關(guān)系是偏序(partial ordering)。編譯器可有效地檢查兩個(gè)特征程序包(傳遞性地)彼此包含時(shí)的循環(huán)包含。
此外,程序員可定義特征程序包中的程序使用的變?cè)途植孔兞康念愋汀?br>
程序單元的特征程序包列表程序單元列表識(shí)別屬于特征程序包的程序單元。這些程序單元的一個(gè)重要目的是解決特征之間的交互作用。因此,程序單元列表可包括程序單元的優(yōu)先順序列表和特征的優(yōu)先順序列表,這兩個(gè)列表都是為程序單元解決交互作用的便捷方式。我們已經(jīng)描述了程序單元的優(yōu)先順序列表。
特征的優(yōu)先順序列表程序員使用特征的優(yōu)先順序列表來指定不同特征中程序單元之間的優(yōu)先順序關(guān)系。如果特征F1優(yōu)先于特征F2,則如果屬于F1的程序單元P1的條件部分和屬于F2的另一程序單元P2的條件部分同時(shí)為真,則P1將在P2前執(zhí)行。
類似于程序單元的優(yōu)先順序列表,可為特征指定不同類型的優(yōu)先順序列表。例如,特征F1、F2和F3的直接優(yōu)先順序(F1、F2、F3)表示,如果F1和F3中某些程序單元的條件部分為真,則將執(zhí)行F1中單元的程序體。優(yōu)先級(jí)優(yōu)先順序(F1、F2、F3)表示如果F1和F3中某個(gè)程序單元的條件部分為真,則將按指定的順序執(zhí)行F1和F3中單元的程序體。特征的優(yōu)先順序列表并不會(huì)更改各特征的優(yōu)先順序列表指定的優(yōu)先順序關(guān)系??梢陨商卣骱统绦騿卧膬?yōu)先順序列表指定的所有程序單元的偏序,但這并不重要。
編譯器可檢查這些列表中的不一致。
特征交互作用與合式特征程序包當(dāng)且僅當(dāng)兩種特征F1和F2不具有優(yōu)先順序關(guān)系且F1中的程序單元與F2中的程序單元交互作用時(shí),它們才交互作用。程序員可以通過將交互作用的特征或交互作用的程序單元置于優(yōu)先順序列表中來解決特征交互作用。或者,程序員可為特征程序包編寫程序單元,條件是這兩個(gè)程序單元交互作用以解決交互作用。建議不要通過修改特征程序單元來解決交互作用。
如果特征程序包的程序單元彼此均不交互作用且其任何特征彼此均不交互作用,則特征程序包是合式的。合式特征程序包是可執(zhí)行的。
圖9給出了將POTS、呼叫轉(zhuǎn)移和免打擾電話特征組合起來的特征程序包示例。優(yōu)先順序列表為特征程序包的程序單元賦予優(yōu)先級(jí),然后為免打擾(Do-Not-Disturb)、呼叫轉(zhuǎn)移(Call-Forwarding)以及POTS的程序單元賦予優(yōu)先級(jí)。在收到終止請(qǐng)求(Termination-Request)事件時(shí),既可調(diào)用免打擾又可調(diào)用呼叫轉(zhuǎn)移。根據(jù)主叫方是否為特權(quán)組(privileged set)成員,“交互作用解決”程序單元通過轉(zhuǎn)移呼叫或者返回免打擾操作來解決交互作用。
隨著時(shí)間推移,即使是設(shè)計(jì)良好的模型也可能變得不合適。例如,程序員可能想在電話線上的發(fā)語音和數(shù)據(jù)業(yè)務(wù)。原純語音電話模型將不再合適。當(dāng)發(fā)生這種情況時(shí),新模型就成了必需,但程序員可能仍然想要重用采用原模型實(shí)現(xiàn)的現(xiàn)有特征代碼。
為支持重用,我們的方法允許通過擴(kuò)展舊模型而開發(fā)新模型以及擴(kuò)展使用舊模型的現(xiàn)有特征和特征程序包而開發(fā)新特征和特征程序包。
擴(kuò)展擴(kuò)展的目的是重用為現(xiàn)有模型編寫的特征。擴(kuò)展有兩種層次從原模型創(chuàng)建新模型;以及重用為原模型編寫的現(xiàn)有特征而為擴(kuò)展的模型創(chuàng)建特征程序包。
模型擴(kuò)展通過增加新域變量或接口事件以及擴(kuò)展現(xiàn)有域變量或接口事件的定義,程序員可擴(kuò)展原模型。
在擴(kuò)展現(xiàn)有域變量或接口事件的定義時(shí),程序員可將新元素增加到現(xiàn)有定義中,或者擴(kuò)展域變量或限定條件的值范圍。作為將新元素增加到現(xiàn)有定義中的示例,可考慮圖3中所示的模型示例的“終止請(qǐng)求”事件。該事件的現(xiàn)有數(shù)據(jù)結(jié)構(gòu)可只包含一個(gè)字段即“主叫方”。擴(kuò)展的定義可增加新的“服務(wù)類型”字段以識(shí)別主叫方是在請(qǐng)求語音連接還是數(shù)據(jù)連接。作為增加現(xiàn)有定義值范圍的示例,程序員可將值“POST-ANNOUNCEMENT”(“通知后”)增加到枚舉集合中,該枚舉集合定義圖4的模型示例中使用的域變量“狀態(tài)”的值范圍的。
我們要求程序員既不能刪除現(xiàn)有元素也不能縮小現(xiàn)有的值范圍。程序員使用以下語法來說明對(duì)現(xiàn)有模型的擴(kuò)展Model new-model-name extends existing-model-name{Domain variables/*新域變量的定義和/或現(xiàn)有域變量定義的擴(kuò)展*/Interface events/*新接口事件的定義和/或現(xiàn)有接口事件定義的擴(kuò)展*/};在上述語句中,Model(模型)和extends(擴(kuò)展)是關(guān)鍵字,而new-model-name(新模型名稱)和existing-model-name(現(xiàn)有模型名稱)分別是新模型和原模型的名稱。
擴(kuò)展模型包括現(xiàn)有模型中定義的所有域變量和接口事件。這些域變量和接口事件可具有新元素或附加的值范圍。另外,擴(kuò)展的模型可具有新域變量和接口事件。新的增加內(nèi)容和現(xiàn)有定義全部可用于使用擴(kuò)展模型的程序單元。
圖10給出了基于(純語音)電話模型建立的語音和數(shù)據(jù)呼叫的模型擴(kuò)展示例。新模型擴(kuò)展了語音連接STATE域數(shù)據(jù)類型。它增加了數(shù)據(jù)連接狀態(tài)的新域變量并定義了新的數(shù)據(jù)接口事件。
特征擴(kuò)展在指定擴(kuò)展模型之后,程序員可以在擴(kuò)展模型的特征程序包中重用為原模型編寫的特征。為此,程序員將重用的特征包括在新特征程序包的特征列表中。重用特征的程序單元成為新特征的程序單元。保持了重用特征的程序單元之間的優(yōu)先順序關(guān)系。新模型的新域變量和接口事件以及新變量元素或擴(kuò)展的值范圍都是這些重用程序單元的“無關(guān)項(xiàng)”。
程序員可通過以下方式在特征列表的特征名稱旁附加限定條件,為重用特征增加有關(guān)新域變量和接口事件的條件特征重用特征{限定條件},另一特征;此上下文中的限定條件由兩個(gè)語句組成條件語句和事件列表,它們是以與說明程序單元中的那些條件語句和事件列表相同的語法來描述的。限定條件修改了重用特征程序單元的條件部分。其事件語句中的事件列表現(xiàn)在將包括在限定條件中指定的事件。如果程序員將符號(hào)AND(邏輯“與”)設(shè)置在限定條件的條件語句前,則程序單元的限制語句變?yōu)槠湓瓧l件語句與限定條件的條件語句的合取。如果程序員將符號(hào)OR(邏輯“或”)設(shè)置在限定條件的條件語句前,則程序單元的條件語句變?yōu)閮蓚€(gè)條件語句的析取。程序員將通過以下方式將不同的限定條件附加到重用特征的不同一部分程序單元Featurereused-feature{program-uni1,program-unit2){qualification1},{(program-uni3,program-unit4…program-unitN){qualification2}}圖11a和11b給出了重用原模型的POTS的圖10的擴(kuò)展模型的特征示例。新模型利用了讓用戶指定PIN的擴(kuò)展模型能力。然后,它利用了擴(kuò)展模型的新POST-ANNOUNCEMENT狀態(tài),以驗(yàn)證主叫方是否能在15秒內(nèi)輸入正確的PIN。
軟件開發(fā)過程軟件開發(fā)過程包括這些步驟(A)程序員開發(fā)應(yīng)用模型。
(B)根據(jù)該模型,程序員開發(fā)一組錨特征。
(C)在編寫錨特征的每個(gè)程序單元時(shí),調(diào)用交互作用檢測(cè)工具以檢查新完成的程序單元是否與以前完成的程序單元交互作用?;蛘?,在完成一部分程序單元后可調(diào)用交互作用檢測(cè)過程以檢查可能的交互作用。
(D)程序員解決錨特征的程序單元之間的特征交互作用。當(dāng)特征交互作用檢測(cè)工具在錨特征的程序單元之間找不到特征交互作用時(shí),該錨特征就是合式錨特征。合式錨特征是可執(zhí)行的。
(E)根據(jù)該模型和一個(gè)或多個(gè)錨特征,程序員開發(fā)一組附加特征。
(F)對(duì)于每個(gè)附加特征,其程序員應(yīng)用交互作用檢測(cè)和解決過程序,直至已解決特征的程序單元之間的所有交互作用,從而使特征成為合式特征。
(G)模型的合式特征和附加特征的集合是庫組件。程序員為特征程序包挑選一組錨特征和附加特征(后面我們將把它們統(tǒng)稱為特征)。
(H)程序員調(diào)用特征交互作用檢測(cè)過程以檢查特征程序包中包括的一組特征彼此是否交互作用。
(I)程序員解決交互作用。在解決所有特征交互作用之后,特征程序包稱為合式特征程序包,合式特征程序包是可執(zhí)行的。
這種開發(fā)過程描述為圖12所示的流程圖。我們注意到錨特征可獨(dú)立開發(fā)而不需要更改其它錨特征。同樣地,附加特征可彼此獨(dú)立地實(shí)現(xiàn)。在將一些特征組成一個(gè)特征程序包時(shí)就出現(xiàn)了特征的集成。即使特征可能更改彼此的執(zhí)行流程,將特征組成特征程序包也不需要更改特征代碼。
編寫擴(kuò)展模型及其特征和特征程序包的開發(fā)過程與前述過程相同。
交互作用檢測(cè)我們?cè)趦煞N情況下執(zhí)行交互作用檢測(cè)。首先,我們檢查同一特征中程序單元之間的交互作用。其次,在將一個(gè)合式特征中的任一程序單元與另一特征中的另一程序單元一起置于特征程序包中時(shí),我們檢查它們是否交互作用。這一部分我們描述執(zhí)行兩個(gè)程序單元交互作用檢測(cè)的過程。
程序交互作用條件早先,我們這樣定義交互作用的兩個(gè)程序當(dāng)把兩個(gè)程序合在一起時(shí),其中一個(gè)程序會(huì)更改另一程序的執(zhí)行流程。假定采用我們的編程語言結(jié)構(gòu)語義和運(yùn)行時(shí)系統(tǒng),則當(dāng)且僅當(dāng)兩個(gè)程序的條件部分可同時(shí)為真,且這兩個(gè)程序沒有優(yōu)先順序關(guān)系時(shí),才說明它們交互作用。
雖可以檢查上述條件,但它涉及證明“可達(dá)性”,這需要大量計(jì)算。我們使用下面充分條件來代替。
簡單的交互作用條件(SIC)如果兩個(gè)程序單元交互作用,則(1)它們等待同一事件并且其相對(duì)于該事件的限定條件的合取是能被滿足的;(2)其條件語句的合取是能被滿足的;以及(3)它們沒有優(yōu)先順序關(guān)系。
交互作用檢測(cè)算法給定兩個(gè)程序單元X和Y,以下算法可檢查其SIC。
算法1<pre listing-type="program-listing"><![CDATA[If(X和Y具有優(yōu)先順序關(guān)系)注釋1 then return(無SIC); else{ if(X和Y的事件列表不包含相同的事件) then return(無SIC); else{ for(每個(gè)公共X和Y事件) 注釋2 check(其限定條件的合取 是否能被滿足); if(限定條件合取不能被滿足)then return(無SIC);else{check(X和Y的條件注釋3 語句的合取是否能被滿足); if(不能被滿足) then return(無SIC); else(報(bào)告條件語句和限定條件的合取為SIC條件); } } }]]></pre>圖13提供了算法1的流程圖。
要確定兩個(gè)程序單元是否具有優(yōu)先順序關(guān)系(算法1中的注釋1)相對(duì)簡單。優(yōu)先順序關(guān)系是偏序的,并且可通過分析優(yōu)先順序列表容易地確定(參閱例如“計(jì)算機(jī)編程技術(shù),第1卷”(D.E.Knuth,“The Art of Computer Programming,Volume 1,F(xiàn)undamentalAlgorithms,”Addison-Wesley Company)以了解處理偏序的方法)。
算法1中的注釋2和注釋3確定是否需要執(zhí)行過程以確定兩個(gè)簡化謂詞公式,即M和N的合取是否能被滿足。算法2解決了該問題。
算法2步驟1導(dǎo)出M的析取范式D(M);步驟2導(dǎo)出N的析取范式D(N);步驟3對(duì)于D(M)中的每項(xiàng),檢查其與D(N)中每項(xiàng)的合取是否能被滿足;我們將合取結(jié)果的第i項(xiàng)表示為E(M,N)(i)。
步驟4If(步驟3中檢查的E(M,N)(i)無一能被滿足)then return(M和N的合取不能被滿足)else return(M和N的合取能被滿足,并帶有關(guān)于步驟3中確定的所有能被滿足的合取的報(bào)告)。
圖14中提供了算法2的流程圖。
給定布爾公式,導(dǎo)出其析取范式的過程是眾所周知的。析取范式寫為一組組件的析取,即“C1C2…Cn”,其中,每個(gè)組件Ci是字母符號(hào)或字母符號(hào)邏輯“非”的合取,例如“p1Λ~p2Λp3”。
為評(píng)估步驟3,我們注意到E(M,N)(i)中使用的唯一邏輯運(yùn)算符是結(jié)合性的合取。因此,我們可根據(jù)它們是否屬于同一域數(shù)據(jù)類型而重排E(M,N)(i)的字母符號(hào)。隨后,對(duì)于每組謂詞字母符號(hào),我們調(diào)用其域數(shù)據(jù)類型的組合函數(shù)。
我們還注意到(1)同一變量例如A的合取由(A AND A)=A;(A AND~A=FALSE;(~A AND~A)=~A給出。(2)兩個(gè)不同的布爾變量在無關(guān)時(shí)其合取能被滿足。(3)布爾字母符號(hào)本身是能被滿足的。因此,我們可使用以下過程評(píng)算法2的步驟3。
算法31.對(duì)于每個(gè)E(M,N)(i),將屬于同一域數(shù)據(jù)類型的字母符號(hào)組合在一起。
2.使用各自的組合函數(shù)來評(píng)估各組,或者在它們是布爾變量的情況下尋找不一致。如果任一組評(píng)為FALSE,則返回(不能被滿足),否則返回(能被滿足)。
利用此算法,我們說明一種檢測(cè)兩個(gè)程序單元之間SIC的方法。
圖15給出了算法3的流程圖。
聯(lián)合應(yīng)用算法1、2和3確定兩個(gè)程序單元是否交互作用。如果證明兩個(gè)程序單元為交互作用,則算法2的步驟4確定它們交互作用的條件。
概括此部分,SIC是充分條件。當(dāng)發(fā)現(xiàn)兩個(gè)程序單元不具有SIC時(shí),則它們屬于同一優(yōu)先順序列表或者其條件部分無法同時(shí)為真。這適用于合式特征或特征程序包中的任何兩個(gè)程序單元。
運(yùn)行時(shí)系統(tǒng)運(yùn)行時(shí)系統(tǒng)的作用是管理程序單元的執(zhí)行。不失一般性,我們語言中的可執(zhí)行對(duì)象為合式特征程序包。如果特征程序包中的程序單元的條件部分為真,則它準(zhǔn)備好執(zhí)行,但該程序單元屬于某個(gè)優(yōu)先順序列表的情況除外。在后一情況下,優(yōu)先順序列表準(zhǔn)備好用于執(zhí)行。已經(jīng)說明,優(yōu)先順序列表可編寫為程序單元。為簡化我們的討論,我們假定所有優(yōu)先順序列表已編寫為程序單元。換言之,特征程序包只包含程序單元。此外,由于特征程序包是合式的,則如果兩個(gè)程序單元的條件語句可同時(shí)為真,那么其事件列表無法同時(shí)為真。
為簡明起見,我們描述了執(zhí)行單個(gè)特征程序包的運(yùn)行時(shí)系統(tǒng)。熟悉多處理操作系統(tǒng)技術(shù)的技術(shù)人員可輕松地將我們的結(jié)果擴(kuò)展到并發(fā)執(zhí)行幾個(gè)特征程序包的運(yùn)行時(shí)系統(tǒng)。
運(yùn)行時(shí)系統(tǒng)的基本操作相對(duì)簡單首先,它初始化系統(tǒng)。接著,在初始化后及每次在它完成程序單元的執(zhí)行后,它檢查事件的到達(dá),更新由于執(zhí)行程序單元而改變的域變量及搜索任何程序單元的條件部分是否已為真。最多可以有一個(gè)這樣的程序單元。如果有一個(gè)程序單元為真,則運(yùn)行時(shí)系統(tǒng)將執(zhí)行該程序單元至完成。如果沒有,則它等待另一事件。在事件到達(dá)時(shí),它搜索是否有任一程序的條件部分已為真。它重復(fù)這些操作,直至它執(zhí)行了程序單元的退出命令。
然而,以下算法描述了相當(dāng)優(yōu)化的運(yùn)行時(shí)系統(tǒng),特別是在搜索條件部分已為真的程序單元的操作中。未測(cè)試過的搜索操作的性能隨系統(tǒng)中使用的字母符號(hào)數(shù)量增加而迅速降低。我們使用一組寄存器,并在寄存器中用各比特表示字母符號(hào),這樣,可同時(shí)檢查許多字母符號(hào)的真值(如寄存器的長度一樣多)。
在描述算法前,我們首先描述運(yùn)行時(shí)系統(tǒng)使用的不同數(shù)據(jù)結(jié)構(gòu)。運(yùn)行時(shí)系統(tǒng)用于程序單元執(zhí)行的數(shù)據(jù)結(jié)構(gòu)我們描述三個(gè)數(shù)據(jù)集。第一個(gè)數(shù)據(jù)集是所有程序單元的全局?jǐn)?shù)據(jù)集。第二個(gè)數(shù)據(jù)集特定于各事件類型。第三個(gè)數(shù)據(jù)集為特定程序單元專用。
每特征程序包數(shù)據(jù)運(yùn)行時(shí)系統(tǒng)維護(hù)公共狀態(tài)寄存器(CSR),該寄存器包含了屬于特征程序包的程序單元條件語句中使用的所有不同字母符號(hào)的真值。我們將有關(guān)兩個(gè)不同域變量(或不同的域變量組)的相同謂詞函數(shù)視為兩個(gè)獨(dú)特的字母符號(hào)。由于這些字母符號(hào)中的每個(gè)字母符號(hào)可能只取TRUE或FALSE值,因此,CSR對(duì)每個(gè)字母符號(hào)使用一個(gè)比特。CSR是動(dòng)態(tài)數(shù)據(jù)。其值在特征程序包執(zhí)行期間域變量更新時(shí)改變。
為進(jìn)行有效的處理,運(yùn)行時(shí)系統(tǒng)可依靠編譯器準(zhǔn)備的一些靜態(tài)數(shù)據(jù)。如圖16中所示,我們將每個(gè)域變量與在CSR中對(duì)應(yīng)位置使用它的謂詞函數(shù)集和在條件語句中使用CSR字母符號(hào)的程序單元相關(guān)聯(lián)。當(dāng)運(yùn)行時(shí)系統(tǒng)需要時(shí),它可借助域變量的當(dāng)前值,利用此數(shù)據(jù)結(jié)構(gòu)容易地更新CSR和程序單元條件語句的狀態(tài)。
每事件類型數(shù)據(jù)對(duì)于事件隊(duì)列中的每個(gè)事件,運(yùn)行時(shí)系統(tǒng)維護(hù)類似于CSR但用于事件限定的事件狀態(tài)寄存器(ESR)。ESR遵循為相同類型的所有事件生成的ESR模板(ESRT)的格式。如圖17所示,對(duì)于每個(gè)事件類型,我們將每個(gè)限定字段與使用它的謂詞函數(shù)集及ESRT中的對(duì)應(yīng)位置相關(guān)聯(lián)。利用圖17中的表格,在特殊類型的事件到達(dá)時(shí),運(yùn)行時(shí)系統(tǒng)可直接生成其ESR值。
對(duì)于每個(gè)事件類型,維護(hù)在事件語句中引用事件類型的程序單元列表。
每程序單元數(shù)據(jù)對(duì)于每個(gè)程序單元,我們保持從特征交互作用檢測(cè)過程生成的兩個(gè)靜態(tài)數(shù)據(jù)集。一個(gè)數(shù)據(jù)集來自條件語句,另一數(shù)據(jù)集來自事件語句。
先描述源于條件語句的數(shù)據(jù)集對(duì)于條件的析取范式中的每項(xiàng),我們構(gòu)建記錄滿足該項(xiàng)的變量值的單元條件寄存器(UCR)。由于在該項(xiàng)中使用的變量是CSR中表示的變量子集,所以UCR的一種可能的實(shí)現(xiàn)方法就是使用與CSR相同大小的矢量,并且在與CSR中完全相同的位置記錄變量值。UCR中其它比特值將設(shè)為FALSE。
針對(duì)每個(gè)UCR,我們構(gòu)建單元掩碼寄存器(UMR)以指示在項(xiàng)中使用的變量的位置。換言之,UMR具有與CSR和UCR相同的大小。UMR在對(duì)應(yīng)于項(xiàng)中所用變量的位置上具有TRUE值,并且在其它變量的位置上具有FALSE值。
給定UCR及其對(duì)應(yīng)的UMR,我們有一種簡單的方法確定CSR是否如算法4中那樣滿足UCR。我們將更一般地描述算法4,因?yàn)樗鼘⒃诹硪簧舷挛闹惺褂?。給定寄存器A,其中每一位表示不同布爾變量的值。給定與A具有相同大小的另一寄存器B,并且A和B相同位置上的每一位表示相同的變量。如果B記錄可滿足布爾公式M的變量值,而另一寄存器C用TRUE或FALSE表示該公式中使用的變量,則算法4確定A中的值是否滿足M。
算法4.
1.在A與C之間執(zhí)行逐位邏輯“與”運(yùn)算,并將結(jié)果記錄到相同大小的臨時(shí)矢量中。在運(yùn)算結(jié)束時(shí),臨時(shí)矢量在項(xiàng)中未使用的每個(gè)變量上具有FALSE值,并且在項(xiàng)中使用的每個(gè)變量上具有與A中相同的值。
2.在臨時(shí)矢量與B之間執(zhí)行逐位邏輯“異或”運(yùn)算。如果兩個(gè)矢量完全匹配(即,“異或”的結(jié)果對(duì)所有位均為零),則A滿足M,否則,它不滿足M。
從事件語句中對(duì)于每個(gè)事件,我們構(gòu)建類似于條件語句的UCR和UMR的事件限定寄存器(EQR)及其對(duì)應(yīng)的事件掩碼寄存器(EMR)??梢允褂盟惴?確定給定的ESR是否滿足事件限定條件。
運(yùn)行時(shí)系統(tǒng)算法我們現(xiàn)在準(zhǔn)備描述運(yùn)行時(shí)系統(tǒng)示例。運(yùn)行時(shí)系統(tǒng)可工作在三種狀態(tài)下最初創(chuàng)建運(yùn)行時(shí)系統(tǒng)時(shí)的初始狀態(tài)、執(zhí)行程序單元時(shí)的活動(dòng)狀態(tài)以及等待使某個(gè)程序單元的條件部分為真的事件時(shí)的空閑狀態(tài)。運(yùn)行時(shí)系統(tǒng)一旦初始化,即可在下列兩種情況下被調(diào)用收到事件時(shí)或執(zhí)行的程序單元返回時(shí)。
初始狀態(tài)在為執(zhí)行而創(chuàng)建特征程序包(一些編程語言使用術(shù)語實(shí)例化)時(shí),操作系統(tǒng)將為特征程序包及其特征中聲明的局部變量分配空間。假設(shè)域變量的初始值與模型語句中指定的一樣,則編譯器或操作系統(tǒng)可通過圖16所示的數(shù)據(jù)結(jié)構(gòu)計(jì)算CSR的初始值。
因?yàn)樘卣鞒绦虬仨毎辽僖粋€(gè)錨特征,因此,存在至少一個(gè)其條件語句滿足CSR的程序單元。利用算法4將此CSR與所有程序單元的UCR和UMR進(jìn)行比較,我們可以確定這些程序單元并將它們置于當(dāng)前的程序單元列表中。如前所述,列表中的程序單元不具有可同時(shí)為真的事件列表。列表中的至多一個(gè)程序單元未在等待任何事件。如果這樣的程序單元存在,則運(yùn)行時(shí)系統(tǒng)將執(zhí)行該程序單元并變遷到活動(dòng)狀態(tài)。如果這樣的程序單元不存在,則運(yùn)行時(shí)系統(tǒng)將變遷到空閑狀態(tài)。算法5描述了此操作序列。
算法51.分配空間并初始化為特征程序包、特征程序包中的特征和程序單元定義的域變量和局部變量。
2.確定CSR的值。
3.確定當(dāng)前列表中的程序單元組。
4.If(在當(dāng)前列表中存在不等待任何事件的程序單元){運(yùn)行時(shí)系統(tǒng)狀態(tài)=活動(dòng);執(zhí)行該程序單元;}else{If(事件隊(duì)列不為空){If(在隊(duì)列中存在與當(dāng)前列表中程序單元相匹配的事件){運(yùn)行時(shí)系統(tǒng)狀態(tài)=活動(dòng);執(zhí)行程序單元;退出算法5;}}運(yùn)行時(shí)系統(tǒng)狀態(tài)=空閑;退出算法5;}圖18顯示了算法5的流程圖。步驟2、3和4可在編譯時(shí)完成。
在算法5執(zhí)行之后,運(yùn)行時(shí)系統(tǒng)將在下列兩種條件下被調(diào)用運(yùn)行時(shí)系統(tǒng)收到事件時(shí),或執(zhí)行的程序單元返回時(shí)。
算法6(運(yùn)行時(shí)系統(tǒng)收到事件時(shí))If(運(yùn)行時(shí)系統(tǒng)狀態(tài)=活動(dòng)){將事件置于事件隊(duì)列中;退出算法6;
}else{if((在當(dāng)前列表中存在等待此類型事件的程序單元)并且(事件的限定變量值滿足程序單元的事件限定條件)){運(yùn)行時(shí)系統(tǒng)狀=活動(dòng);執(zhí)行程序單元; 注1退出算法6;}else{將事件置于事件隊(duì)列中;退出算法6;};圖19顯示了算法6的流程圖。
對(duì)于注釋1中的語句,我們通過對(duì)事件的ESR和事件限定條件的EQR和EMR使用算法4,檢查事件限定變量值是否滿足程序單元的事件限定條件。由于程序單元在當(dāng)前列表中,因此,當(dāng)前CSR滿足其條件語句。最多有一個(gè)程序單元滿足兩個(gè)條件并得到執(zhí)行。
如果當(dāng)時(shí)在執(zhí)行某個(gè)程序單元,或者在事件未使某個(gè)程序單元的條件部分為真時(shí),將事件置于事件隊(duì)列中。
算法7(程序單元的執(zhí)行返回時(shí))步驟1If(某些域變量已更新)then{更新CSR;更新當(dāng)前列表};If(當(dāng)前列表為空),則系統(tǒng)終止。
步驟2If(事件隊(duì)列不為空){從事件隊(duì)列中選擇滿足當(dāng)前列表中某個(gè)程序單元的事件語句的一個(gè)事件;If(未找到此類事件){運(yùn)行時(shí)系統(tǒng)狀態(tài)=空閑;退出算法7;}else{
運(yùn)行時(shí)系統(tǒng)狀態(tài)=活動(dòng);執(zhí)行程序單元;退出算法7;}};}else{運(yùn)行時(shí)系統(tǒng)狀態(tài)=空閑; /*未選擇要執(zhí)行的程序單元*/退出算法7}圖20顯示算法7的流程圖。
在步驟1中我們通過將算法4應(yīng)用到每個(gè)程序單元的CSR和(UCR,UMR)而更新當(dāng)前列表。通過計(jì)算將CSR的某個(gè)值與(UCR,UMR)組相關(guān)聯(lián)。同樣在步驟1中,如果給定特定的CSR值時(shí)未滿足任一程序單元的條件語句,則無法進(jìn)行進(jìn)一步的計(jì)算。
在步驟2中,可根據(jù)一些用戶定義的標(biāo)準(zhǔn)從事件隊(duì)列中選擇事件,如首先選擇接收的第一個(gè)事件,或輔以事件優(yōu)先級(jí)的第一選定策略中的第一個(gè)事件。當(dāng)事件隊(duì)列中的事件不滿足當(dāng)前列表中程序單元的事件語句時(shí),系統(tǒng)將不得不等待下一事件。
總之,我們描述了一組算法,這些算法規(guī)定了運(yùn)行時(shí)系統(tǒng)最初創(chuàng)建時(shí)應(yīng)該做什么(算法5)、收到事件時(shí)應(yīng)該做什么(算法6)及程序單元執(zhí)行返回時(shí)應(yīng)該做什么(算法7)。這些算法保持了兩個(gè)重要的屬性。首先,程序單元的執(zhí)行是原子操作。運(yùn)行時(shí)系統(tǒng)不會(huì)在執(zhí)行一個(gè)程序單元時(shí)中途停止并切換為執(zhí)行另一個(gè)程序單元。其次,一次只處理一個(gè)事件(從事件隊(duì)列中除去),但我們未規(guī)定應(yīng)選擇使用何種優(yōu)先級(jí)方案。這些算法是展示靈活性的算法示例。其它變形和優(yōu)化的算法也是可能的。
結(jié)論我們介紹了一組非過程語言結(jié)構(gòu)、執(zhí)行以這些語言結(jié)構(gòu)編寫的程序單元的運(yùn)行時(shí)系統(tǒng)、在程序單元中檢測(cè)交互作用的算法及使用此技術(shù)開發(fā)軟件的過程。上述內(nèi)容的一個(gè)主要目的是說明這樣的可行性,即允許程序員將交互式特征設(shè)計(jì)成可重用組件,無需修改現(xiàn)有代碼即可增加新特征。許多感興趣主題未在本文明確描述的范圍之內(nèi),但我們將簡單討論兩個(gè)主題算法性能以及對(duì)采用此語言編寫的程序的分析。
細(xì)心的讀者可能注意到,檢查兩個(gè)布爾公式的合取是否能被滿足(即檢查簡化的交互作用條件SIC過程中的基本步驟)是NP完整性(NP-complete)問題。然而,現(xiàn)在的計(jì)算機(jī)可以相當(dāng)快的速度(少于1分鐘)解決有關(guān)具有少于二十個(gè)字母符號(hào)的公式的這種問題。但是,如果程序員在其條件語句中使用那么多的字母符號(hào),則他們要應(yīng)付他們自己可能不理解以及可能應(yīng)避免的情況。在本方法中,由于我們只需要為等待具有兼容限定字段的同一事件的程序單元處理此問題,因此此問題得以減輕。
所述的運(yùn)行時(shí)系統(tǒng)算法性能應(yīng)該是合理的。它還可進(jìn)一步優(yōu)化。例如,前面提到編譯器實(shí)際上可以進(jìn)行靜態(tài)分析以將公共狀態(tài)寄存器(CSR)的不同值鏈接到不同程序單元。運(yùn)行時(shí)系統(tǒng)可在運(yùn)行時(shí)學(xué)習(xí)并記住CSR為特定值情況下的程序單元當(dāng)前列表,這樣,它無需在下次確定當(dāng)前列表。而且操作寄存器的所述算法相當(dāng)快。
注意,模型中指定的域變量及其謂詞函數(shù)可定義無限的論域(例如,允許域變量為整數(shù)類型,而整數(shù)本身是無限的)。然而,合式特征程序包的程序單元條件語句將論域分成有限數(shù)量的分區(qū)。如果程序單元的條件語句定義一個(gè)分區(qū),則特征程序包中分區(qū)的數(shù)量最多為特征程序包中程序單元的數(shù)量。換言之,特征程序包實(shí)際上是有限狀態(tài)機(jī)。為有限狀態(tài)機(jī)設(shè)計(jì)的所有分析算法可用于分析特征程序包。
導(dǎo)出未被特征程序包中程序單元的條件語句包括的論域較容易。運(yùn)行時(shí)系統(tǒng)算法在遇到這種條件時(shí)將終止特征程序包。導(dǎo)致這種情況發(fā)生的條件最可能是異常條件(程序員可指明將正常退出執(zhí)行的程序單元)。程序員可通過編寫如圖21所示的程序單元而得以對(duì)該異常作更多的控制,并將該程序單元置于特征的優(yōu)先順序列表的底部。或者,程序員可編寫針對(duì)這種異常的特征,并將其置于特征程序包的優(yōu)先順序列表的底部。
異常處理是編程語言設(shè)計(jì)中的重要主題。在許多軟件系統(tǒng)中,異常處理代碼多于正常處理代碼。這是本方法比常規(guī)編程語言好的一個(gè)方面。由于不需要除所述那些語言結(jié)構(gòu)以外的其它語言結(jié)構(gòu),因此,本文未對(duì)此作一詳述。
注意,雖然具體描述的是將本方法應(yīng)用于電話,但本方法可應(yīng)用于任何程序,特別是具有大量模塊而且復(fù)雜的程序。這類程序的主要實(shí)例有因特網(wǎng)應(yīng)用程序。更改購物車特征是可以利用本方法的一個(gè)有價(jià)值的編程問題。
雖然語言結(jié)構(gòu)使用事件驅(qū)動(dòng)范式,但所述語言并不限于事件驅(qū)動(dòng)應(yīng)用。例如,從分析文本文件生成的標(biāo)記可視為事件并用以此語言編寫的程序進(jìn)行分析。
雖然顯示并描述了本發(fā)明的特定實(shí)現(xiàn)例,但本領(lǐng)域的技術(shù)人員可在不改變本發(fā)明的情況下對(duì)這些特定實(shí)施例加以修改。因此,所附權(quán)利要求書旨在涵蓋符合本發(fā)明真實(shí)精神且在其范圍之內(nèi)的所述變化和修改。
權(quán)利要求書(按照條約第19條的修改)}else {運(yùn)行時(shí)系統(tǒng)狀態(tài)=空閑;退出算法7)47.如權(quán)利要求2所述的方法,其特征在于,所述條件語句是布爾域變量的布爾公式和其它類型域變量的謂詞,并且事件限定條件包括所述事件的所述限定字段的布爾公式,以及所述主體部分包括在所述域變量上操作和發(fā)送事件48.如權(quán)利要求2所述的方法,其特征在于,每種特征中至少一個(gè)程序單元與所述錨特征中至少一個(gè)程序單元交互作用,所述特征中的至少一個(gè)程序單元引用所述錨特征。
49.如權(quán)利要求2所述的方法,其特征在于,所述特征程序包還包括在所述特征程序包中包含的程序單元列表。
50.如權(quán)利要求2所述的方法,其特征在于,所述特征程序包還包括特征的優(yōu)先順序列表和所述特征程序包中包含的程序單元。
51.如權(quán)利要求2所述的方法,其特征在于還包括,通過修改所述特征和特征程序包中的程序單元的條件部分以包括含有新域變量的條件,而重用包含所述新域變量的擴(kuò)展模型中的特征和特征程序包。
52.如權(quán)利要求2所述的方法,其特征在于還包括,通過兩個(gè)寄存器之間的逐位比較,確定特定程序單元的條件語句是否得到滿足。
53.如權(quán)利要求1所述的方法,其特征在于,還包括通過將所得的可執(zhí)行程序作為有限狀態(tài)自動(dòng)機(jī)分析而分析所述可執(zhí)行程序。
權(quán)利要求
1.一種無需修改現(xiàn)有代碼即可增加新軟件特征和開發(fā)彼此獨(dú)立而無論其是否交互作用的庫組件的方法,所述方法包括(A)開發(fā)應(yīng)用模型;(B)根據(jù)所述模型開發(fā)錨特征,每個(gè)錨特征至少包含一個(gè)程序單元;(C)確定在開發(fā)的每個(gè)新錨特征至少一部分新程序單元是否與所述新錨特征的以前完成的程序單元交互作用;(D)解決所述新錨特征的所述程序單元之間的所有交互作用;(E)根據(jù)所述模型開發(fā)附加特征和至少一個(gè)錨特征,每個(gè)附加特征包含至少一個(gè)程序單元;(F)確定在開發(fā)的每個(gè)新附加特征至少一部分新程序單元是否與所述新附加特征以前完成的程序單元交互作用,并解決所述新附加特征的所有程序單元之間的交互作用;(G)選擇特征程序包的特征,所述特征程序包中的每種所述特征包含一組錨特征和一組附加特征;(H)確定所述特征程序包的各特征是否交互作用;以及(I)解決所述特征程序包的所述特征之間的交互作用。
2.如權(quán)利要求1所述的方法,其特征在于所述模型包括域變量和事件接口;每個(gè)事件接口定義事件類型集,每個(gè)事件類型具有唯一的名稱和為了限制而采用的具有限定字段的數(shù)據(jù)結(jié)構(gòu);所述域變量彼此無關(guān)并且是包括組合函數(shù)的布爾或域數(shù)據(jù)類型;所述特征程序包中的每種特征僅引用所述模型且包括程序單元;每個(gè)程序單元僅引用所述模型并包含條件部分,所述條件部分包括條件語句和事件語句及在所述條件語句為真時(shí)執(zhí)行的主體部分。
3.如權(quán)利要求2所述的方法,其特征在于還包括,除非其條件部分為真的多個(gè)程序單元還具有程序員以前定義的優(yōu)先順序關(guān)系,否則,一次最多只允許有一個(gè)程序單元具有真條件部分。
4.如權(quán)利要求2所述的方法,其特征在于還包括,只允許所述程序體部分的原子執(zhí)行,其中,從當(dāng)前程序體發(fā)送的事件保持在隊(duì)列中,并且只有在當(dāng)前程序體部分退出后,才可使用所述域變量的最新值評(píng)估另一程序單元的所述條件部分。
5.如權(quán)利要求2所述的方法,其特征在于還包括自動(dòng)檢查相對(duì)于所述域變量的初始值,屬于所述一個(gè)錨特征的至少一個(gè)程序單元的所述條件部分是否為真;每個(gè)附加特征識(shí)別至少一個(gè)錨特征,并且所述附加特征的至少一個(gè)程序單元與所述附加特征引用的每個(gè)錨特征的一個(gè)程序單元交互作用;以及所述特征程序包包括所述特征程序包中的一系列特征,所述特征程序包中的所有特征引用所述特征程序包中的至少一個(gè)所述錨特征。
6.如權(quán)利要求2所述的方法,其特征在于還包括,使程序單元集與所述程序單元集中程序單元之間優(yōu)先順序關(guān)系的優(yōu)先順序列表等效。
7.如權(quán)利要求1所述的方法,其特征在于還包括,在所述特征程序包中的兩種特征程序傳遞性地彼此包含或者兩個(gè)特征程序包傳遞性地彼此包含時(shí)檢查循環(huán)包含。
8.如權(quán)利要求2所述的方法,其特征在于還包括,通過將交互作用的特征和交互作用的程序單元之一置于優(yōu)先順序列表中,解決特征組中各特征之間的交互作用。
9.如權(quán)利要求8所述的方法,其特征在于還包括,解決多個(gè)交互作用的程序單元之間的交互作用。
10.如權(quán)利要求2所述的方法,其特征在于還包括,通過將新元素增加到所述現(xiàn)有域變量的現(xiàn)有定義中或者擴(kuò)展所述域變量或限定條件的現(xiàn)有值范圍,擴(kuò)展現(xiàn)有模型中現(xiàn)有域變量或接口事件的定義。
11.如權(quán)利要求10所述的方法,其特征在于還包括,擴(kuò)展所述定義而無需刪除現(xiàn)有元素或縮小所述現(xiàn)有值范圍。
12.如權(quán)利要求10所述的方法,其特征在于還包括,擴(kuò)展所述現(xiàn)有模型以包括在所述現(xiàn)有模型中定義的所有域變量和接口事件以形成擴(kuò)展模型。
13.如權(quán)利要求12所述的方法,其特征在于還包括,重用所述擴(kuò)展模型的特征程序包中的現(xiàn)有模型的特征。
14.如權(quán)利要求13所述的方法,其特征在于還包括,將所述重用特征包括在所述擴(kuò)展模型的特征程序包中的特征列表中。
15.如權(quán)利要求14所述的方法,其特征在于還包括,保持所述重用特征的程序單元之間的優(yōu)先順序關(guān)系。
16.如權(quán)利要求15所述的方法,其特征在于還包括,通過修改所述重用特征的程序單元的條件部分,使所述程序單元的事件語句中的事件列表包括所述限定條件中指定的事件,從而限制對(duì)所述重用特征的重用。
17.如權(quán)利要求15所述的方法,其特征在于,所述擴(kuò)展模型包括新變量,所述方法還包括通過在檢查和執(zhí)行所述現(xiàn)有模型的所述特征以查看所述條件語句是否為真時(shí),將所述現(xiàn)有模型的所述特征的所述條件語句設(shè)為與新變量無關(guān),從而限制對(duì)所述重用特征的重用。
18.如權(quán)利要求1所述的方法,其特征在于還包括,在所述特征程序包中獨(dú)立地開發(fā)所述錨特征而無需更改所述特征程序包中的其它錨特征。
19.如權(quán)利要求1所述的方法,其特征在于還包括,在所述特征程序包中獨(dú)立地開發(fā)所述附加特征而無需更改所述特征程序包中的其它附加特征。
20.如權(quán)利要求2所述的方法,其特征在于還包括,檢查同一特征中程序單元之間的交互作用,以及在第一特征和第二特征一起置于所述特征程序包中時(shí),檢查所述第一特征中的任一程序單元是否與所述第二特征中的程序單元交互作用。
21.如權(quán)利要求20所述的方法,其特征在于還包括,通過確定程序單元集是否等待所述同一事件及相對(duì)于該同一事件所述程序單元集的限定條件合取是否能被滿足,確定所述程序單元集的條件語句合取是否能被滿足,以及確定所述程序單元集沒有優(yōu)先順序關(guān)系,從而確定所述程序單元集之間的交互作用。
22.如權(quán)利要求21所述的方法,其特征在于還包括,通過獲得所述程序單元集的第一條件語句的析取范式,獲得所述程序單元集的第二條件語句的析取范式,然后確定所述第一條件語句的所述析取范式中每項(xiàng)與所述第二條件語句的析取范式中每項(xiàng)的合取是否能被滿足,從而確定所述程序單元集的條件語句的所述合取是否能被滿足。
23.如權(quán)利要求22所述的方法,其特征在于還包括,通過將屬于同一域數(shù)據(jù)類型的字母符號(hào)成組,并使用所述字母符號(hào)組中所述字母符號(hào)的組合函數(shù)來評(píng)估每個(gè)字母符號(hào)組,或者在所述字母符號(hào)是布爾變量時(shí)檢查茅盾,從而確定所述第一條件語句的所述析取范式中每項(xiàng)與所述第二條件語句的析取范式中每項(xiàng)的所述合取是否能被滿足。
24.如權(quán)利要求1所述的方法,其特征在于還包括,確定除非具有真條件部分的多個(gè)程序單元還具有優(yōu)先順序列表中的優(yōu)先順序關(guān)系,否則,當(dāng)所述特征程序包中某個(gè)特征的某個(gè)程序單元的條件為真時(shí),則該程序單元準(zhǔn)備好執(zhí)行。
25.如權(quán)利要求24所述的方法,其特征在于還包括,將所有優(yōu)先順序列表轉(zhuǎn)換為程序單元,這樣,所述特征程序包只包含程序單元。
26.如權(quán)利要求2所述的方法,其特征在于還包括,除非所述特征程序包中一個(gè)以上的程序單元具有優(yōu)先順序關(guān)系,否則確保它們的條件語句和事件列表不同時(shí)為真。
27.如權(quán)利要求2所述的方法,其特征在于還包括,維護(hù)在所述特征程序包中的程序單元的條件語句中使用的所有不同字母符號(hào)的真值公共狀態(tài)寄存器,并在所述特征程序包執(zhí)行期間在期望時(shí)間更新所述真值。
28.如權(quán)利要求2所述的方法,其特征在于還包括,維護(hù)在所述特征程序包的程序單元的事件隊(duì)列中的每個(gè)事件的事件限定條件的事件限定寄存器,并在所述特征程序包執(zhí)行期間在期望時(shí)間更新所述事件限定條件。
29.如權(quán)利要求2所述的方法,其特征在于還包括根據(jù)所述特征程序包中所述程序單元的所述條件語句,生成第一靜態(tài)數(shù)據(jù)集;在第一寄存器中存儲(chǔ)所述第一靜態(tài)數(shù)據(jù)集;根據(jù)從所述特征之間的交互作用檢測(cè)獲得的所述特征程序包中所述程序單元的所述事件語句,生成第二靜態(tài)數(shù)據(jù)集;以及對(duì)于所述第一和第二靜態(tài)數(shù)據(jù)集構(gòu)造記錄滿足所述條件或事件的析取范式中每項(xiàng)的變量值的單元條件寄存器或事件限定寄存器,構(gòu)造指示所述項(xiàng)中所用的變量位置的掩碼寄存器,并通過將所述單元條件寄存器或事件限定寄存器與所述對(duì)應(yīng)的掩碼寄存器進(jìn)行比較,從而確定所述公共狀態(tài)寄存器是否滿足所述單元條件寄存器或事件限定寄存器。
30.如權(quán)利要求2所述的方法,其特征在于還包括,最初創(chuàng)建運(yùn)行時(shí)系統(tǒng)時(shí)工作在初始狀態(tài),所述運(yùn)行時(shí)系統(tǒng)在執(zhí)行所述特征程序包的程序單元時(shí)工作在活動(dòng)狀態(tài),以及所述運(yùn)行時(shí)系統(tǒng)在等待事件以使所述特征程序包的某個(gè)程序單元條件部分為真時(shí)工作在空閑狀態(tài),在所述運(yùn)行時(shí)系統(tǒng)收到事件時(shí)或在執(zhí)行的所述特征程序包的程序單元返回時(shí),調(diào)用所述運(yùn)行時(shí)系統(tǒng)。
31.如權(quán)利要求2所述的方法,其特征在于還包括初始化運(yùn)行時(shí)系統(tǒng);在所述運(yùn)行時(shí)系統(tǒng)初始化后,利用所述運(yùn)行時(shí)系統(tǒng)執(zhí)行一個(gè)所述程序單元;在完成所述程序單元的執(zhí)行后,檢查事件到達(dá),更新由于所述程序單元的執(zhí)行而改變的域變量以及搜索任一所述程序單元的所述條件部分是否已為真;如果特定程序單元的所述條件部分已為真,則執(zhí)行所述特定程序單元以完成操作;以及如果所述特定程序單元的所述條件部分未為真,則等待另一事件直至執(zhí)行了程序單元的退出命令;其中,除非具有真條件部分的多個(gè)程序單元也具有優(yōu)先順序關(guān)系,否則,一次最多一個(gè)程序單元的所述條件部分為真。
32.如權(quán)利要求1所述的方法,其特征在于還包括,確定在所述程序單元之間是否存在不一致的優(yōu)先順序關(guān)系,并解決不一致的優(yōu)先順序關(guān)系。
33.如權(quán)利要求2所述的方法,其特征在于還包括分配空間并初始化為所述特征程序包、所述特征程序包中的特征和程序單元定義的所述域變量和局部變量;確定公共狀態(tài)寄存器的值,所述公共狀態(tài)寄存器包含在屬于所述特征程序包的所述程序單元的條件語句中使用的所有不同字母符號(hào)的真值;確定當(dāng)前列表中的程序單元集;設(shè)置運(yùn)行時(shí)系統(tǒng)的狀態(tài)為活動(dòng)如果所述當(dāng)前列表中存在的程序單元未在等待任何事件及在執(zhí)行不等待任何事件的程序單元,或者如果事件隊(duì)列不為空且隊(duì)列中存在匹配當(dāng)前列表中的一個(gè)所述程序單元的事件;否則將所述運(yùn)行時(shí)系統(tǒng)的所述狀態(tài)設(shè)為空閑狀態(tài)。
34.如權(quán)利要求33所述的方法,其特征在于還包括,在所述運(yùn)行時(shí)系統(tǒng)收到事件時(shí)或者正被執(zhí)行的程序單元返回時(shí),調(diào)用所述運(yùn)行時(shí)系統(tǒng)。
35.如權(quán)利要求34所述的方法,其特征在于還包括,只允許任一程序單元的原子執(zhí)行,以便所述運(yùn)行時(shí)系統(tǒng)在特定程序單元執(zhí)行期間不會(huì)停止并切換以執(zhí)行不同的程序單元。
36.如權(quán)利要求35所述的方法,其特征在于還包括,一次只處理一個(gè)事件并確定要獨(dú)立地處理的事件的優(yōu)先級(jí)方案。
37.如權(quán)利要求36所述的方法,其特征在于還包括,通過靜態(tài)分析將所述公共狀態(tài)寄存器的不同值鏈接到不同的程序單元,從而使所述運(yùn)行時(shí)系統(tǒng)在運(yùn)行時(shí)能夠了解并記住程序單元的當(dāng)前列表,這樣,所述運(yùn)行時(shí)系統(tǒng)在隨后處于活動(dòng)狀態(tài)時(shí)不用確定所述當(dāng)前列表。
38.如權(quán)利要求2所述的方法,其特征在于還包括,利用所述特征程序包的所述程序單元的所述條件語句,將所述模型中指定的所述域變量及相關(guān)謂詞函數(shù)定義的論域分成有限數(shù)量的分區(qū),特征程序包中的分區(qū)數(shù)量最多為所述特征程序包中程序單元的數(shù)量。
39.如權(quán)利要求1所述的方法,其特征在于可執(zhí)行錨特征和可執(zhí)行特征程序包是有限態(tài)自動(dòng)機(jī)。
40.如權(quán)利要求2所述的方法,其特征在于還包括,在特定特征的至少一個(gè)程序單元中包括異常條件,并在所述特定特征的優(yōu)先順序表底部插入所述至少程序單元,或者包括含有所述異常條件的新特征并在含有所述新特征的特征程序包的優(yōu)先順序列表底部插入所述新特征。
41.如權(quán)利要求2所述的方法,其特征在于還包括,通過如下算法1檢查兩個(gè)程序單元X和Y的單交互作用條件(SIC)算法1<![CDATA[If(X和Y具有優(yōu)先順序關(guān)系)then return(無SIC);else{ if(X和Y的事件列表不包含相同的事件) then return(無SIC);else{ for(每個(gè)公共X和Y事件) check(其限定條件的合取 是否能被滿足); if(限定條件合取不能被滿足) then return(無SIC); else{check(X和Y條件語句的合取是否能被滿足);if(不能被滿足)then return(無SIC); else(將條件語句和 限定條件的合 取作為SIC條 件報(bào)告); } }}]]>
42.如權(quán)利要求2所述的方法,其特征在于還包括,通過如下算法2確定兩個(gè)簡化謂詞公式M和N的合取是否能被滿足算法2步驟1取得M的析取范式D(M);步驟2取得N的析取范圍D(N);步驟3對(duì)于D(M)中的每項(xiàng),檢查它與D(N)中每項(xiàng)的合取是否能被滿足;從此合取產(chǎn)生的第i項(xiàng)表示為E(M,N)(i)。步驟4If(步驟3中檢查的E(M,N)(i)均不能被滿足)then return(M和N的合取不能被滿足)else return(M和N的合取能被滿足,以及有關(guān)步驟3中確定的所有能被滿足的合取的報(bào)告)。
43.如權(quán)利要求2所述的方法,其特征在于還包括,通過算法3評(píng)估算法2的步驟3算法3對(duì)于每個(gè)E(M,N)(i),將屬于同一域數(shù)據(jù)類型的字母符號(hào)成組以形成字母符號(hào)組;使用所述字母符號(hào)各自的組合函數(shù)評(píng)估所述字母符號(hào)組中的每個(gè)字母符號(hào)組,或者尋找所述字母符號(hào)的布爾變量之間的茅盾;以及如果任一所述字母符號(hào)組被評(píng)為FALSE,則返回(不能被滿足),否則返回(能被滿足)。
44.如權(quán)利要求43所述的方法,其特征在于還包括,確定寄存器A中的值是否滿足布爾公式M,其中所述寄存器A包含的比特每個(gè)表示不同布爾變量的值;寄存器B與A大小相同,寄存器A和B的相同位置上的每個(gè)比特表示相同的變量,寄存器B記錄可滿足布爾公式M的變量值,以及寄存器C表示所述公式M所用的取值為TRUE或FALSE的變量,通過算法4并應(yīng)用算法4確定公共狀態(tài)寄存器(CSR)是否滿足單元條件寄存器(UCR)和事件狀態(tài)寄存器(ESR)是否滿足事件限定條件,其中,算法4包括在寄存器A與C之間執(zhí)行逐位邏輯“與”運(yùn)算,并將其結(jié)果記錄到相同大小的臨時(shí)矢量中,這樣,在所述“與”運(yùn)算結(jié)束時(shí),所述臨時(shí)矢量在所述公式中未使用的每個(gè)變量上具有FALSE值,而在所述公式中使用的每個(gè)變量上具有與A中相同的值;在所述臨時(shí)矢量與B之間執(zhí)行逐位邏輯“異或”運(yùn)算;以及確定僅在所述臨時(shí)矢量與寄存器B完全匹配時(shí)寄存器A滿足M。
45.如權(quán)利要求2所述的方法,其特征在于還包括,用于所述運(yùn)行時(shí)系統(tǒng)的運(yùn)算算法5包括分配空間并初始化為所述合式特征程序包、所述合式特征程序包中的特征和程序單元定義的所述域變量和局部變量;確定CSR的值;確定當(dāng)前列表中的程序單元集;<![CDATA[if(在所述當(dāng)前列表中存在不等待任何事件的程序單元){ 運(yùn)行時(shí)系統(tǒng)狀態(tài)=活動(dòng); 執(zhí)行所述程序單元; }else{ If(事件隊(duì)列不為空){ If(在所述隊(duì)列中存在與所述當(dāng)前列表中程序單元相匹 配的事件){ 運(yùn)行時(shí)系統(tǒng)狀態(tài)=活動(dòng); 執(zhí)行所述程序單元; 退出算法5;} } 運(yùn)行時(shí)系統(tǒng)狀態(tài)=空閑; 退出算法5;}]]>
46.如權(quán)利要求45所述的方法,其特征在于還包括,執(zhí)行算法5,并且在執(zhí)行算法5后,在所述運(yùn)行系統(tǒng)期收到事件時(shí)根據(jù)算法6調(diào)用所述運(yùn)行時(shí)系統(tǒng),或者當(dāng)正在執(zhí)行的程序單元返回時(shí),根據(jù)算法7調(diào)用所述運(yùn)行時(shí)系統(tǒng)算法6(所述運(yùn)行時(shí)系統(tǒng)收到事件時(shí))<![CDATA[If(運(yùn)行時(shí)系統(tǒng)狀態(tài)=活動(dòng)){ 將事件置于事件隊(duì)列中; 退出算法6;}else{if((在所述當(dāng)前列表中存在等待此類型事件的程序單元)并且(所述事件的所述限定變量的值滿足所述程序單元的所述事件限定條件)){運(yùn)行時(shí)系統(tǒng)狀態(tài)=活動(dòng);執(zhí)行所述程序單元;退出算法6;}else{將事件置于事件隊(duì)列中;退出算法6;};]]>算法7(當(dāng)程序單元的執(zhí)行返回時(shí))步驟1If(某個(gè)域變量已更新)then{更新CSR;更新當(dāng)前列表};If(當(dāng)前列表為空),則系統(tǒng)終止。<![CDATA[步驟2If(事件隊(duì)列不為空){從事件隊(duì)列中選擇滿足所述當(dāng)前列表中某個(gè)程序單元的事件語句的一個(gè)事件;If(未找到此類事件){ 運(yùn)行時(shí)系統(tǒng)狀態(tài)=空閑; 退出算法7;}else{ 運(yùn)行時(shí)系統(tǒng)狀態(tài)=活動(dòng); 執(zhí)行所述程序單元; 退出算法7;}}; }else{運(yùn)行時(shí)系統(tǒng)狀態(tài)=空閑;退出算法7}]]>
47.如權(quán)利要求2所述的方法,其特征在于,所述條件語句是布爾域變量的布爾公式和其它類型域變量的謂詞,并且事件限定條件包括所述事件的所述限定字段的布爾公式,以及所述主體部分包括在所述域變量上操作和發(fā)送事件
48.如權(quán)利要求2所述的方法,其特征在于,每種特征中至少一個(gè)程序單元與所述錨特征中至少一個(gè)程序單元交互作用,所述特征中的至少一個(gè)程序單元引用所述錨特征。
49.如權(quán)利要求2所述的方法,其特征在于,所述特征程序包還包括在所述特征程序包中包含的程序單元列表。
50.如權(quán)利要求2所述的方法,其特征在于,所述特征程序包還包括特征的優(yōu)先順序列表和所述特征程序包中包含的程序單元。
51.如權(quán)利要求2所述的方法,其特征在于還包括,通過修改所述特征和特征程序包中的程序單元的條件部分以包括含有新域變量的條件,而重用包含所述新域變量的擴(kuò)展模型中的特征和特征程序包。
52.如權(quán)利要求2所述的方法,其特征在于還包括,通過兩個(gè)寄存器之間的逐位比較,確定特定程序單元的條件語句是否得到滿足。
全文摘要
本發(fā)明公開了一種用于開發(fā)軟件的計(jì)算機(jī)輔助方法,通過該方法,即使應(yīng)用程序的不同特征會(huì)影響彼此的控制流,程序員也可將這些特征實(shí)現(xiàn)為無關(guān)的可重用組件。程序員可將新特征增加到應(yīng)用程序而不需執(zhí)行檢查和修改現(xiàn)有代碼這種工作量大的任務(wù)。程序員使用一組編程語言結(jié)構(gòu)來說明非過程程序單元,將程序單元組織成可重用的特征,并將幾種特征集成為特征程序包。交互作用檢測(cè)算法分析程序單元并確定特征中的程序單元之間以及特征程序包中的特征之間是否存在交互作用。如果檢測(cè)到交互作用,則在程序可以執(zhí)行前,程序員必須解決交互作用。運(yùn)行時(shí)系統(tǒng)規(guī)格支持編程語言結(jié)構(gòu)的語義,并保持允許交互作用檢測(cè)的條件。
文檔編號(hào)G06F9/44GK1568458SQ02820307
公開日2005年1月19日 申請(qǐng)日期2002年8月9日 優(yōu)先權(quán)日2001年8月17日
發(fā)明者梁扶漢 申請(qǐng)人:梁扶漢