專利名稱:基于通知的約束集翻譯以實(shí)現(xiàn)命令性執(zhí)行的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)語(yǔ)言的自動(dòng)翻譯。背景在計(jì)算機(jī)技術(shù)的發(fā)展中,已開發(fā)了各種編程范例。這些范例中的兩個(gè)范例是命令 性編程和聲明性編程。命令性編程需要提供逐步的命令性指令(例如設(shè)定等于2、增量C、 調(diào)用過(guò)程f O),程序員將這些命令性指令組合起來(lái)以解決感興趣的問(wèn)題。聲明性編程需要 提供頂層信息(例如一組要強(qiáng)制實(shí)施的邏輯約束),該頂層信息經(jīng)常以更透明地涉及感興 趣的問(wèn)題的方式來(lái)指定。命令性編程往往提供改善的執(zhí)行性能,但命令性程序可能非常復(fù) 雜并且難以開發(fā)和維護(hù)。聲明性程序往往相對(duì)容易開發(fā)和維護(hù),但聲明性編程也往往提供 相對(duì)糟糕和/或受限制的執(zhí)行性能(例如緩慢的執(zhí)行和/或無(wú)通用性)。命令性和聲明性 范例的這些優(yōu)缺點(diǎn)是業(yè)內(nèi)公知的。由于計(jì)算機(jī)的底層硬件模型是命令性的,并且處理器執(zhí)行被動(dòng)存儲(chǔ)器上的命令 性指令,因此最早的編程語(yǔ)言(例如匯編語(yǔ)言)是命令性的,且今日廣泛使用的許多語(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)用的過(guò)程。該工具明顯受限于僅允許在當(dāng)前上下文中定義數(shù)據(jù)元素上的觸發(fā)條件。 這些JaVaFX觸發(fā)器也類似于AspectJ和其它所謂面向方面的編程語(yǔ)言中的“連接點(diǎn)”。這 些連接點(diǎn)允許在對(duì)象初始化、字段讀寫和異常處理程序期間在過(guò)程的開始和結(jié)束時(shí)調(diào)用代 碼。受限域聲明性語(yǔ)言的另一示例是用來(lái)向解析器生成器指定語(yǔ)法的語(yǔ)言。該語(yǔ)法被 指定為聲明性產(chǎn)生規(guī)則。解析器生成器將程序作為這些產(chǎn)生規(guī)則的集合翻譯成實(shí)現(xiàn)針對(duì)所 指定的語(yǔ)法的解析器的命令性代碼。在指定語(yǔ)法來(lái)識(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)的 問(wèn)題。在某些情形下,由聲明性編程提供的有益結(jié)果已推動(dòng)了各種在單個(gè)通用編程語(yǔ)言 中提供兩種范例的主要優(yōu)點(diǎn)的嘗試。迄今為止的方法主要側(cè)重于將命令性編程結(jié)構(gòu)映射到聲明性模型(例如在Kaleidoscope’ 90中的運(yùn)行時(shí)約束解算器)。另一示例是C++的 Turtle庫(kù),其中Turtle語(yǔ)言的約束模型被結(jié)合到C++中。然而,這些方法看來(lái)不能解決純 聲明性編程模型的固有低效率的問(wèn)題。因此,提供對(duì)命令性和聲明性結(jié)構(gòu)兩者進(jìn)行更為高效和系統(tǒng)的使用的通用編程將 是本領(lǐng)域的進(jìn)步。概述 根據(jù)本發(fā)明的各實(shí)施例,聲明性編程的所選方面被納入到另外的命令性框架中。 具體地,提供對(duì)約束的聲明性指定。本發(fā)明的各實(shí)施例的其它重要方面包括在程序單元不 需要事先知道其數(shù)據(jù)成員中的哪一些服從約束的情形下在翻譯時(shí)對(duì)約束的自動(dòng)求解以及 對(duì)程序單元的單獨(dú)翻譯。在實(shí)踐感興趣的許多情形下,以聲明性方式指定的約束可在編譯 時(shí)由編譯器來(lái)求解以提供包括用于強(qiáng)制實(shí)施約束的自動(dòng)提供的命令性代碼的命令性程序 表示。如此,命令性編程所特有的效率不會(huì)因?yàn)樘砑恿藢?duì)約束的聲明性指定而受到明顯危 及。貫穿本申請(qǐng),“翻譯”包括“編譯”和“解釋”,并且對(duì)“編譯”等的引用可與對(duì)“解釋”等 的引用互換,除非另外專門有說(shuō)明。參照附圖開始對(duì)本發(fā)明的各實(shí)施例的一些基本的概述是有益的。
圖1示出已知編 程結(jié)構(gòu)的偽代碼示例。在該例中,程序單元102包括準(zhǔn)聲明性語(yǔ)句“do A if X changes(如 果X改變則進(jìn)行A) ”。作為該語(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ā)器)。從概念上說(shuō),圖1結(jié)構(gòu)的實(shí)現(xiàn)是相對(duì)直接的。具體地,當(dāng)聲明性語(yǔ)句如圖所示地處 于與正被改變的輸入相同的程序單元和相同的上下文中時(shí),則執(zhí)行A的代碼可由編譯器在 更改X的每一行之后立即自動(dòng)插入。然而,存在對(duì)這種結(jié)構(gòu)麻煩的概念方面。具體地,該例 中的A可以是任意命令性代碼,這能造成狀態(tài)的任意改變(即任意的副作用)。因此,這些 結(jié)構(gòu)具有復(fù)雜化軟件開發(fā)的可能性。獲得相同公認(rèn)的另一方法是觀察到“do Α”本質(zhì)上是 命令性的,因此語(yǔ)句“do A if X changes”不是純聲明性的。由本發(fā)明的各實(shí)施例提供的主要能力在兩個(gè)顯著方面與圖1的示例存在區(qū)別。第 一方面是專門針對(duì)作為聲明性語(yǔ)句的約束的情形。由于約束是純聲明性結(jié)構(gòu),這消除了前 述概念上的困難。第二方面是顯著增強(qiáng)了自動(dòng)命令性代碼生成能力以適應(yīng)約束處于與其對(duì) 應(yīng)的數(shù)據(jù)成員不同的上下文和/或不同的程序單元中的情形。圖2示出相對(duì)于圖1的這兩種改變的示例。在圖2的示例中,第一程序單元202包 括約束的聲明性指定(即“enforce Y = f (X)(強(qiáng)制實(shí)施Y = f (X)) ”行)以及在約束范圍 之內(nèi)和約束范圍之外對(duì)X的改變的實(shí)例。第二程序單元204也包括對(duì)X的改變的實(shí)例。本 發(fā)明的各實(shí)施例對(duì)于對(duì)X的改變的所有實(shí)例自動(dòng)提供如圖所示的“update Y (更新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),由此減輕程序員的那個(gè)負(fù)擔(dān)。
圖3a_5的示例示出應(yīng)用于一具體示例的前述過(guò)程的步驟。更具體地,根據(jù)本發(fā)明 的一個(gè)實(shí)施例的用于將包括約束的輸入代碼自動(dòng)翻譯成計(jì)算機(jī)可執(zhí)行輸出程序表示的方 法示出于圖3a_5b的示例中。該方法的第一步驟是提供以也提供對(duì)約束的聲明性指定的命令性編程語(yǔ)言表達(dá) 的輸入源程序,其中輸入源程序包括根據(jù)所述編程語(yǔ)言指定的一個(gè)或多個(gè)約束。在該例中, 圖3a_b示出 輸入源程序的兩個(gè)代碼段,其中圖3a的代碼段可處于與圖3b的代碼段不同的 上下文中,并且還可處于單獨(dú)編譯的程序單元中。附圖和下面的示例中采用C++式偽代碼, 但本發(fā)明的實(shí)踐不依賴于語(yǔ)言句法的細(xì)節(jié)。圖3a的代碼段包括類F的定義,F(xiàn)的實(shí)例Fl和 F2的聲明以及對(duì)Fl. X的賦值。圖3b的代碼段包括約束集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 fixed if Fl.X changes)。約束是約束 數(shù)據(jù)成員(例如tot、tot2、Fl、F2)的關(guān)系。約束集CS還提供對(duì)哪些約束數(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ì)象以在實(shí)例化時(shí)注冊(cè)輸入改變通知。約束反應(yīng)器對(duì)象包括用于強(qiáng)制實(shí)施約束的 命令式過(guò)程,并且在相應(yīng)約束表示的范圍內(nèi)是可訪問(wèn)的。在這里和本申請(qǐng)全文中,“包含代 碼”意指文字內(nèi)聯(lián)代碼包括和/或(例如使用指針)直接提供對(duì)范圍外代碼的范圍內(nèi)訪問(wèn)。 對(duì)于該例的約束表示示出于圖4b中,其中如前所述虛線圍住自動(dòng)提供的代碼。在該例中,類CS的實(shí)例cs是約束表示,而FRl和FR2分別為約束反應(yīng)器對(duì)象 FlReactor和F2Reactor的實(shí)例。FlReactor包括用于在Fl改變時(shí)強(qiáng)制實(shí)施約束的代碼 (即,真正的更新過(guò)程)。更具體地,如果Fl. X改變,則FlReactor中的onXO過(guò)程根據(jù)約 束命令性地更新tot、tot2和F2.X。如果Fl. Y改變,則FlReactor中的onY()過(guò)程命令 性地更新tot。同樣,F(xiàn)2Reactor包括用于在F2改變時(shí)強(qiáng)制實(shí)施約束的代碼。在該例中, FlReactor和F2Reactor被包含在類CS中,該類CS被實(shí)例化為cs。該實(shí)例化為FRl和FR2 提供對(duì)輸入Fl和F2的指針訪問(wèn)。如本例所示那樣將約束分組成若干約束集是優(yōu)選但非必 須的。在這些情形下,對(duì)約束集的每個(gè)輸入通常存在一個(gè)反應(yīng)器,每個(gè)反應(yīng)器可包括從多個(gè) 約束派生的命令性語(yǔ)句,并存在與每個(gè)輸入約束集(例如圖3b上的約束集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)是可訪問(wèn)的。在該例中,圖4a示出該自動(dòng)提供 的通知代碼的一部分。將子類Notifiee (被通知者)插入類F內(nèi),其中Notifiee包括用 于對(duì)其輸入的改變的虛更新過(guò)程(即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ù)成員提供通知能力,即使沒(méi)有相關(guān)約束(例如Fl. Ζ、F2. Z沒(méi)有約束)。這較為有利地避免了特定類中的哪些數(shù)據(jù)成員被涉及在約束中的 任何先驗(yàn)知識(shí)的要求。在一些情形下,可能需要有選擇地對(duì)一些數(shù)據(jù)成員禁用通知。如果 對(duì)作為約束輸入的數(shù)據(jù)成員禁用通知,則生成翻譯錯(cuò)誤。 本方法的第四步驟在命令性輸出程序表示中實(shí)例化通知代碼和約束表示,以使對(duì) 約束輸入的改變自動(dòng)導(dǎo)致命令性約束驅(qū)動(dòng)的更新,并將該命令性輸出程序表示作為輸出提 供。例如,該命令性輸出程序表示可通過(guò)編譯被進(jìn)一步處理成低級(jí)機(jī)器語(yǔ)言。在圖4a_b中,一個(gè)重要的細(xì)節(jié)是FlReactor和F2Reactor類型是從F: Notifiee 類型派生的。如此,調(diào)用虛更新過(guò)程(例如Fl: =Notifiee中的virtual onX())通過(guò)類型 繼承自動(dòng)導(dǎo)致調(diào)用正確的反應(yīng)器(FRl::0n(X))中的正確的約束更新過(guò)程。該例的代碼的 操作示出于圖5a_b的代碼段中。在圖5a中,向?qū)①x值提供給Fl. X的程序員自動(dòng)補(bǔ)充虛線 中所示的過(guò)程調(diào)用集。同樣,在圖5b中,對(duì)F2. Y的賦值同樣被自動(dòng)補(bǔ)充虛線中所示的過(guò)程 調(diào)用集。更具體地,改變圖5a中的Fl. X造成對(duì)反應(yīng)器實(shí)例FRl的onX過(guò)程作出調(diào)用。該 FRl. onX()過(guò)程根據(jù)約束更新tot、tot2和F2. X(通過(guò)執(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() 過(guò)程作出調(diào)用。該FR2.onX()過(guò)程通過(guò)執(zhí)行賦值?1] = 2]樸2.¥來(lái)更新?1]。然而, 該賦值不實(shí)際改變本例中Fl. X的值。因此,由于對(duì)FR2.onX()的調(diào)用不實(shí)際改變Fl. X,因 此約束更新處理在該調(diào)用之后終止。為了更清楚地理解,假定在對(duì)F1.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. οηΧ()的調(diào)用設(shè)定 Fl. X = F2. X*F2. Y = a,a是FA. X在計(jì)算中的該點(diǎn)處已經(jīng)有的值。由于Fl沒(méi)有改變,因此不需要 另外的通知和反應(yīng)。圖5b中的賦值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的 onY ()過(guò)程,這將Fl改變至to (w*b, ν)并將F2 “改變”至(w、b),假設(shè)對(duì)Fl的改變是在改 變F2之前作出的。由于F2沒(méi)有真正改變,因此FRl.onX()是由于F2的改變而調(diào)用的唯一 反應(yīng)器。該反應(yīng)器將F2 “改變”至(w,b),這不是對(duì)F2的值的改變。約束更新由此終止。在圖5b的示例中,如果FR2. onY()在更新Fl前更新F2,則獲得不同的最終狀態(tài)。 在這種假設(shè)下,F(xiàn)R2.onY()的作用是將F2設(shè)定為(u/b, b)并將Fl “改變”至(u,ν)。由于 Fl沒(méi)有真正改變,因此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 =O可被表達(dá)為下面的單輸入約束集C =-a-b (a是輸入);a = -b-c(b是輸入);以及b=-c-a(c是輸入)。這種多輸入約束至單輸入約束的簡(jiǎn)化可由程序員提供,或者在足夠簡(jiǎn)單的情形下可自動(dòng)生成。注意圖3a_5b中的示例包括按照單輸入約束表達(dá)的多輸入約束的實(shí)例。更具體 地,多輸入約束 Fl. X = F2. X*F2. Y 被實(shí)現(xiàn)為 F2. X = Fl. X/F2. Y(F1 是輸入),F2. X = Fl. X/ F2.Y(F2是輸入),以及Fl. X = F2. X*F2. Y(F2是輸入)。這種按照單輸入約束的特定表示 是由如果輸入Fl. X改變則保持F2. Y固定的指示結(jié)合常見(jiàn)的lhs/rhs慣例(例如,左手側(cè) (Ihs)上的變量通常因賦值而改變,而右手側(cè)(rhs)上的變量一般不因賦值而改變)來(lái)驅(qū)動(dòng) 的。與約束復(fù)雜度相關(guān)的其它考量在詳細(xì)說(shuō)明中提供。前面的說(shuō)明提供對(duì)本發(fā)明的典型實(shí)施例的主要性能特征和基本實(shí)現(xiàn)特征的介紹。 為了更好地理解本發(fā)明各實(shí)施例的一些變例和改進(jìn),在下面的概述的其余部分中對(duì)其作簡(jiǎn) 單描述。在一些實(shí)施例中,在數(shù)據(jù)成員中自動(dòng)提供通知代碼包括提供兩個(gè)或更多個(gè)改變通 知過(guò)程,并提供根據(jù)對(duì)程序數(shù)據(jù)成員的改變的性質(zhì)對(duì)要調(diào)用這些改變通知過(guò)程中的哪一些 的選擇。例如,假設(shè)程序數(shù)據(jù)成員V是數(shù)字?jǐn)?shù)組,并且通過(guò)約束,總計(jì)等于V的各個(gè)元素之 和。在一些情形下,對(duì)V的改變是涉及其一些或全部元素的一般改變,并且在這樣的情形 下,總計(jì)的完全重計(jì)算在更新期間是無(wú)法避免的。然而,在其它情況下,對(duì)V的改變已知為 單元素改變(例如V[3]從4變?yōu)?)。在這種情形下,總計(jì)可更高效地更新(即,將總計(jì)遞 增2),引起其前一值可被假設(shè)為因先驗(yàn)約束驅(qū)動(dòng)更新而是正確的。這種性質(zhì)的情況可提供 給多個(gè)改變通知過(guò)程(例如,分別用于一般元素和單元素更新的onVO和onV[i] O)。在這 些通知過(guò)程之間進(jìn)行選擇是由對(duì)數(shù)據(jù)成員的改變的性質(zhì)和改變的情形來(lái)驅(qū)動(dòng)的。存在輸入源程序包括能更高效地實(shí)現(xiàn)一些更新的約束的情形。更具體地,如果輸 入源程序包括對(duì)與其一些或全部輸入處于同一范圍的約束的聲明性指定,則可通過(guò)將范圍 內(nèi)命令性代碼自動(dòng)插入到命令性輸出程序表示中來(lái)在其范圍內(nèi)強(qiáng)制實(shí)施該約束。這些約束 響應(yīng)于對(duì)范圍外輸入的改變的強(qiáng)制實(shí)施可如上所述地處理。在實(shí)踐中,有利的是提供對(duì)用以執(zhí)行每個(gè)約束反應(yīng)器對(duì)象的程序控制的線程的選 擇。今日的編程環(huán)境通常提供這種線程選擇。通知和反應(yīng)機(jī)制也能很好地與其它編程方法相組合。例如,結(jié)合如上所述的通知, 對(duì)數(shù)據(jù)結(jié)構(gòu)的密封以使改變只能通過(guò)增變器過(guò)程來(lái)作出是有益的,這是因?yàn)樵鲎兤鬟^(guò)程可 對(duì)要求約束驅(qū)動(dòng)的更新的狀態(tài)作出改變。約束的概念可擴(kuò)展至表示專用約束,該表示專用約束涉及具有不同表示的數(shù)據(jù)成 員。這里,表示指的是如何物理地表示數(shù)據(jù)成員。常見(jiàn)表示包括普通的存儲(chǔ)器內(nèi)、串、未類 型化和網(wǎng)絡(luò)表示??刹捎眠m配器來(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í)施例的約束處理能力可通過(guò)提供處理在翻譯期間未求解(即,翻譯 成命令性代碼)的約束集的運(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í)施 例除約束外還包括過(guò)程觸發(fā)器(PT)。在這些情形下,PT根據(jù)其編程語(yǔ)言在輸入源程序中指定,并且對(duì)于每個(gè)PT,表示 其觸發(fā)輸入。每個(gè)PT包括當(dāng)相應(yīng)的觸發(fā)輸入改變時(shí)要調(diào)用一個(gè)或多個(gè)觸發(fā)器過(guò)程。 每個(gè)PT的觸發(fā)器表示是自動(dòng)提供的,其中觸發(fā)器表示包括觸發(fā)反應(yīng)器對(duì)象以在 實(shí)例化時(shí)注冊(cè)輸入改變通知,觸發(fā)反應(yīng)器對(duì)象包括相應(yīng)的觸發(fā)器過(guò)程。通知代碼還調(diào)節(jié)觸 發(fā)器表示對(duì)輸入改變通知的注冊(cè)。觸發(fā)器表示在命令性輸出程序表示中被實(shí)例化,以使對(duì) 觸發(fā)輸入的改變自動(dòng)導(dǎo)致所述觸發(fā)器過(guò)程的執(zhí)行。如前所述,觸發(fā)器優(yōu)選地為冪等的。這 些觸發(fā)器表示和觸發(fā)反應(yīng)器對(duì)象分別類似于前述的約束表示和約束反應(yīng)器對(duì)象?;谕ㄖ募s束集翻譯提供若干重要益處1.編程語(yǔ)言中的關(guān)系和不變式的簡(jiǎn)潔表達(dá),如由傳統(tǒng)約束編程提供的,但有了謹(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)而不是 收斂。然而,存在許多方式使命令性程序能夠以沒(méi)有約束的無(wú)限循環(huán)告終,因此該約束機(jī)制 不改變命令性編程的這個(gè)基本特征。主要目的是通過(guò)支持約束來(lái)提供命令性程序的更簡(jiǎn)潔 表達(dá),但不更改或?qū)姑钚猿绦虻幕緦傩?。此外,可獲得命令性語(yǔ)言的完整能力以應(yīng)付 該約束實(shí)現(xiàn)不合用的情形。最后,在包括約束求解器實(shí)現(xiàn)的實(shí)施例中,求解器可在其行為優(yōu) 良的情形下調(diào)用。下面給出本發(fā)明的各實(shí)施例的這些和其它方面的進(jìn)一步描述。附圖簡(jiǎn)述圖1示出已知編程結(jié)構(gòu)的一個(gè)示例。圖2示出由本發(fā)明的一個(gè)實(shí)施例提供的功能的示例。圖3a_3b示出涉及本發(fā)明的一個(gè)實(shí)施例的示例的輸入代碼段。圖4a_4b示出與圖3a_3b的示例的輸入代碼段對(duì)應(yīng)的自動(dòng)生成的表示。圖5a_5b示出與圖3a_3b和圖4a_4b的示例的輸入代碼段對(duì)應(yīng)的命令性輸出程序 表不。詳細(xì)說(shuō)明
在本發(fā)明的一個(gè)實(shí)施例中,編程語(yǔ)言包括用于指定被稱為約束集的一組約束的一 個(gè)或多個(gè)結(jié)構(gòu)?!凹s束”表示需要在所有時(shí)間或在特定一個(gè)或多個(gè)時(shí)間保持的數(shù)據(jù)成員之間 的關(guān)系的聲明性指定。在前一種情形下,約束本質(zhì)上等同于不變式。后一種情形的一個(gè)例 子是僅在某一數(shù)據(jù)成員初始化時(shí)保持的關(guān)系。另一示例是引用另一對(duì)象中的數(shù)據(jù)成員的約 束;該約束僅在該另一對(duì)象已知時(shí)保持?!爸鲃?dòng)約束”表示其中當(dāng)涉及關(guān)系的狀態(tài)改變時(shí)采 取命令性動(dòng)作以建立和維持該關(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的某一范圍的成員,例如類型、名稱空間或過(guò)程。該術(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ù)成員的約束集(constraintSet)結(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ù) 成員的聲明。有了約束集,可定義由該集合中的各個(gè)約束引用的對(duì)象的局部名。在一個(gè) 實(shí)施例中,在約束集中的局部數(shù)據(jù)成員的聲明中的類型指示之前使用“ input (輸入)”關(guān) 鍵字限定詞,指示僅用作對(duì)該集合中的各約束的輸入(只讀)的數(shù)據(jù)成員,如果局部變量 僅寫入約束集中則使用“output (輸出)”,且如果該集合中的各約束可能使該對(duì)象既能讀 出又能寫入,則使用“inputOutput(輸入輸出)”。例如,在示例1中,一個(gè)簡(jiǎn)單的約束集 "ReportMaintenance ( 艮表維護(hù)),,
權(quán)利要求
1.一種將包含約束的輸入代碼自動(dòng)翻譯成計(jì)算機(jī)可執(zhí)行命令性輸出程序表示的方法, 所述方法包括提供輸入源程序,其中所述輸入源程序以另外提供對(duì)約束的聲明性指定的編程語(yǔ)言來(lái) 表達(dá),并且所述輸入源程序包括根據(jù)所述編程語(yǔ)言指定的一個(gè)或多個(gè)約束; 其中所述一個(gè)或多個(gè)約束中的每一個(gè)指定約束數(shù)據(jù)成員的關(guān)系; 提供所述約束數(shù)據(jù)成員中的哪一些是約束輸入的標(biāo)識(shí); 為所述約束自動(dòng)提供約束表示;其中每個(gè)所述約束表示包括在實(shí)例化時(shí)注冊(cè)輸入改變通知的一個(gè)或多個(gè)相應(yīng)的約束 反應(yīng)器對(duì)象,所述約束反應(yīng)器對(duì)象具有用于強(qiáng)制實(shí)施所述約束的命令性過(guò)程,并且所述相 應(yīng)的約束反應(yīng)器對(duì)象在所述相應(yīng)的約束表示的范圍內(nèi)是可訪問(wèn)的;對(duì)所述輸入源程序的一些或全部程序數(shù)據(jù)成員的每一個(gè),自動(dòng)地提供相應(yīng)的通知代 碼,以提供改變通知并調(diào)整約束表示對(duì)輸入改變通知的注冊(cè),并且其中所述相應(yīng)的通知代 碼在所述相應(yīng)程序數(shù)據(jù)成員的范圍內(nèi)是可訪問(wèn)的;在所述命令性輸出程序表示中實(shí)例化所述約束表示,籍此對(duì)約束輸入的改變自動(dòng)導(dǎo)致 命令性約束驅(qū)動(dòng)的更新;以及將所述命令性輸出程序表示作為輸出來(lái)提供。
2.如權(quán)利要求1所述的方法,其特征在于所述輸入源代碼程序中的所述約束被組織成約束集,每個(gè)約束集包括一個(gè)或多個(gè)約束;其中每個(gè)所述約束集還包括對(duì)所包含的約束中的哪些約束數(shù)據(jù)成員是約束輸入的顯 式和/或隱式標(biāo)識(shí);以及其中所述相應(yīng)的約束表示包括與每個(gè)所述約束集對(duì)應(yīng)的約束集對(duì)象表示。
3.如權(quán)利要求1所述的方法,其特征在于,所述提供相應(yīng)的通知代碼以提供改變通知 包括對(duì)每個(gè)所述程序數(shù)據(jù)成員自動(dòng)定義虛更新過(guò)程,其中所述虛更新過(guò)程在相應(yīng)的程序數(shù) 據(jù)成員改變的情形下被調(diào)用。
4.如權(quán)利要求3所述的方法,其特征在于,所述提供相應(yīng)的約束表示包括對(duì)每個(gè)所述 約束的輸入的改變自動(dòng)定義真實(shí)更新過(guò)程。
5.如權(quán)利要求4所述的方法,其特征在于,所述自動(dòng)實(shí)例化所述通知代碼和所述約束 表示包括通過(guò)類型繼承將所述虛更新過(guò)程的調(diào)用映射至所述真實(shí)更新過(guò)程的相應(yīng)調(diào)用。
6.如權(quán)利要求1所述的方法,其特征在于,所述自動(dòng)實(shí)例化所述通知代碼和所述約束 表示包括對(duì)同樣作為一個(gè)或多個(gè)約束表示實(shí)例的輸入的每個(gè)程序數(shù)據(jù)成員,構(gòu)造所述一個(gè)或多 個(gè)約束表示實(shí)例的約束反應(yīng)器對(duì)象實(shí)例的被通知者列表,其中所述每個(gè)被通知者列表在與 所述每個(gè)程序數(shù)據(jù)成員相同的范圍內(nèi)是可訪問(wèn)的。
7.如權(quán)利要求1所述的方法,其特征在于,所述約束中的至少一個(gè)是具有兩個(gè)或更多 個(gè)輸入約束數(shù)據(jù)成員的多輸入約束,并所述方法進(jìn)一步包括將所述多輸入約束表達(dá)為一組 單輸入約束,每個(gè)單輸入約束具有正好一個(gè)輸入約束數(shù)據(jù)成員。
8.如權(quán)利要求1所述的方法,其特征在于,對(duì)于所述程序數(shù)據(jù)成員中的一個(gè)或多個(gè),所 述自動(dòng)提供相應(yīng)的通知代碼包括為所述相應(yīng)的程序數(shù)據(jù)成員提供兩個(gè)或更多個(gè)改變通知過(guò)程,并提供取決于對(duì)所述相應(yīng)的程序數(shù)據(jù)成員的改變的性質(zhì)和/或環(huán)境對(duì)要調(diào)用所述兩 個(gè)或更多個(gè)改變通知過(guò)程中的哪一個(gè)的選擇。
9.如權(quán)利要求1所述的方法,其特征在于,所述約束中的一個(gè)或多個(gè)在與一個(gè)或多個(gè) 其相應(yīng)的輸入相同的范圍內(nèi)指定,并所述方法進(jìn)一步包括將范圍內(nèi)命令性代碼插入到所述 命令性輸出程序表示中以強(qiáng)制實(shí)施所述一個(gè)或多個(gè)所述約束。
10.如權(quán)利要求1所述的方法,其特征在于,所述約束表示中的至少一個(gè)提供對(duì)用于執(zhí) 行其每一個(gè)相應(yīng)的約束反應(yīng)器對(duì)象的程序控制線程的選擇。
11.如權(quán)利要求1所述的方法,其特征在于,所述自動(dòng)提供相應(yīng)的通知代碼包括將所述 程序數(shù)據(jù)成員的修改代碼自動(dòng)封裝在包含通知代碼的相應(yīng)的增變器過(guò)程中。
12.如權(quán)利要求1所述的方法,其特征在于,所述約束中的至少一個(gè)是與具有不同表示 的約束數(shù)據(jù)成員有關(guān)的表示專用約束。
13.如權(quán)利要求1所述的方法,其特征在于,所述約束中的一個(gè)或多個(gè)與復(fù)雜事件處理 有關(guān)。
14.如權(quán)利要求1所述的方法,其特征在于,還包括提供運(yùn)行時(shí)約束引擎以處理在翻譯 期間中未被求解的約束集。
15.如權(quán)利要求1所述的方法,其特征在于,所述約束以聲明性術(shù)語(yǔ)指定目標(biāo)編程語(yǔ)言 的語(yǔ)法。
16.如權(quán)利要求1所述的方法,其特征在于,所述約束中的至少一個(gè)位于第一程序單元 中,而其對(duì)應(yīng)的約束輸入中的至少一個(gè)能在第二程序單元中改變,并且所述第一和第二程 序單元是單獨(dú)翻譯的。
17.如權(quán)利要求16所述的方法,其特征在于,所述第二程序單元可被單獨(dú)翻譯而無(wú)需 知道其程序數(shù)據(jù)成員中的哪一些是約束輸入。
18.如權(quán)利要求1所述的方法,其特征在于,所述編程語(yǔ)言提供了對(duì)過(guò)程觸發(fā)器的指 定,并且所述方法進(jìn)一步包括提供根據(jù)所述輸入源程序中的所述編程語(yǔ)言指定的一個(gè)或多個(gè)過(guò)程觸發(fā)器;對(duì)每個(gè)所述過(guò)程觸發(fā)器,提供所述程序數(shù)據(jù)成員中的哪一些是所述過(guò)程觸發(fā)器的觸發(fā) 輸入的標(biāo)識(shí);其中所述一個(gè)或多個(gè)過(guò)程觸發(fā)器中的每一個(gè)包括當(dāng)相應(yīng)的觸發(fā)輸入改變時(shí)擬調(diào)用的 一個(gè)或多個(gè)觸發(fā)器過(guò)程;對(duì)于每一所述過(guò)程觸發(fā)器,自動(dòng)提供相應(yīng)的觸發(fā)器表示;其中每個(gè)所述觸發(fā)器表示包括在實(shí)例化時(shí)注冊(cè)輸入改變通知的一個(gè)或多個(gè)相應(yīng)的觸 發(fā)反應(yīng)器對(duì)象,所述觸發(fā)反應(yīng)器對(duì)象包括所述一個(gè)或多個(gè)觸發(fā)器過(guò)程,并且所述相應(yīng)的觸 發(fā)反應(yīng)器對(duì)象在所述相應(yīng)的觸發(fā)器表示的范圍內(nèi)是可訪問(wèn)的;其中所述通知代碼還調(diào)節(jié)觸發(fā)器表示對(duì)輸入改變通知的注冊(cè)登記;在所述命令性輸出 程序表示中實(shí)例化所述觸發(fā)器表示,籍此對(duì)觸發(fā)輸入的改變自動(dòng)導(dǎo)致所述觸發(fā)器過(guò)程的執(zhí) 行。
全文摘要
提供一種方法,該方法基于對(duì)每個(gè)約束集的可實(shí)例化對(duì)象的定義將約束集聲明翻譯成命令性代碼序列,在狀態(tài)修改時(shí)插入對(duì)通知回調(diào)機(jī)制的調(diào)用,并將約束上下文中的調(diào)用定義為命令性代碼序列,該命令性代碼序列響應(yīng)于這些回調(diào)采取動(dòng)作以維持這些約束。
文檔編號(hào)G06F9/45GK102037447SQ200980118918
公開日2011年4月27日 申請(qǐng)日期2009年5月18日 優(yōu)先權(quán)日2008年5月21日
發(fā)明者D·R·謝里登 申請(qǐng)人:奧普塔姆軟件股份有限公司