欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

基于約束的語(yǔ)言中過程的高效自動(dòng)翻譯的制作方法

文檔序號(hào):6595645閱讀:225來(lái)源:國(guó)知局
專利名稱:基于約束的語(yǔ)言中過程的高效自動(dòng)翻譯的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)語(yǔ)言的自動(dòng)翻譯。
背景技術(shù)
在計(jì)算機(jī)技術(shù)的發(fā)展中,已開發(fā)了各種編程范例。這些范例中的兩個(gè)范例是命令式編程和聲明性編程。命令性編程需要提供逐步的命令性指令(例如設(shè)定等于2、增量C、 調(diào)用過程f O),程序員將這些命令性指令組合起來(lái)以解決感興趣的問題。聲明性編程需要提供頂層信息(例如一組要強(qiáng)制實(shí)施的邏輯約束),該頂層信息經(jīng)常以更透明地涉及感興趣的問題的方式來(lái)指定。命令性編程往往提供改善的執(zhí)行性能,但命令性程序可能非常復(fù)雜并且難以開發(fā)和維護(hù)。聲明性程序往往相對(duì)容易開發(fā)和維護(hù),但聲明性編程也往往提供相對(duì)糟糕和/或受限制的執(zhí)行性能(例如緩慢的執(zhí)行和/或無(wú)通用性)。命令性和聲明性范例的這些優(yōu)缺點(diǎn)是本領(lǐng)域內(nèi)公知的。由于計(jì)算機(jī)的底層硬件模型是命令性的,并且處理器執(zhí)行被動(dòng)存儲(chǔ)器上的命令性指令,因此最早的編程語(yǔ)言(例如匯編語(yǔ)言)是命令性的,且當(dāng)今廣泛使用的許多語(yǔ)言 (例如C、C++)仍舊主要是命令性的。當(dāng)前,聲明性語(yǔ)言(例如Prolog、Haskell、Siri和 ThingLab)往往是研究語(yǔ)言而不是商用開發(fā)語(yǔ)言。在實(shí)踐中,計(jì)算機(jī)語(yǔ)言可包括命令性和聲明性兩種范例的元素,盡管將任何特定語(yǔ)言歸類為主要是命令性或主要是聲明性很少會(huì)是不確定的。例如,C++提供類、虛函數(shù)和繼承,這允許單段代碼在各種對(duì)象類型上操作同時(shí)僅按照這些類型的某一基類來(lái)表達(dá)。這是C++的聲明性方面,但C++語(yǔ)言本身主要是命令性的。盡管純粹的聲明性語(yǔ)言尚未表現(xiàn)出通用性,然而在受限域內(nèi)已獲得令人印象深刻的結(jié)果。例如,SQL是涉及關(guān)系型數(shù)據(jù)庫(kù)的查詢和更新的受限域聲明性語(yǔ)言。例如,查詢是由定義“命中”的屬性來(lái)指定的,而非命令性地指定如何定位這些記錄。SQL在數(shù)據(jù)庫(kù)應(yīng)用中具有廣泛商業(yè)用途。另一受限域語(yǔ)言是JavaFX,它包括類似SQL的觸發(fā)機(jī)制以聲明要在值改變時(shí)調(diào)用的過程。該工具明顯受限于僅允許在當(dāng)前上下文中定義數(shù)據(jù)元素上的觸發(fā)條件。這些JaVaFX觸發(fā)器也類似于AspectJ和其它所謂面向方面的編程語(yǔ)言中的“連接點(diǎn)”。 這些連接點(diǎn)允許在對(duì)象初始化、字段讀寫和異常處理程序期間在過程的開始和結(jié)束時(shí)調(diào)用代碼。受限域聲明性語(yǔ)言的另一示例是用來(lái)向解析器生成器指定語(yǔ)法的語(yǔ)言。該語(yǔ)法被指定為聲明性生成規(guī)則。解析器生成器將程序作為這些產(chǎn)生規(guī)則的集合翻譯成實(shí)現(xiàn)針對(duì)所指定語(yǔ)法的解析器的命令性代碼。在指定語(yǔ)法來(lái)識(shí)別時(shí)明顯是聲明性的,這依賴于語(yǔ)言翻譯器來(lái)確定如何實(shí)現(xiàn)解析器。這種聲明性方法已被證明在語(yǔ)言翻譯器生成中具有重大價(jià)值,這避免了手動(dòng)實(shí)現(xiàn)解析器的耗時(shí)且易于出錯(cuò)的任務(wù)。然而,編譯器或解釋器的其余部分是以單獨(dú)的命令性編程語(yǔ)言來(lái)實(shí)現(xiàn)的,這導(dǎo)致與共同使用兩種不同語(yǔ)言和翻譯器相關(guān)聯(lián)的問題。在某些情形下,由聲明性編程提供的有益結(jié)果已推動(dòng)了各種在單個(gè)通用編程語(yǔ)言中提供兩種范例的主要優(yōu)點(diǎn)的嘗試。迄今為止的方法主要側(cè)重于將命令性編程結(jié)構(gòu)映射到聲明性模型(例如在Kaleidoscope’ 90 (萬(wàn)花筒’ 90)中的運(yùn)行時(shí)間約束解算器)。另一示例是C++的Turtle庫(kù),其中Turtle語(yǔ)言的約束模型被結(jié)合到C++中。然而,這些方法看來(lái)不能解決純聲明性編程模型的固有低效率問題。因此,提供對(duì)命令性和聲明性結(jié)構(gòu)兩者進(jìn)行更為高效和系統(tǒng)的使用的通用編程將是本領(lǐng)域的進(jìn)步。

發(fā)明內(nèi)容
根據(jù)本發(fā)明的各實(shí)施例,聲明性編程的所選方面被納入到否則為命令性的框架中。具體地說,提供具有約束的聲明性指定。本發(fā)明的各實(shí)施例的其它重要方面包括在程序單元不需要事先知道其數(shù)據(jù)成員中的哪一些服從約束的情形下在翻譯時(shí)對(duì)約束自動(dòng)解析以及對(duì)程序單元單獨(dú)翻譯。在實(shí)踐感興趣的許多情形下,以聲明性方式指定的約束可在編譯時(shí)由編譯器來(lái)解析,以提供包括用于強(qiáng)制實(shí)施約束的自動(dòng)提供的命令性代碼的命令性程序表示。如此,命令性編程所特有的效率不會(huì)因?yàn)樘砑恿藢?duì)約束的聲明性指定而受到實(shí)質(zhì)性損害。貫穿本申請(qǐng),“翻譯”包括“編譯”和“解釋”,并且對(duì)“編譯”等的引用可與對(duì)“解釋”等的引用互換,除非另外專門有說明。參照附圖開始對(duì)本發(fā)明的各實(shí)施例的一些基本概念的概述是有益的。

圖1示出已知編程結(jié)構(gòu)的偽代碼示例。在該例中,程序單元102包括準(zhǔn)聲明性語(yǔ)句“do A if X改變”。 作為該語(yǔ)句的結(jié)果,當(dāng)程序員(例如在“set X(設(shè)定X)”行內(nèi))更改X時(shí),則該語(yǔ)言自動(dòng)提供代碼以在“set X”指令后立即“do A(進(jìn)行Α)”。貫穿附圖,由語(yǔ)言自動(dòng)提供的代碼由虛線包圍。圖1的示例類似于一些已知的編程結(jié)構(gòu)(例如JavaFX的觸發(fā)器)。從概念上說,圖1結(jié)構(gòu)的執(zhí)行是相對(duì)簡(jiǎn)單的。具體地,當(dāng)聲明性語(yǔ)句如圖所示地處于與正被改變的輸入相同的程序單元和相同的上下文中時(shí),則執(zhí)行A的代碼可由編譯器在更改X的每一行之后立即自動(dòng)插入。然而,存在這種結(jié)構(gòu)的麻煩的概念性方面。具體地,該示例的A可以是任意命令性代碼,能造成狀態(tài)的任意改變(即任意的副作用)。因此,這些結(jié)構(gòu)具有復(fù)雜化軟件開發(fā)的可能性。獲得相同認(rèn)知的另一方法是觀察到“do Α”本質(zhì)上是命令性的,因此語(yǔ)句“do A if X改變”不是純聲明性的。由本發(fā)明的各實(shí)施例提供的主要能力在兩個(gè)顯著方面與圖1的示例存在區(qū)別。第一方面專門針對(duì)作為聲明性語(yǔ)句的約束的情形。由于約束條件是純聲明性結(jié)構(gòu),這消除了前述概念上的困難。第二方面是顯著擴(kuò)展了自動(dòng)命令性代碼生成能力以適應(yīng)約束條件處于與其相應(yīng)數(shù)據(jù)成員不同的上下文和/或不同的程序單元的情形。圖2示出相對(duì)于圖1的這兩種改變的示例。在圖2的示例中,第一程序單元202包括約束的聲明性指定(即“強(qiáng)制實(shí)施Y = f(x)”行)以及在約束范圍之內(nèi)和約束范圍之外對(duì)X的改變的實(shí)例。第二程序單元204也包括對(duì)X的改變的實(shí)例。本發(fā)明的各實(shí)施例對(duì)于對(duì)X的改變的所有實(shí)例自動(dòng)提供如圖所示的“更新Y”的命令性代碼。此外,程序單元204 可被單獨(dú)編譯而不必事先知曉其哪些數(shù)據(jù)成員是約束的輸入或服從約束。該頂層功能由通知反應(yīng)器結(jié)構(gòu)提供,其在圖2中示意性地表示為206。在實(shí)現(xiàn)結(jié)構(gòu)206時(shí),用于通知和反應(yīng)的代碼在從輸入源程序自動(dòng)派生的中間表示中自動(dòng)生成。該中間表示的進(jìn)一步處理提供輸出代碼,該輸出代碼包括自動(dòng)生成的用于強(qiáng)制實(shí)施約束的命令性結(jié)構(gòu),由此減輕程序員這方面的負(fù)擔(dān)。圖3a_5b的示例示出當(dāng)應(yīng)用于特定示例時(shí)前述過程的步驟。更具體地,根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于將包括約束的輸入代碼自動(dòng)翻譯成計(jì)算機(jī)可執(zhí)行輸出程序表示的方法在圖3a_5b的示例中示出。該方法的第一步驟是提供以也提供對(duì)約束的聲明性指定的命令性編程語(yǔ)言表達(dá)的輸入源程序,其中輸入源程序包括根據(jù)所述編程語(yǔ)言指定的一個(gè)或多個(gè)約束。在該示例中,圖3a_b示出輸入源程序的兩個(gè)代碼段,其中圖3a的代碼段可處于與圖北的代碼段不同的上下文中,并且還可處于單獨(dú)編譯的程序單元中。附圖和以下示例中采用C++式偽代碼,但本發(fā)明的實(shí)踐不依賴于語(yǔ)言句法的細(xì)節(jié)。圖3a的代碼段包括類F的定義,F(xiàn)的實(shí)例 Fl和F2的聲明以及對(duì)Fl. X的賦值。圖北的代碼段包括對(duì)約束集CS的定義和對(duì)F2. Y的賦值。約束集CS包括若干約束條件tot等于Fl. X+F1. Y ;tot2等于Fl. X+F2. Y ;而Fl. X等于F2. X*F2. Y。還指定如果Fl. X改變則F2. Y保持不變(F2. Y保持不變ifFl. X改變)。約束是約束數(shù)據(jù)成員(例如tot、tot2、Fl、F2)的關(guān)系。約束集CS也提供哪些約束數(shù)據(jù)成員是輸入和/或輸出的標(biāo)識(shí)。這里tot、tot2專門為輸出,而Fl和F2既可以是輸入又可以是輸出。約束輸入的標(biāo)識(shí)可以是顯式的(如前所述)和/或隱式的。輸入可基于其在約束指定內(nèi)的位置而隱式地標(biāo)識(shí)(例如在等式約束的右手側(cè)的數(shù)據(jù)成員可隱式地被視為約束輸入)。該方法的第二步驟是自動(dòng)提供約束的約束表示。每個(gè)約束表示包括一個(gè)或多個(gè)約束反應(yīng)器對(duì)象以用于注冊(cè)在實(shí)例化時(shí)的輸入改變通知。約束反應(yīng)器對(duì)象包括用于強(qiáng)制實(shí)施約束的命令式過程,并且在相應(yīng)約束表示的范圍內(nèi)是可訪問的。在這里和本申請(qǐng)全文中, “包含代碼”意指文字內(nèi)聯(lián)代碼包括和/或(例如使用指針)間接提供對(duì)范圍外代碼的范圍內(nèi)訪問。對(duì)于該示例的約束表示在圖4b中示出,如前所述,其中虛線包圍自動(dòng)提供的代碼。在該示例中,類CS的實(shí)例cs是約束表示,而FRl和FR2分別為約束反應(yīng)器對(duì)象實(shí)例FlReactor和F2Reactor。FlReactor包括用于在Fl改變時(shí)強(qiáng)制實(shí)施約束的代碼(即, 真正的更新過程)。更具體地,如果Fl. X改變,則FlReactor中的onX()過程根據(jù)約束命令性地更新tot、tot2和F2. X。如果Fl. Y改變,則FlReactor中的onY()過程命令性地更新 tot。同樣,F(xiàn)2Reactor包括用于在F2改變時(shí)強(qiáng)制實(shí)施約束的代碼。在該示例中,F(xiàn)lReactor 和F2Reactor包含在類CS中,該類CS實(shí)例化為cs。該實(shí)例化為FRl和FR2提供對(duì)輸入Fl 和F2的指針訪問。優(yōu)選地但非必需地如本示例所示那樣將約束分組成若干約束集。在這些情形下,對(duì)約束集的每個(gè)輸入通常存在一個(gè)反應(yīng)器,每個(gè)反應(yīng)器可包括從多個(gè)約束派生的命令性語(yǔ)句,并存在與每個(gè)輸入約束集(例如圖北上的約束集CS)對(duì)應(yīng)的一個(gè)約束集對(duì)象表示(例如圖4b上的類CS)。該方法的第三步驟是,對(duì)輸入源程序的部分或全部程序數(shù)據(jù)成員中的每一個(gè)自動(dòng)地提供相應(yīng)的通知代碼,以提供改變通知并調(diào)節(jié)約束表示對(duì)輸入改變通知的注冊(cè),其中相應(yīng)通知代碼在相應(yīng)程序數(shù)據(jù)成員的范圍內(nèi)是可訪問的。在該示例中,圖如示出該自動(dòng)提供的通知代碼的一部分。將子類Notifiee (被通知者)插入類F內(nèi),其中Notifiee包括用于對(duì)其輸入的改變的虛更新過程(即virtual onXO,virtual onY()和virtual onZ())、 指向其實(shí)例的指針(即fp)、以及當(dāng)改變發(fā)生時(shí)擬通知的約束反應(yīng)器對(duì)象的實(shí)例列表(即 n0tifieelist(被通知者列表))。在翻譯期間,自動(dòng)管理被通知者列表以使每個(gè)數(shù)據(jù)成員具有全部完整列表和僅那些該數(shù)據(jù)成員是其輸入的反應(yīng)器實(shí)例。當(dāng)且僅當(dāng)相應(yīng)數(shù)據(jù)成員改變時(shí),才調(diào)用虛更新程序。通常為全部數(shù)據(jù)成員提供通知能力,即使沒有相關(guān)約束(例如 Fl. Z、F2. Z沒有約束)。這較為有利地避免了對(duì)特定類中的哪些數(shù)據(jù)成員被涉及在約束中的任何先驗(yàn)知識(shí)的要求。在一些情形下,可能需要有選擇地對(duì)一些數(shù)據(jù)成員禁用通知。如果對(duì)作為約束輸入的數(shù)據(jù)成員禁用通知,則生成翻譯錯(cuò)誤。本方法的第四步驟在命令性輸出程序表示中實(shí)例化通知代碼和約束表示,以使對(duì)約束輸入的改變自動(dòng)導(dǎo)致命令性約束驅(qū)動(dòng)的更新,并將該命令性輸出程序表示作為輸出提供。例如,該命令性輸出程序表示可通過編譯被進(jìn)一步處理成低級(jí)機(jī)器語(yǔ)言。在圖4a_b中,一個(gè)重要的細(xì)節(jié)是FlReactor和F2Reactor類型是從F: Notifiee 類型派生的。以此方式,調(diào)用虛更新過程(例如Fl: =Notifiee中的virtual onX())通過類型繼承自動(dòng)導(dǎo)致調(diào)用正確反應(yīng)器(FRl::0n(X))中的正確約束更新過程。在圖fe-b的代碼段中示出該示例的代碼的運(yùn)行。在圖fe中,向?qū)①x值提供給Fl. X的程序員自動(dòng)補(bǔ)充虛線中所示的過程調(diào)用集。同樣,在圖恥中,對(duì)F2. Y的賦值同樣得到虛線中所示的過程調(diào)用集的自動(dòng)補(bǔ)充。更具體地,改變圖fe中的Fl. X造成對(duì)反應(yīng)器實(shí)例FRl的onX過程作出調(diào)用。該 FRl. onX()過程根據(jù)約束更新tot、tot2和F2. X(通過執(zhí)行賦值tot = Fl. X+Fl. Y、tot2 = Fl. X+F2. Y和F2. X = Fl. X/F2. Y)。對(duì)F2. X的更新自動(dòng)地導(dǎo)致對(duì)反應(yīng)器實(shí)例FR2的onX() 過程作出調(diào)用。該FR2.onX()過程通過執(zhí)行賦值?1] = 2]樸2.¥來(lái)更新?1]。然而,該賦值實(shí)際上不改變本例中Fl. X的值。因此,由于對(duì)FR2. onX()的調(diào)用實(shí)際上不改變Fl. X, 因此約束更新處理在該調(diào)用之后終止。為了更清楚地理解,假定在對(duì)Fl. X最初賦值前(F1. X,F(xiàn)1.Y)) = (u,ν)且(F2.X,F(xiàn)2.Y) = (w,χ)。該第一次賦值給出(F1. X,F(xiàn)l. Y) = (a,ν)。 對(duì) FRl.onXO 的調(diào)用導(dǎo)致(F2.X,F(xiàn)2. Y) = (a/x, χ)。對(duì) FR2.onX()的調(diào)用設(shè)定 Fl. X = F2.X*F2.Y = a,a是Fl. X在計(jì)算中的該點(diǎn)處已經(jīng)有的值。由于Fl沒有改變,因此不需要進(jìn)一步的通知和反應(yīng)。圖恥中的賦值F2. Y = b的效果可以用相同的方式來(lái)分析。對(duì)前一段的記法進(jìn)行縮寫,假設(shè)初始狀態(tài)為Fl = (u,v)且F2= (w,x)0將F2改變至(w,b)調(diào)用反應(yīng)器FR2的 οηΥ()過程,這將Fl改變至(腫b,ν)并將F2 “改變”至(w,b),假設(shè)對(duì)Fl的改變是在改變 F2之前作出的。由于F2沒有真正改變,因此FRl.onXO是由于F2的改變而調(diào)用的唯一反應(yīng)器。該反應(yīng)器將F2 “改變”至(w,b),這不是對(duì)F2的值的改變。約束更新從而終止。在圖恥的示例中,如果FR2. οηΥ()在更新Fl前更新F2,則獲得不同的最終狀態(tài)。 在這種假設(shè)下,F(xiàn)R2.onY()的效果是將F2設(shè)定為(u/b, b)并將Fl “改變”至(u,ν)。由于 Fl沒有真正改變,因此FR2. οηΧ()是由于對(duì)F2的改變而調(diào)用的唯一反應(yīng)器。FR2. οηΧ()將 Fl “改變”至(u,ν),這不是對(duì)Fl值的改變。約束更新從而終止。約束更新處理通常將不終止,除非計(jì)算達(dá)到同時(shí)滿足所有相關(guān)約束的狀態(tài)。在滿足約束的情形下,該狀態(tài)可以不是唯一指定的。盡管約束驅(qū)動(dòng)的編程的這些方面對(duì)底層聲明性范例而言是固有的,但本發(fā)明的各實(shí)施例的一個(gè)重要方面是實(shí)踐中的實(shí)現(xiàn),將相對(duì)簡(jiǎn)單的約束添加至命令性框架是非常有力的。約束驅(qū)動(dòng)的編程的一般模型通常將全部約束視作多輸入約束(例如a+b+c = O可具有輸入a、b和/或c)。在實(shí)際感興趣的許多情形下,多輸入約束可表達(dá)為一組單輸入約束。這是有益的,因?yàn)閱屋斎爰s束更容易在上述通知反應(yīng)器框架中實(shí)現(xiàn)。例如,約束a+b+c =0可表達(dá)為下面的單輸入約束集c = _a-b(a是輸入);a = _b_c(b是輸入);以及b =-c-a(c是輸入)。這種多輸入約束到單輸入約束的縮減可由程序員提供,或在足夠簡(jiǎn)單的情形下其可自動(dòng)產(chǎn)生。注意,圖3a_5b的示例包括按照單輸入約束表達(dá)的多輸入約束的實(shí)例。更具體地, 多輸入約束 Fl. X = F2. X*F2. Y 被實(shí)現(xiàn)為 F2. X = Fl. X/F2. Y(F1 是輸入),F(xiàn)2. X = Fl. X/ F2.Y(F2是輸入),以及Fl. X = F2. X*F2. Y(F2是輸入)。這種按照單輸入約束的特定表示是由如果輸入Fl. X改變則保持F2. Y固定的指示、結(jié)合常見的lhs/rhs慣例(例如,左手側(cè) (Ihs)上的變量通常因賦值而改變,而右手側(cè)(rhs)上的變量一般不因賦值而改變)來(lái)驅(qū)動(dòng)的。與約束復(fù)雜度相關(guān)的其它考量在詳細(xì)說明中提供。前面的描述提供對(duì)本發(fā)明典型實(shí)施例的主要性能特征和基本實(shí)現(xiàn)特征的介紹。為了更好地理解本發(fā)明各實(shí)施例的一些變例和改進(jìn),在下面的概述的其余部分將對(duì)其作簡(jiǎn)單描述。在一些實(shí)施例中,在數(shù)據(jù)成員中自動(dòng)提供通知代碼包括提供兩個(gè)或更多個(gè)改變通知過程,并提供根據(jù)對(duì)程序數(shù)據(jù)成員的改變的性質(zhì)對(duì)要調(diào)用這些改變通知過程中的哪一些的選擇。例如,假設(shè)程序數(shù)據(jù)成員V是數(shù)字?jǐn)?shù)組,并且按照約束,總計(jì)等于V的各個(gè)元素之和。在一些情形下,對(duì)V的改變是涉及其部分或全部元素的一般改變,并且在這樣的情形下,總計(jì)的完全重計(jì)算在更新期間是無(wú)法避免的。然而,在其它情況下,V的改變已知為單個(gè)元素的改變(例如V[3]從4變?yōu)?)。在這種情形下,總計(jì)可更高效地更新(即,將總計(jì)遞增2、,因?yàn)槠淝耙恢悼杀患僭O(shè)為因先驗(yàn)約束驅(qū)動(dòng)更新而是正確的。這種性質(zhì)的情況可提供給多個(gè)改變通知過程(例如,分別用于一般元素和單元素更新的onVO和onV[i]())。在這些通知過程之間進(jìn)行選擇是由對(duì)數(shù)據(jù)成員的改變的性質(zhì)和改變的情形來(lái)驅(qū)動(dòng)的。存在輸入源程序包括能更高效地實(shí)現(xiàn)一些更新的約束的情形。更具體地,如果輸入源程序包括對(duì)與其部分或全部輸入處于同一范圍的約束的聲明性指定,則可通過將范圍內(nèi)命令性代碼自動(dòng)插入到命令性輸出程序表示中來(lái)在其范圍內(nèi)強(qiáng)制實(shí)施該約束。這些約束響應(yīng)于對(duì)范圍外輸入的改變的強(qiáng)制實(shí)施可如上所述地處理。在實(shí)踐中,有利的是提供對(duì)用以執(zhí)行每個(gè)約束反應(yīng)器對(duì)象的程序控制的線程的選擇。當(dāng)今的編程環(huán)境通常提供這種線程選擇。通知和反應(yīng)機(jī)制也能很好地與其它編程方法相組合。例如,結(jié)合如上所述的通知, 對(duì)數(shù)據(jù)結(jié)構(gòu)的封裝以使改變只能通過增變器過程來(lái)作出是有益的,這是因?yàn)閮H增變器過程可對(duì)要求約束驅(qū)動(dòng)更新的狀態(tài)作出改變。約束的概念可擴(kuò)展至表示專用約束,該表示專用約束涉及具有不同表示的數(shù)據(jù)成員。這里,表示指的是如何物理地表示數(shù)據(jù)成員。常見表示包括普通的存儲(chǔ)器內(nèi)、串、未類型化和網(wǎng)絡(luò)表示。可采用適配器來(lái)根據(jù)需要將一種表示翻譯成另一種表示以監(jiān)視和強(qiáng)制實(shí)施約束。如前所述約束驅(qū)動(dòng)的命令性更新具有許多應(yīng)用。約束可涉及復(fù)雜事件(例如交易或貿(mào)易)處理。也可采用約束來(lái)以聲明性方式指定目標(biāo)編程語(yǔ)言的語(yǔ)法。目標(biāo)編程語(yǔ)言可以是或可以不是輸入編程語(yǔ)言,并且可以是或可以不是在本發(fā)明的自動(dòng)實(shí)踐實(shí)施例中采用的任何中間表示的語(yǔ)言。
本發(fā)明的各實(shí)施例的約束處理能力可通過提供用于處理在翻譯期間未解析(即, 翻譯成命令性代碼)的約束集的運(yùn)行時(shí)約束引擎來(lái)擴(kuò)展。盡管這在一些情形下可能是有益的,但常常更為優(yōu)選的是避免對(duì)運(yùn)行時(shí)約束引擎的依賴性以保持命令性編程的效率。上文描述的通知和反應(yīng)器機(jī)制不局限于約束的實(shí)現(xiàn)。反應(yīng)器也可包含任意命令性代碼,盡管優(yōu)選的是這些命令性代碼至少為冪等的(即在相同輸入上將其執(zhí)行兩次或更多次具有與對(duì)其執(zhí)行一次相同的效果),以便避免意想不到的副作用。因此,本發(fā)明的一些實(shí)施例除約束外還包括過程觸發(fā)器(PT)。在這些情形下,PT根據(jù)其編程語(yǔ)言在輸入源程序中指定,并且對(duì)于每個(gè)PT,標(biāo)識(shí)其觸發(fā)輸入。每個(gè)PT包括當(dāng)相應(yīng)的觸發(fā)輸入改變時(shí)要調(diào)用的一個(gè)或多個(gè)觸發(fā)器過程。每個(gè)PT的觸發(fā)器表示是自動(dòng)提供的,其中觸發(fā)器表示包括觸發(fā)反應(yīng)器對(duì)象以在實(shí)例化時(shí)注冊(cè)輸入改變通知,觸發(fā)反應(yīng)器對(duì)象包括相應(yīng)的觸發(fā)器過程。通知代碼還調(diào)節(jié)觸發(fā)器表示對(duì)輸入改變通知的注冊(cè)。觸發(fā)器表示在命令性輸出程序表示中被實(shí)例化,以使對(duì)觸發(fā)輸入的改變自動(dòng)導(dǎo)致所述觸發(fā)器過程的執(zhí)行。如前所述,觸發(fā)器過程優(yōu)選地為冪等的。 這些觸發(fā)器表示和觸發(fā)反應(yīng)器對(duì)象分別類似于前述的約束表示和約束反應(yīng)器對(duì)象?;谕ㄖ募s束集翻譯提供若干重大益處1.編程語(yǔ)言中關(guān)系和不變式的簡(jiǎn)潔表達(dá),如由常規(guī)約束編程提供的,但在謹(jǐn)慎地手動(dòng)指定的命令性編程的執(zhí)行效率的情況下,匹配硬件命令性執(zhí)行模型。支持對(duì)象關(guān)系、應(yīng)用專用算法、一般約束解算、分析器生成、復(fù)雜事件處理、分布式操作和類屬接口的自動(dòng)維護(hù)的可擴(kuò)展性。2.對(duì)顯式約束集對(duì)約束處理進(jìn)行的分組、提供受控制的單獨(dú)調(diào)度的線程執(zhí)行以及立即執(zhí)行、通知處理共享和每個(gè)約束集的共享狀態(tài)的控制優(yōu)化約束處理開銷。相反地,約束可被劃分成單獨(dú)的集合以允許作為單獨(dú)約束集的并發(fā)執(zhí)行。3.狀態(tài)的不同表示之間的約束的可擴(kuò)展性,包括網(wǎng)絡(luò)表示、存儲(chǔ)表示、類屬/無(wú)類型標(biāo)識(shí)、串/XML表示等。4.用于為數(shù)據(jù)成員的修改以及響應(yīng)于這些數(shù)據(jù)成員被修改而進(jìn)行的約束維護(hù)兩者自動(dòng)生成命令性代碼序列的統(tǒng)一機(jī)制。在本發(fā)明的實(shí)施例中,源自翻譯器的約束驅(qū)動(dòng)的執(zhí)行能夠進(jìn)入無(wú)限循環(huán)而不是收斂。然而,存在許多方式使命令性程序能以沒有約束的無(wú)限循環(huán)告終,因此該約束機(jī)制不改變命令性編程的這個(gè)基本特征。主要目的是通過支持約束來(lái)提供命令性程序的更簡(jiǎn)潔表達(dá),但不更改或?qū)姑钚猿绦虻幕緦傩?。此外,可獲得命令性語(yǔ)言的完整能力以應(yīng)付該約束實(shí)現(xiàn)不合適的情形。最后,在包括約束解算器實(shí)現(xiàn)的實(shí)施例中,解算器可在其行為優(yōu)良的情形下調(diào)用。根據(jù)上述原理,可通過利用命令性編程結(jié)構(gòu)高效地實(shí)現(xiàn)約束編程。一旦約束編程以該方式提供,可能出現(xiàn)的問題是如何處理軟件任務(wù)包括約束和命令性元素的情形(例如,硬件設(shè)備的過程通電序列),這種情形可用命令形式最清楚地表達(dá)。第一方法是簡(jiǎn)單地表達(dá)用于實(shí)現(xiàn)約束編程的底層命令性語(yǔ)言中的這種命令性元素。第二方法是提供約束編程環(huán)境內(nèi)的結(jié)構(gòu),其提供命令性過程的高效實(shí)現(xiàn)。該第二方法可通過使底層命令性編程環(huán)境有效地對(duì)于用約束編程環(huán)境工作的程序員不可見,來(lái)提供具有更優(yōu)透明性和簡(jiǎn)化編碼的優(yōu)勢(shì)。相反,第一方法可能要求程序員同時(shí)考慮2個(gè)抽象層(即,約束環(huán)境和底層命令性環(huán)境),這可能給編程和調(diào)試增加不期望的復(fù)雜性。本發(fā)明的優(yōu)選實(shí)施例可包括約束編程環(huán)境內(nèi)的結(jié)構(gòu),其提供命令性過程的高效實(shí)現(xiàn)。上述的約束實(shí)現(xiàn)方法可視作基于將約束翻譯成命令性代碼的子例程,這些命令性代碼的子例程在約束依賴改變的狀態(tài)下由觸發(fā)機(jī)制調(diào)用。然后,由于響應(yīng)于變量改變的回調(diào)結(jié)果,經(jīng)編譯的子例程被簡(jiǎn)單執(zhí)行,且子例程根據(jù)約束更新應(yīng)用狀態(tài)。在這種情形下,執(zhí)行可能非常高效,因?yàn)檫@些子例程可預(yù)先編譯成高效機(jī)器代碼,從而提供與精心編寫的常規(guī)命令性軟件類似的高效執(zhí)行。但是,該性能依賴于主程序活動(dòng),主程序活動(dòng)包含改變一個(gè)或多個(gè)約束所依賴的值,這與添加和移除許多約束相反。這是因?yàn)樘砑雍鸵瞥s束包含用回調(diào)通知工具注冊(cè)和注銷回調(diào),這樣做成本非常高,且還分配空間和解除分配空間以便存儲(chǔ)約束,這是第二高的成本。幸運(yùn)的是,許多約束應(yīng)用可表征為主要涉及對(duì)約束參數(shù)值的改變,與以任何高頻添加和移除約束相反。無(wú)關(guān)于約束編程的簡(jiǎn)明性,存在用于將行為表達(dá)為指定動(dòng)作序列的過程 (procedure)的更自然和清楚的情形。例如,一裝置的通電序列要求一系列時(shí)間上的步驟, 其通常最清楚和最簡(jiǎn)明地表達(dá)為過程。經(jīng)常,該序列要求在步驟之間等待一段時(shí)間或等待條件變?yōu)檎?,如由表達(dá)來(lái)指定。在常規(guī)編程語(yǔ)言中,其可在線程的上下文中執(zhí)行該過程,該線程可通過一些等待結(jié)構(gòu)來(lái)掛起和恢復(fù)其執(zhí)行,等待結(jié)構(gòu)允許其等待時(shí)間間隔或特定條件。約束表達(dá)的命令性序列的簡(jiǎn)單表示意味著添加和移除約束以高效地驅(qū)動(dòng)約束解算器以便貫穿該通電序列變遷該程序,以及還意味著貫穿時(shí)間(掛起以等待執(zhí)行恢復(fù)的時(shí)間)記錄過程執(zhí)行狀態(tài),并意味著在滿足條件后恢復(fù)該狀態(tài)。該方法的一個(gè)示例稱作約束命令性編程(CIP)。在常規(guī)CIP中,通過將過程建模為在一時(shí)刻的狀態(tài)和在另一時(shí)刻的狀態(tài)之間添加一次性約束來(lái)提供過程支持。例如,過程中的常規(guī)賦值可被建模為在時(shí)刻T的右手側(cè)的值和時(shí)刻T+1的左手側(cè)的值之間的一次性約束。類似地,等待一表達(dá)變?yōu)檎婵杀唤樘砑又付ㄔ摫磉_(dá)的一次性約束。雖然該方法可提供與約束編程環(huán)境一致的正確過程語(yǔ)義,其還可導(dǎo)致低效實(shí)現(xiàn)。 在約束解算方法中,約束解算器被調(diào)用以重新評(píng)價(jià)在各步驟上的約束存儲(chǔ),從而確定添加對(duì)應(yīng)于下一過程步驟的新約束的效果并移除對(duì)應(yīng)于前一個(gè)的約束的效果。這種級(jí)別的約束存儲(chǔ)的改變可抵消常見于通用約束解算器的優(yōu)化,從而造成成本相當(dāng)高。任何情況下,這比命令性編程語(yǔ)言過程的常規(guī)命令性實(shí)現(xiàn)昂貴得多。即使在約束被翻譯成由改變通知機(jī)制觸發(fā)的子例程的約束實(shí)現(xiàn)中,如本發(fā)明的一些實(shí)施例中,用約束簡(jiǎn)單實(shí)現(xiàn)的過程代碼可導(dǎo)致顯著低效,因?yàn)樵诿總€(gè)步驟中添加一個(gè)約束并移除一個(gè)約束,招致用改變通知機(jī)制注冊(cè)和注銷的顯著開銷。這與相對(duì)極少添加和移除約束的上述情形相反。在約束編程語(yǔ)言中,通常將過程代碼直接翻譯成對(duì)應(yīng)常規(guī)過程實(shí)現(xiàn)是不可行的, 因?yàn)榧s束編程語(yǔ)言不具有控制或調(diào)用過程處理的線程概念。即,過程概念需要集成為如上的約束語(yǔ)義的延伸。在本發(fā)明的實(shí)施例中,約束命令性計(jì)算機(jī)編程語(yǔ)言的翻譯器接受一個(gè)或多個(gè)過程的指定,并自動(dòng)生成以與CIP模型一致的語(yǔ)義來(lái)高效執(zhí)行約束的代碼。過程可被認(rèn)為是一次性約束的集合。但是,在一個(gè)實(shí)施例中,可由一般過程編程賦值結(jié)構(gòu)加上一般控制流語(yǔ)句來(lái)指定過程,一般過程編程賦值結(jié)構(gòu)對(duì)應(yīng)于將對(duì)應(yīng)約束添加到約束存儲(chǔ)/從約束存儲(chǔ)移除對(duì)應(yīng)約束,而一般控制流語(yǔ)句(if、else, while等以及等待 (wait))控制賦值操作的順序?!暗却笨刂屏髡Z(yǔ)句具有在前進(jìn)到過程中的后續(xù)步驟之前掛起執(zhí)行直到超時(shí)期間或直到任選條件成立的常規(guī)過程語(yǔ)義(“等待”語(yǔ)句視作類似于常規(guī) goto (轉(zhuǎn)到)、!^eturn (返回)等語(yǔ)句的過程流語(yǔ)句,因?yàn)槠浯_定控制流,即在該情形下掛起控制流除非超時(shí)或所需條件為真)。在優(yōu)選實(shí)施例中,約束被翻譯成由改變通知機(jī)構(gòu)調(diào)用已生成子例程的基于回調(diào)的實(shí)現(xiàn),用該改變通知機(jī)構(gòu)根據(jù)其指定輸入和依賴性注冊(cè)這些子例程。在優(yōu)選實(shí)施例中,約束集對(duì)象類型顯式地被聲明,指定輸入和輸出,任選地由在輸入和輸出中指定的元素來(lái)觸發(fā)某局部狀態(tài)和一個(gè)或多個(gè)約束。然后在約束集的范圍中聲明一過程,且作為聚集約束,可被指定成由輸入數(shù)據(jù)元素和局部狀態(tài)表達(dá)的一些表達(dá)式來(lái)觸發(fā)。在本說明書中,過程上下文狀態(tài)自動(dòng)生成為局部狀態(tài)作為該約束集的一部分。在該設(shè)定中,不指定輸入?yún)?shù)或返回值, 因?yàn)檫@些隱含地是約束集中的那些部分。在該優(yōu)選實(shí)施例中,多個(gè)過程可在約束集內(nèi)聲明,如果各個(gè)過程共享相同輸入和輸出的話。單個(gè)過程可具有對(duì)于一個(gè)或多個(gè)輸入的零(null)依賴性并對(duì)一個(gè)或多個(gè)輸出具有零效果。即,其可僅使用輸入和輸出的子集。此外,一過程可具有約束集的一個(gè)或多個(gè)局部數(shù)據(jù)元素作為其參數(shù)/輸入或輸出/返回值。在該優(yōu)選實(shí)施例中,在約束集之外聲明的過程可被實(shí)現(xiàn)成僅包含該過程的約束、 且其輸入?yún)?shù)為過程的輸入、且其返回值是該約束集的輸出且不具有局部變量的約束集。 即,其可實(shí)現(xiàn)成根據(jù)過程指定直接確定的約束集的退化情形,并因此被限制。其不能具有局部狀態(tài)且不能與其它過程共享任何指定。以下描述本發(fā)明的一些實(shí)施例的基本翻譯方法(約束編程語(yǔ)言的過程),描述了假設(shè)如上所述的嵌入的約束集實(shí)現(xiàn)。術(shù)語(yǔ)子例程(subroutine)用于描述可在底層計(jì)算機(jī)平臺(tái)執(zhí)行的命令性指定。為了將約束編程語(yǔ)言中的利用回調(diào)機(jī)構(gòu)實(shí)現(xiàn)的過程翻譯成子例程,在遭遇過程聲明時(shí),翻譯器生成包含情形指示變量的過程上下文狀態(tài)類型和可能需要保存的其它上下文狀態(tài),如以下所闡述地。然后其生成封閉約束集的范圍中的該上下文類型實(shí)例的聲明。如果該過程未在封閉約束的上下文中聲明,其首先生成對(duì)應(yīng)于封閉約束集的代碼,根據(jù)參數(shù)和過程的返回值(如果有)指定輸入和輸出。在實(shí)施例中,特定異常輸出得到支持,對(duì)應(yīng)于過程的異常返回。翻譯器還針對(duì)各輸入生成過程的回調(diào)子例程,包括超時(shí)回調(diào)。這些子例程的每一個(gè)安排成由改變通知機(jī)構(gòu)根據(jù)其分別的輸入來(lái)回調(diào)。在使用面向?qū)ο蠼Y(jié)構(gòu)的實(shí)施例中,改變通知機(jī)構(gòu)允許注冊(cè)關(guān)于輸入對(duì)象的回調(diào),從而在該對(duì)象的任何通知數(shù)據(jù)成員改變時(shí)接收通知。各回調(diào)子例程生成為命令性代碼塊的集合,各個(gè)命令性代碼塊具有確定在回調(diào)時(shí)代碼塊是否被執(zhí)行的“啟用(enable)”變量。各塊對(duì)應(yīng)于一個(gè)或多個(gè)約束的命令性動(dòng)作。 在一個(gè)實(shí)施例中,啟用被實(shí)現(xiàn)為常規(guī)“if”語(yǔ)句,即if (enableConstrainti 為真){...約束命令性代碼
10
}在優(yōu)選實(shí)施例中,生成一組代碼塊,使得或者在給定回調(diào)子例程中在任何時(shí)刻單個(gè)代碼塊被啟用,或者在子例程中所啟用的一組代碼塊是連續(xù)的。因此,可由諸如在C/C++ 編程語(yǔ)言中可用的switch(切換)語(yǔ)句來(lái)執(zhí)行該啟用,其中case(情形)變量的采用對(duì)應(yīng)于第一被啟用代碼塊的值。以下描述假設(shè)該實(shí)施例。還假設(shè)面向?qū)ο蟮膶?shí)現(xiàn),在該實(shí)現(xiàn)中回調(diào)機(jī)制支持注冊(cè)根據(jù)對(duì)象(即,其所有被監(jiān)視數(shù)據(jù)成員)而非個(gè)別數(shù)據(jù)成員的回調(diào)。在翻譯期間,翻譯器維持這些回調(diào)子例程的當(dāng)前(current)集的指示以及這些回調(diào)子例程內(nèi)的當(dāng)前塊和case語(yǔ)句。圖6a_12c的示例示出在該框架中可如何實(shí)現(xiàn)各種語(yǔ)句的翻譯。圖6a示出具有自變量a、b及c的輸入過程。圖6b示出圖6a過程的輸入“a”的回調(diào)子例程,緊跟在語(yǔ)句R的翻譯后。圖7-11示出圖6b的回調(diào)子例程如何由依賴于圖6a 的語(yǔ)句S的翻譯器修改。在此為了簡(jiǎn)單起見假設(shè),語(yǔ)句R在回調(diào)_a(CallbaCk_a)子例程中被處理。圖7涉及其中語(yǔ)句S未被標(biāo)記且不是控制流語(yǔ)句的情形。如上文指示地,翻譯器在各回調(diào)子例程中跟蹤當(dāng)前塊。在這些示例中,當(dāng)前塊變?yōu)閴K‘i’,且語(yǔ)句S的翻譯需要在各回調(diào)子例程中在各當(dāng)前塊結(jié)束時(shí)添加S。在該示例中,僅示出用于輸入自變量a的回調(diào)子例程,因?yàn)樽宰兞縝和c的回調(diào)子例程遵循相同翻譯模式。圖8涉及語(yǔ)句S是return語(yǔ)句的情形。在此,翻譯需要添加代碼以將switch語(yǔ)句的變量設(shè)定給end case (最終情形)(即cvar = clast),且在主switch語(yǔ)句后將返回語(yǔ)句添加到各回調(diào)子例程。在該示例中,僅示出輸入自變量a的回調(diào)子例程,因?yàn)樽宰兞縝和 c的回調(diào)子例程遵循相同翻譯模式。圖9涉及語(yǔ)句S是throw (拋出)語(yǔ)句的情形。在此,翻譯需要根據(jù)由throw語(yǔ)句提供的任何(多個(gè))參數(shù)添加代碼以設(shè)置exc印tion(異常),并添加代碼以在各回調(diào)過程中終止執(zhí)行。在該示例中,僅示出輸入自變量a的回調(diào)子例程,因?yàn)樽宰兞縝和c的回調(diào)子例程遵循相同翻譯模式。圖10涉及語(yǔ)句S是標(biāo)記語(yǔ)句(即,可能的入口點(diǎn))的情形。在此,翻譯需要分配新case號(hào)(在此為‘i+1’),添加代碼以開始新case塊(在此為case i+1),并將語(yǔ)句S的代碼添加到新case塊,所有這些動(dòng)作在各相關(guān)回調(diào)過程中進(jìn)行。優(yōu)選地,如在該示例中,根據(jù)標(biāo)準(zhǔn)C/C++switch語(yǔ)句語(yǔ)義,case i的執(zhí)行容易變?yōu)閏ase i+1。在該示例中,僅示出輸入自變量a的回調(diào)子例程,因?yàn)樽宰兞縝和c的回調(diào)子例程遵循相同翻譯模式。在優(yōu)選實(shí)施例中,case變量設(shè)置為新塊號(hào)(即,cvar = i+Ι),使得保證case變量指示當(dāng)前塊。這種一致性可有助于處理異常。圖11涉及語(yǔ)句S是goto (轉(zhuǎn)到)語(yǔ)句的情形。在此,翻譯需要添加代碼以將case 變量設(shè)置到對(duì)應(yīng)于指定標(biāo)記的case,從而通報(bào)合適的條件且返回,所有這些動(dòng)作在各相關(guān)回調(diào)過程中進(jìn)行。適當(dāng)條件的通知包括用于將程序控制轉(zhuǎn)換成受指示入口點(diǎn)的各種可能性。對(duì)于同一過程中的入口點(diǎn)而言,可采用常規(guī)goto結(jié)構(gòu)(如圖12b的示例)。對(duì)于不同過程中的入口點(diǎn)而言,可對(duì)包含期望case的子例程作直接調(diào)用(如圖12c的示例)。到達(dá)不同過程中的接入點(diǎn)的另一方式為調(diào)用“信號(hào)(signal) ”例程,其通過通知和回調(diào)機(jī)制來(lái)間接調(diào)用相關(guān)聯(lián)的回調(diào)子例程(例如,將變量a標(biāo)記為具有改變的值,以便使callback_a被通知和回調(diào)機(jī)制所調(diào)用)。在該示例中,僅示出輸入自變量a的回調(diào)子例程,因?yàn)樽宰兞縝和c的回調(diào)子例程遵循相同翻譯模式。圖Ua-C涉及語(yǔ)句S是等待(wait)語(yǔ)句的情形。圖1 示出示例性wait語(yǔ)句。 圖12b_c示出對(duì)應(yīng)于圖6a的語(yǔ)句S是圖12a的wait語(yǔ)句的情形的回調(diào)例程。在該示例中,wait語(yǔ)句包括條件測(cè)試(即a<b)、超時(shí)參數(shù)(即1.5)、“主體(body) ”,如果在自調(diào)用 wait語(yǔ)句起的消逝時(shí)間超過超時(shí)參數(shù)之前條件測(cè)試變?yōu)檎?,?zhí)行該主體,且如果在自調(diào)用 wait語(yǔ)句起的消逝時(shí)間超過超時(shí)參數(shù)之前條件測(cè)試未變?yōu)檎?,?zhí)行“超時(shí)(timeout)”。在此,翻譯需要以下動(dòng)作1)在對(duì)應(yīng)于條件測(cè)試的輸入的各回調(diào)子例程中(即calll3ack_a和callback_b, 但不是callback^),針對(duì)后續(xù)執(zhí)行對(duì)case號(hào)賦值(即i+Ι),添加具有新case號(hào)并包括代碼的case塊以便在條件測(cè)試為真時(shí)執(zhí)行wait語(yǔ)句的“主體”。在當(dāng)前塊中,添加代碼以在已經(jīng)滿足等待條件測(cè)試時(shí)執(zhí)行等待“主體”。在當(dāng)前塊(即塊i)中,添加代碼以設(shè)置當(dāng)前塊以便在后續(xù)處理中成為新塊(即cvar = i+1)。用return或break (中斷)語(yǔ)句終止當(dāng)前塊。圖12b示出以上該示例中的步驟1的效果。2)在超時(shí)回調(diào)子例程中,對(duì)case號(hào)賦值以用于后續(xù)執(zhí)行(即i+Ι),添加具有新 case號(hào)并包括代碼的case塊以便執(zhí)行等待語(yǔ)句的“超時(shí)”。在當(dāng)前塊(即塊i)中,添加代碼以測(cè)試等待條件(如果條件為真跳到等待主體(wait body)),并用于設(shè)置當(dāng)前塊以便在后續(xù)處理中成為新塊(即cvar = i+1)。用return或break語(yǔ)句終止當(dāng)前塊。圖12c示出以上該示例中的步驟2的效果。在一些情況下,要到達(dá)回調(diào)_時(shí)間(callbackjime)過程中的當(dāng)前塊(即塊i)是不可能的。在這些情況下,翻譯器可從callkickjime過程省略當(dāng)前塊作為優(yōu)化。在圖Ua-c的示例中,注意已翻譯等待語(yǔ)句可視作包含在兩個(gè)case塊(當(dāng)前塊(例如,塊i)結(jié)束和下一塊(例如,塊i+Ι)起始處)中可能是有幫助的。在這些示例中,注意到回調(diào)子例程的case變量的值(即cvar)不受僅從回調(diào)子例程退出的影響,然后再次調(diào)用回調(diào)子例程是重要的。因此,在圖12的示例中,由回調(diào)機(jī)制如下地提供等待語(yǔ)義。當(dāng)在回調(diào)子例程中遭遇對(duì)應(yīng)于等待語(yǔ)句的代碼時(shí),首先檢查等待條件測(cè)試。如果等待條件測(cè)試為真,等待主體被執(zhí)行且執(zhí)行繼續(xù)。如果等待條件測(cè)試為假,由 return/break語(yǔ)句停止回調(diào)子例程中的處理。此外,對(duì)應(yīng)于等待條件測(cè)試的輸入的回調(diào)子例程的case變量被設(shè)置成這些輸入的任一個(gè)的任何改變導(dǎo)致由等待條件測(cè)試構(gòu)成的另一檢查。如果任何這種測(cè)試為真,則等待主體被執(zhí)行且然后執(zhí)行繼續(xù)。同時(shí),以由適當(dāng)時(shí)序變量的狀態(tài)改變確定的方式來(lái)檢查回調(diào)的時(shí)刻。例如,當(dāng)?shù)却Z(yǔ)句被調(diào)用時(shí),調(diào)用等待語(yǔ)句的時(shí)刻可被保存,且超時(shí)回調(diào)子例程可具有周期性地更新為其輸入的系統(tǒng)時(shí)間變量。該系統(tǒng)時(shí)間變量的改變?nèi)缓髮⒃斐蓤?zhí)行超時(shí)回調(diào),如果超時(shí)發(fā)生時(shí)其將執(zhí)行等待語(yǔ)句的超時(shí)分支。狀態(tài)變量(例如,以下示例觀-34中所描述)的適當(dāng)使用是確保一旦執(zhí)行等待語(yǔ)句的“主體”分支就不可能執(zhí)行等待語(yǔ)句的“超時(shí)”分支的優(yōu)選方式。在一些實(shí)施例中,各約束集具有其自身的超時(shí)變量,且各約束集在單個(gè)控制線程上實(shí)現(xiàn)。在該情況下,約束集線程或者執(zhí)行回調(diào)子例程或者執(zhí)行超時(shí)子例程,由此消除執(zhí)行同一等待語(yǔ)句的“主體”和“超時(shí)”兩者的可能性。翻譯器維持嵌套在當(dāng)前范圍中的先前代碼塊列表,那些代碼塊未被return或 throw語(yǔ)句終止。從該范圍退出時(shí),諸如else語(yǔ)句結(jié)束時(shí),如果存在這種先前的代碼塊,在遭遇新的可執(zhí)行語(yǔ)句時(shí),其創(chuàng)建case塊以包含該新的可執(zhí)行語(yǔ)句,其包括代碼以將該case變量設(shè)置到這些塊的每一個(gè)中的case,從而它們各自將控制轉(zhuǎn)移到新case塊,且然后其從先前代碼塊的集合中移除這些塊。遭遇過程結(jié)束時(shí),翻譯器向保留在該未終止塊列表中的任何代碼塊添加語(yǔ)句以使它們轉(zhuǎn)移到過程的終止?fàn)顟B(tài)。翻譯器還在等待點(diǎn)處添加“活動(dòng)(live),,(即活躍)的任何局部過程變量的保存, 并添加代碼以還原活動(dòng)的各新case塊中的這些變量的每一個(gè),從而按需延伸上下文狀態(tài)類型中的字段。在優(yōu)選實(shí)施例中,輸入指定可包括如for和while環(huán)的結(jié)構(gòu)化控制流結(jié)構(gòu)。通過利用本領(lǐng)域公知的編譯器技術(shù)將這些翻譯成goto結(jié)構(gòu),然后得到的goto結(jié)構(gòu)可如上所述地被處理。在一實(shí)施例中,翻譯器生成對(duì)應(yīng)于過程的直到第一等待的初始步驟或過程中的標(biāo)記的啟動(dòng)子例程,其執(zhí)行這些步驟,且然后安排控制轉(zhuǎn)移到使用上述控制流實(shí)現(xiàn)的后續(xù)步驟(即設(shè)置case變量并安排相關(guān)條件下的回調(diào))。從而,將不包含標(biāo)記或等待語(yǔ)句的過程翻譯成該單個(gè)子例程。在優(yōu)選實(shí)施例中,當(dāng)過程不處于初始狀態(tài)過程被觸發(fā)成開始執(zhí)行時(shí),其不采取動(dòng)作??扇芜x地,其可被指定成設(shè)置異常輸出。對(duì)于未嵌入在約束集范圍中的過程而言不發(fā)生該情形,因?yàn)樾录s束集在每次“調(diào)用”時(shí)用其過程上下文實(shí)例化,如同以下結(jié)合示例觀-34 所描述的。本發(fā)明實(shí)施例允許作為命令性結(jié)構(gòu)的過程以約束編程語(yǔ)言指定,支持一般過程語(yǔ)義,包括條件性地掛起執(zhí)行等待一時(shí)間周期或等待條件表達(dá)變?yōu)檎娴哪芰?,再自?dòng)翻譯成常規(guī)子例程以便以與高效常規(guī)命令性編程可媲美的效率執(zhí)行。與針對(duì)約束編程語(yǔ)言的過程的其它提供方式相比,這種效率是由本發(fā)明實(shí)施例提供的顯著優(yōu)勢(shì)。有效地,執(zhí)行回調(diào)子例程以實(shí)現(xiàn)執(zhí)行過程可被認(rèn)為由特定邏輯處理器來(lái)實(shí)現(xiàn),其中回調(diào)子例程中諸case的case號(hào)可被認(rèn)為是專用指令代碼,回調(diào)子例程可被認(rèn)為是專用指令執(zhí)行裝置,且上下文狀態(tài)數(shù)據(jù)可被認(rèn)為是專用上下文。因此,根據(jù)上述原理翻譯的過程僅招致上下文保存和還原以及由該過程特點(diǎn)所要求的空間的最小開銷。另一方面,在約束集范圍之外指定的過程的調(diào)用成本更高,因?yàn)橐话闱闆r下,隱式約束集需要?jiǎng)討B(tài)地實(shí)例化/分配,輸入需要注冊(cè)回調(diào),且調(diào)用者(caller)需要等待過程完成,過程完成時(shí)注銷和釋放這些資源。將“事件序列化命令性過程”認(rèn)為是命令性過程是有幫助的,其具有對(duì)外部事件的某依賴性。實(shí)踐中通常遭遇這種過程(例如,檢查超時(shí)條件的設(shè)備啟動(dòng)過程)。從這一觀點(diǎn),前述原理(以及以下的示例觀-34)可被認(rèn)為是針對(duì)約束提供通知和回調(diào)代碼的思想的延伸,從而還針對(duì)事件提供通知和回調(diào)代碼。更具體地,可用約束編程語(yǔ)言表達(dá)輸入源程序,約束編程語(yǔ)言還提供事件序列化命令性過程的指定。輸入源程序可被自動(dòng)翻譯成中間命令性表示,其中中間表示中約束的通知和回調(diào)代碼提供約束的高效實(shí)現(xiàn),且其中中間表示中事件的通知和回調(diào)代碼提供事件序列化命令性過程的高效實(shí)現(xiàn)。該命令性中間表示可被自動(dòng)翻譯成計(jì)算機(jī)可讀命令性輸出表示,其反過來(lái)可作為輸出提供(例如,給用戶)。如上所述的條件等待結(jié)構(gòu)可被采用以提供約束框架內(nèi)的控制線程。例如,對(duì)于事件序列化命令性過程的調(diào)用可被翻譯成過程執(zhí)行開始,其后跟隨條件等待結(jié)構(gòu),一旦所調(diào)用的事件序列化命令性過程終止,條件等待結(jié)構(gòu)使執(zhí)行返回到過程調(diào)用后的點(diǎn)。下面給出本發(fā)明實(shí)施例的這些和其它的方面的進(jìn)一步描述。附圖簡(jiǎn)述圖1示出已知編程結(jié)構(gòu)的一個(gè)示例。圖2示出由本發(fā)明的一個(gè)實(shí)施例提供的功能的示例。圖3a_b示出涉及本發(fā)明一個(gè)實(shí)施例的示例的輸入代碼段。圖如-b示出與圖3a_b的示例的輸入代碼段對(duì)應(yīng)的自動(dòng)生成的表示。圖5a4b示出與圖3a_;3b和圖4a_4b的示例的輸入代碼段對(duì)應(yīng)的命令性輸出程序表不。圖6a_12c示出根據(jù)本發(fā)明實(shí)施例的控制流語(yǔ)句的翻譯示例。
具體實(shí)施例方式在本發(fā)明的一個(gè)實(shí)施例中,編程語(yǔ)言包括用于指定被稱為約束集的一組約束的一個(gè)或多個(gè)結(jié)構(gòu)?!凹s束”表示需要在所有時(shí)間或在特定一個(gè)或多個(gè)時(shí)間保持的數(shù)據(jù)成員之間的關(guān)系的聲明性指定。在前一種情形下,約束本質(zhì)上等同于不變式。后一種情形的例子是僅在一些數(shù)據(jù)成員初始化時(shí)保持的關(guān)系。另一示例是引用另一對(duì)象中的數(shù)據(jù)成員的約束; 該約束僅在其它對(duì)象已知時(shí)保持。“主動(dòng)約束”表示其中當(dāng)涉及關(guān)系的狀態(tài)改變時(shí)采取命令性動(dòng)作以建立和維持這個(gè)關(guān)系的約束。相比主動(dòng)約束,被動(dòng)或檢查約束僅僅在檢測(cè)到關(guān)系不保持時(shí)生成出錯(cuò)或異常指示。關(guān)系的性質(zhì)可由約束運(yùn)算符來(lái)指示。例如,相等關(guān)系可由 “=”運(yùn)算符來(lái)表示。術(shù)語(yǔ)“數(shù)據(jù)成員”用來(lái)指示能夠存儲(chǔ)數(shù)據(jù)的已命名狀態(tài)單元。之所以將其命名為 “成員”是因?yàn)樗敲Q某一范圍的成員,例如類型、名稱空間或過程。該術(shù)語(yǔ)也用于C++編程語(yǔ)言中。然而,使用該術(shù)語(yǔ)不是將這些實(shí)施例局限于C++擴(kuò)展或其任意派生物。在一個(gè)實(shí)施例中,編程語(yǔ)言提供面向?qū)ο蟮恼Z(yǔ)言的傳統(tǒng)特征,包括類、繼承、動(dòng)態(tài)函數(shù)(虛函數(shù))分派,另外還用每個(gè)數(shù)據(jù)成員的約束集(constraintkt)結(jié)構(gòu)和約束上下文來(lái)擴(kuò)展。約束集結(jié)構(gòu)可由關(guān)鍵字“constraintSet”指示并可另行遵循語(yǔ)言中的類型指定的句法。數(shù)據(jù)成員上下文可被表示為以一數(shù)據(jù)成員的聲明之后緊隨的一個(gè)“{”符號(hào)開始并由符號(hào)“},,終止。其它實(shí)施例可使用不同句法,例如“begin (開始),,和“end(結(jié)束),, 關(guān)鍵字以及受約束的數(shù)據(jù)成員的顯式指定,而不是如上所述使其隱式地耦合于數(shù)據(jù)成員的聲明。有了約束集,可定義由集中的約束引用的對(duì)象的局部名。在一個(gè)實(shí)施例中,在約束集中的局部數(shù)據(jù)成員的聲明中的類型指示之前使用“ input (輸入)”關(guān)鍵字限定詞,指示僅用作對(duì)該集合中的各約束的輸入(只讀)的數(shù)據(jù)成員,如果局部變量?jī)H寫入約束集中則使用“output (輸出)”,且如果該集合中的各約束可能使該對(duì)象既能讀出又能寫入,則使用 “inputOutput (輸入輸出)”。例如,在例1中,一個(gè)簡(jiǎn)單的約束集“R印ortMaintenance (報(bào)
表維護(hù))”
14constraintset ReportMaintenance { input Inventory inventory; input Accounting accounting; inputOutput Report report;
report->total = inventory->part{ “isAppliedOnAudit = true; MsScheduled = false;
}
report->cost = report->total*accounting->avgPrice;
}
例 1 約束集指定(ConstraintSet Specification)指定了關(guān)于inventroy(目錄)中的全部part (部件)和cost (成本)以及集合part的r印ort (報(bào)表)之間的約束。(這里,inventory中的“part”數(shù)據(jù)成員指定對(duì)inventory對(duì)象中的每個(gè)類型part有一條目的集合,每一條目提供了 inventory中該類型的part的計(jì)數(shù)。)當(dāng)IteportMaintenance約束集被實(shí)例化為特定inventory、 accounting (記賬)和import對(duì)象時(shí),根據(jù)由這些約束指定的關(guān)系來(lái)設(shè)定total (總計(jì)) 和cost的受約束的數(shù)據(jù)成員,并隨后當(dāng)任一引用的數(shù)據(jù)成員改變時(shí)維持該受約束的數(shù)據(jù)成員。約束可用其中指定了該約束的一個(gè)或多個(gè)屬性的子上下文來(lái)指定,如例1所示。 這里,在審計(jì)期間應(yīng)用(AppliedOnAudit)的屬性被設(shè)為真,使翻譯器生成審計(jì)代碼以檢查指定的約束在軟件審計(jì)期間保持。第二屬性“idchedulecK被調(diào)度)”被設(shè)定為假以指示相關(guān)聯(lián)的約束處理永遠(yuǎn)被立即調(diào)用,而不是在獨(dú)立線程上調(diào)用(如下面描述的那樣)。該例示出約束工具的關(guān)鍵優(yōu)點(diǎn)。它允許程序員指定import的要求值(即那些需要的值),從而使語(yǔ)義對(duì)軟件的任何審閱者來(lái)說更為清楚。它還減輕了程序員確定軟件中輸入數(shù)據(jù)成員改變的全部位置并手動(dòng)地插入在這些點(diǎn)執(zhí)行約束維持的代碼。如此,避免了對(duì)軟件的修改無(wú)意地增加輸入改變而不增加相應(yīng)的更新代碼的問題。它還緩解了程序員編寫約束命令性代碼以使其對(duì)輸入改變的全部組合正確地維持這種關(guān)系的需要。因此,自動(dòng)約束驅(qū)動(dòng)的更新降低了軟件的開發(fā)成本,減少出錯(cuò)可能性并提高了可靠性并因此提高了可維護(hù)性。同時(shí),所得到的實(shí)現(xiàn)可與傳統(tǒng)命令性實(shí)現(xiàn)具有相同的效率。約束集也可被定義為之前定義的約束集的擴(kuò)展,如例2所示,其被稱為擴(kuò)展的約束集。constraintset ExtendedReportMaintenance ReportMaintenance { inputOutput Supervisor supervisor;
supervisor->attention = (report->cost > supervisor->costLimit); report->cost = report->total*accounting->avgPrice
accounting->overhead; }
例2擴(kuò)展的約束集指定在本例中,定義附加的inputOutput對(duì)象"supervisor,,并重新定義r印ort: cost 上的約束。約束集的顯式指定允許基于共同輸入、共同輸出、共同處理優(yōu)先級(jí)分配和例如存儲(chǔ)器分配等可能的其他屬性來(lái)對(duì)這些約束進(jìn)行分組。下面的說明更詳細(xì)地描述了約束集的實(shí)現(xiàn)以提供聲明性指定的關(guān)鍵優(yōu)勢(shì)(即指定的簡(jiǎn)潔性),而沒有聲明性語(yǔ)言的關(guān)鍵缺陷,即實(shí)現(xiàn)的低效率,并且沒有約束范圍的顯著限制,例如僅限于局部實(shí)例變量。A.約束集實(shí)現(xiàn)在一優(yōu)選實(shí)施例中,翻譯器生成約束集的內(nèi)部表示作為具有指定名稱的類。例如, 例1的約束集的內(nèi)部表示可使用C++指定為
class ReportMaintenance public Fwk::RootConstraintSet { Thread * thread」
}
例3作為C++類的約束集實(shí)現(xiàn)其中基類“Fwk^RootConstraintkt”提供全部約束集所共有的基本功能集。 “threacL”數(shù)據(jù)成員指示與該約束集相關(guān)聯(lián)的過程將要在其上執(zhí)行的處理資源。這里,標(biāo)志 “...”指示完成該實(shí)現(xiàn)所需的C++中的附加實(shí)現(xiàn),這將在下文中描述。C++中所需的公共內(nèi)容、受保護(hù)內(nèi)容等的表示與指針和“const (常量)”的指示一樣為簡(jiǎn)化目的而被省去。擴(kuò)展的約束集可被實(shí)現(xiàn)為從對(duì)應(yīng)于它所擴(kuò)展的約束集的類繼承的類,如例4中的 C++表示中所示那樣。
權(quán)利要求
1.一種將輸入代碼自動(dòng)翻譯成計(jì)算機(jī)可執(zhí)行命令性輸出表示的方法,所述方法包括提供用約束編程語(yǔ)言表達(dá)的輸入源程序,所述輸入源程序還提供事件序列化命令性過程的指定,其中所述輸入源程序包括根據(jù)所述約束編程語(yǔ)言指定的一個(gè)或多個(gè)約束以及一個(gè)或多個(gè)事件序列化命令性過程;將所述輸入源程序自動(dòng)翻譯成中間命令性表示;其中所述中間命令性表示向所述一個(gè)或多個(gè)約束的命令性表示提供針對(duì)約束的通知和回調(diào)代碼;其中所述中間命令性表示向所述一個(gè)或多個(gè)事件序列化命令性過程的命令性表示提供針對(duì)事件的通知和回調(diào)代碼;將所述中間命令性表示自動(dòng)翻譯成所述計(jì)算機(jī)可執(zhí)行命令性輸出表示;以及提供所述計(jì)算機(jī)可執(zhí)行命令性輸出表示作為輸出。
2.如權(quán)利要求1所述的方法,其特征在于,針對(duì)事件的所述通知和回調(diào)代碼包括對(duì)于所述事件序列化命令性過程的輸入的回調(diào)子例程,其中所述回調(diào)子例程的每一個(gè)包括具有一個(gè)或多個(gè)case塊的switch語(yǔ)句,且其中控制流通過設(shè)置所述switch語(yǔ)句的case變量來(lái)提供。
3.如權(quán)利要求2所述的方法,其特征在于,所述控制流包括從以下組選出的一個(gè)或多個(gè)結(jié)構(gòu),所述組包含條件等待、return、goto、語(yǔ)句標(biāo)記、以及拋出異常。
4.如權(quán)利要求2所述的方法,其特征在于,還包括將不具有外部入口點(diǎn)的相鄰case塊而非所述相鄰case塊的第一塊的第一語(yǔ)句組合到單個(gè)case塊中。
5.如權(quán)利要求1所述的方法,其特征在于,還包括為針對(duì)事件的所述通知和回調(diào)代碼提供共用代碼優(yōu)化。
6.如權(quán)利要求1所述的方法,其特征在于,對(duì)所述事件序列化命令性過程之一的調(diào)用被翻譯成過程執(zhí)行的發(fā)起和過程終止的條件性等待結(jié)構(gòu)。
7.如權(quán)利要求1所述的方法,其特征在于,條件性等待結(jié)構(gòu)的翻譯包括提供初始條件檢驗(yàn),并提供由變量改變驅(qū)動(dòng)的條件檢驗(yàn),且其中如果所述初始條件檢驗(yàn)為真,則控制直接轉(zhuǎn)移到由變量改變驅(qū)動(dòng)的所述條件檢驗(yàn)的真分支。
全文摘要
提供一種方法,該方法基于對(duì)每個(gè)約束集的可實(shí)例化對(duì)象的定義將約束集聲明翻譯成命令性代碼序列,在狀態(tài)修改時(shí)插入對(duì)通知回調(diào)機(jī)制的調(diào)用,并將約束上下文中的調(diào)用定義為命令性代碼序列,該命令性代碼序列響應(yīng)于這些回調(diào)采取動(dòng)作以維持這些約束。該通知和回調(diào)機(jī)制還可與外部事件一起采用,由此在約束編程語(yǔ)言中提供事件序列化的命令性過程的高效實(shí)現(xiàn)。
文檔編號(hào)G06F9/44GK102227712SQ200980147969
公開日2011年10月26日 申請(qǐng)日期2009年11月23日 優(yōu)先權(quán)日2008年11月26日
發(fā)明者D·R·謝里登 申請(qǐng)人:奧普塔姆軟件股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
金湖县| 始兴县| 松滋市| 安龙县| 巴林左旗| 翁牛特旗| 察隅县| 宜章县| 龙口市| 浦县| 松原市| 永平县| 昌图县| 科尔| 德州市| 兴城市| 舒兰市| 镇安县| 泰州市| 广汉市| 大方县| 镇远县| 汝阳县| 永吉县| 昂仁县| 民和| 会同县| 轮台县| 柳林县| 商都县| 崇文区| 平度市| 称多县| 神木县| 嘉义县| 景宁| 义乌市| 阿拉善右旗| 鲁山县| 贵南县| 疏附县|