專利名稱:反應(yīng)性表達式生成和優(yōu)化的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及反應(yīng)性表達式生成和優(yōu)化。
背景技術(shù):
通常利用一個或多個表達式(例如,作為語句的組成部分)來詳細說明計算機程序。表達式是根據(jù)具體編程語言的優(yōu)先級規(guī)則解釋的值、常數(shù)、變量、運算符和函數(shù)的組合。 表達式可被計算,或者換句話說是評估,其結(jié)果是某一類型的值(例如,整數(shù)、串、布爾、…)。 例如,算術(shù)和編程表達式可以是“1+2”,它可等于“3”。類似地,表達式可對應(yīng)于“x+2”,其中“X”是指向存儲器中的值的指針。此外,“5>4”是評估為真的關(guān)系或布爾表達式的示例。 經(jīng)評估的表達式可具有副效應(yīng),意思是除返回一值之外,還有次要的、通常不希望的效應(yīng), 諸如某些狀態(tài)的變化。發(fā)明內(nèi)容
下面呈現(xiàn)了簡化的發(fā)明內(nèi)容,以便提供對所公開主題的某些方面的基本概念。本發(fā)明內(nèi)容不是廣泛性的概觀。它并不旨在標識關(guān)鍵/重要元素,也不旨在劃定所要求保護主題的范圍。其唯一目的是以簡化形式呈現(xiàn)一些概念,作為稍后呈現(xiàn)的更具體實施例的序言。
簡言之,本發(fā)明涉及促進反應(yīng)性編程。根據(jù)本發(fā)明的一個方面,可基于非反應(yīng)性或標準表達式自動生成反應(yīng)性表達式。根據(jù)另一個方面,反應(yīng)性表達式不管是否從非反應(yīng)性表達式生成,均可通過應(yīng)用很多優(yōu)化技術(shù)中的一種或多種來優(yōu)化,例如為了避免重復(fù)副效應(yīng)并消除過多的重新評估,并提高整體性能。
為實現(xiàn)上述及相關(guān)目的,在此結(jié)合以下描述和附圖描述了所要求保護主題的某些說明性方面。這些方面指示可實踐本主題的各種方式,它們均落在所要求保護主題的范圍之內(nèi)。當結(jié)合附圖閱讀以下詳細描述時,本發(fā)明的其他優(yōu)點和新穎特征將變得顯而易見。
圖
圖
圖
圖
圖
圖
圖
圖
圖
圖具體實施方式
以下詳細描述一般涉及促進反應(yīng)性編程,更具體地是反應(yīng)性表達式生成和優(yōu)化。 構(gòu)建傳播輸入更新的反應(yīng)性程序(也稱為反應(yīng)性編程)需要相當多的管道代碼(Plumbing code)或換言之,后臺的低級代碼。通常在限定反應(yīng)性表達式的過程中,編程人員的意圖丟失。為了解決該問題,提供一種用于從非反應(yīng)性表達式生成反應(yīng)性表達式的機制。換言之, 可將標準表達式提升為反應(yīng)性表達式。因此,編程人員可指定標準表達式(例如,函數(shù)),該標準表達式隨后可用于自動產(chǎn)生反應(yīng)性表達式。此外,可按很多不同方式優(yōu)化反應(yīng)性表達式,以使與輸入變化后傳播更新相關(guān)聯(lián)的計算工作最小化等等。作為示例而非限制,可生成避免重復(fù)副效應(yīng)、消除過多的重新評估并提高整體性能(例如,執(zhí)行更快、更高效…)的反應(yīng)性表達。
現(xiàn)在參考附圖更詳細地描述本發(fā)明的各個方面,在全部附圖中用相同的標號來指示相同的或相應(yīng)的元素。然而應(yīng)該理解,附圖及其相關(guān)詳細描述不旨在將所要求保護的主題限于所公開的具體形式。相反,其意圖是覆蓋落在所要求保護主題的精神和范圍之內(nèi)的所有修改、等價物和替換的方案。
首先參考圖1,示出了反應(yīng)性編程系統(tǒng)100。該系統(tǒng)100包括生成組件110,其配置成基于非反應(yīng)性表達式(換言之是標準表達式)生成反應(yīng)性表達式。諸如函數(shù)之類的非反應(yīng)性表達式僅響應(yīng)于評估而改變。相反,反應(yīng)性表達式響應(yīng)于輸入的變化而改變。作為示例,考慮表達式“a=b+c”,這意味著“a”被賦予“a”和“b”之和的結(jié)果。如果這是標準或非反應(yīng)性表達式,則當“a”被賦予“b+c”的結(jié)果時,該表達式立即被評估。之后,如果“b”或 “c”改變,則該改變對值“a”沒有影響。如果表達式是反應(yīng)性表達式,則“a”的值將會基于 “b”和“c”中的任一個或兩者的新值而自動更新。常規(guī)上,指定反應(yīng)性表達式需要相當多的后臺、低級、樣板代碼。結(jié)果,編程人員的意圖在限定反應(yīng)性功能的過程中丟失。生成組件 110使編程人員能僅指定標準、非反應(yīng)性表達式,隨后使等價的反應(yīng)性表達式或其反應(yīng)性版本自動生成。此外,生成組件110可應(yīng)用于傳統(tǒng)程序,更具體地是其中的表達式,以產(chǎn)生反應(yīng)性版本。
通過生成組件110生成反應(yīng)性表達式可按多種不同方式進行,全部都在所附權(quán)利要求的范圍內(nèi)。在一個實例中,可將程序代碼添加到非反應(yīng)性表達式以生成反應(yīng)性表達式。 作為附加或替換,非反應(yīng)性表達式可從非反應(yīng)性表達式轉(zhuǎn)換或另外變換或轉(zhuǎn)變?yōu)榉磻?yīng)性表達式。另外,可根據(jù)非反應(yīng)性表達式產(chǎn)生新的反應(yīng)性表達式。
從非反應(yīng)性表達式生成反應(yīng)性表達式可體現(xiàn)在根據(jù)一個方面的“提升(Lift)”函數(shù)中。因此,反應(yīng)性表達式的生成可被稱為非反應(yīng)性表達式至反應(yīng)性表達式的提升,或者在本文中僅稱為提升或其各種形式。作為示例,可構(gòu)建具有以下預(yù)訂的一組運算符
Lift: : (T1X…X Tn — R) — (I(KT)X…X Ι0〈Τη> — I0〈R>)
換言之,運算符可采用關(guān)于“Τ/’至“Tn”類型的自變量且具有返回類型“R”的諸如函數(shù)之類的標準表達式(其中“η”是大于或等于O的整數(shù))。結(jié)果,運算符產(chǎn)生經(jīng)提升的表達式,其接受自變量的變體“ Ι0〈Τ>”并返回結(jié)果類型的變體“ I0〈R > ”,其中“ Ι0〈Τ>”和 “ I0〈R>”指代“ IObservableCD”和“I0bservable〈R>,,,即表示根據(jù)觀測者設(shè)計模式向觀測者發(fā)送“T”或“R”類型的基于推送的通知的類的接口(例如,提供者)。
實現(xiàn)期望的提升行為的一種可能的方法是利用“CombineLatest”運算符(例如,只要兩個可觀測序列之一具有新值就將這些可觀測序列合并成一個序列)并提供函數(shù)作為自變量來從輸入序列構(gòu)造可觀測序列(例如基于推送的數(shù)據(jù)源)。例如
Fimc<IObservable<Tl>, I0bservable<T2>, IObservabIe<R>> Lift<Tl, T2, R>(Func<Tl, 2, R> f){return (ol, o2) => o I .CombineLatest(o2, f);}
對于較大數(shù)量的函數(shù),或者換言之,自變量的數(shù)量大于2,可提供具有較大數(shù)量的 “CombineLatest”運算符,以使提升過程直接,如上所示。或者,可使用中間組合器函數(shù)。例 如
F unc<IObservable<T I >,10bservable<T2>,IObservable<T3>,iObservable<R>> Lift<Ti, T2, T3, R>(Func<Tl. Tl. T3, R> f){return (o I, o2, o3) => o I .CombineLatest(o2, (a, b)=> new { a: b ) ).CoinbineLatesi(o3; (ab, c) => f(ab.a; ab.b, c));}
以上分配很多中間對象,所以優(yōu)選較大數(shù)量的“CombineLatest”過載。也就是說, 對于任意數(shù)量的自變量的函數(shù),不管“CombineLatest”過載的數(shù)量如何,以上的技術(shù)都可能起作用(例如,利用表達式樹,為任意函數(shù)呈現(xiàn)提升器)。此外,取代將匿名類型用于中間投影,還可使用內(nèi)建元組類型。例如
F unc<10bservable<T I >,IObservable<T2>,IObservable<T3>,
IObservable<R>> Lift<Tl, T2, T3, R>(Func<Tl, T2, T3, R> f)return (ol,o2, o3) => oI .CombineLatest(o2, (a, b)=> new Tuple<TI, T2>(a, b)).CombineLatest(o3, (t. c) => f(t.Iteml, t.item2, c));}
使用反應(yīng)性類型表達式的一個示例是在電子數(shù)據(jù)表程序中。例如,電子數(shù)據(jù)表單元格可包括基于其它單元格的值評估的諸如“B1+C1”之類的字面值或公式。只要獨立單元格的值改變,得自公式的值就將被更新。然而,按照慣例,這些類型的反應(yīng)性表達式被緊密耦合到單元格的概念以及其內(nèi)部表示,如此不能在任意反應(yīng)性(例如,基于推送的)數(shù)據(jù)源上運算。如本文中所使用的,反應(yīng)性表達式指的是隨時間被連續(xù)評估的表達式,其中基于對表達式的子表達式或從屬物中的一個或多個的改變觸發(fā)重新評估,該表達式的子表達式或從屬物本身可以是反應(yīng)性表達式。此外,本文中所提及的反應(yīng)性表達式旨在比類似的電子數(shù)據(jù)表表達式更全面,且在任何反應(yīng)性/可觀測的數(shù)據(jù)源上操作。
為了便于清楚和理解,圖2示出利用所公開的方面的電子數(shù)據(jù)表模型的實現(xiàn)。示出總共具有6個單元格的簡單電子數(shù)據(jù)表210。單元格“Al”和“BI”包括字面值,即“42” 和“21”。單元格“A2”包括表達式212,其指示“A2=A1/B1”。單元格在214處被標識為標準整數(shù)。在執(zhí)行提升操作之后,相同的單元格被變換成可觀測量類型的整數(shù)。生成代碼222 以將非反應(yīng)性表達式212變換成反應(yīng)性表達式。
將注意力轉(zhuǎn)回圖I,反應(yīng)性編程系統(tǒng)100還可包括優(yōu)化組件120。相對于反應(yīng)性表達式,生成組件110本質(zhì)上可以是基本的。優(yōu)化組件120可實現(xiàn)用于反應(yīng)性表達式生成的更復(fù)雜的方法。更具體地,優(yōu)化組件120可配置成獲取反應(yīng)性表達式并生成經(jīng)優(yōu)化的反應(yīng)性表達式,或者換言之,是反應(yīng)性表達式的經(jīng)優(yōu)化版本。可利用各種優(yōu)化技術(shù),來使將更新傳播到一個或多個輸入并生成新輸出等等所需的計算工作量最小化??上鄬τ趯崿F(xiàn)反應(yīng)性行為的代碼增加、刪除或改變代碼??衫镁幾g器或其它系統(tǒng)在編譯時間或在運行時動態(tài)地執(zhí)行優(yōu)化。此外,可通過包括用戶指定的策略或其它數(shù)據(jù)在內(nèi)的各種輸入管理優(yōu)化。另外, 例如,給定過去的性能信息或當前上下文信息,可采用反饋環(huán)來連續(xù)優(yōu)化反應(yīng)性表達式。另外,應(yīng)意識到,可在從非反應(yīng)性表達式生成反應(yīng)性表達式的上下文之外,采用優(yōu)化組件120, 例如,在已經(jīng)存在反應(yīng)性表達式的情況下(例如,手動編碼、利用不同系統(tǒng)生成的…)。
圖3更詳細地描繪出代表性優(yōu)化組件120。優(yōu)化組件120包括副效應(yīng)組件310, 該副效應(yīng)組件310可被配置成至少避免重復(fù)(例如,兩個或更多)副效應(yīng)。表達式可具有不期望的重復(fù)副效應(yīng)。例如,如果表達式導(dǎo)致信用卡被收費,則期望不執(zhí)行多于所需次數(shù)(例如,一次)的動作。更具體地,如果對于多個自變量向一函數(shù)提供相同的可觀測源,則使用 “CombineLatest”運算符將導(dǎo)致多個預(yù)訂(subscription)。這進而導(dǎo)致重復(fù)副效應(yīng)。作為示例,如果表達式包括“A1+A1”,則這可導(dǎo)致對相同可觀測源的重復(fù)預(yù)訂,從而導(dǎo)致潛在的重復(fù)副效應(yīng)。通過檢測重復(fù)輸入序列并合并它們的預(yù)訂,可避免重復(fù)副效應(yīng)。當然,可采用其它方法,包括將至少避免重復(fù)副效應(yīng)的責任留給調(diào)用者或以可用策略標記配置的某一期望方式來執(zhí)行。
圖4更詳細地示出代表性副效應(yīng)組件310,包括源分析組件410、公布組件420和重寫器組件430。源分析組件410可配置成分析輸入可觀測序列并濾掉重復(fù),或換言之,根據(jù)對象身份檢查來標識唯一序列。例如,考慮標準表達式“a*b+c”。此處,例如在運行時,可確定“a”和“c”對應(yīng)于相同的輸入序列或源或者從相同的輸入序列或源導(dǎo)出。結(jié)果,可通過源分析組件410生成索引映射412或類似結(jié)構(gòu),指示“a”和“b”是唯一的且“a”和“c” 對應(yīng)于相同的輸入序列或源。
注意,源和分析組件410可配置成利用對象身份之外的其它機制,以濾掉重復(fù)或標識唯一序列或源。例如,如果一些輸入序列表示具有相同含義的表達式,則可利用高級比較器或等值(equality)函數(shù)來檢測這種情況。例如,考慮對于相同的“xs”源出現(xiàn)多次(例如,遞歸地)查詢表達式“from X in xs wherex%2==0 select x”。更一般地,源分析組件 410可配置成更智能地從根(例如,詢問源)向下執(zhí)行跟蹤子查詢表達式。例如,考慮兩個查6詢表達式 “fromx in xs where x%2==0select x” 和 “from x in xs where x%2==0select x+1”。除投影部分“選擇x”和“選擇x+1”之外它們是相同的表達式。因此,可重復(fù)使用其余部分“from X in xs where x%2==0”。一般而言,源分析組件410可配置成描繪出可共享計算。換言之,源分析組件410可配置成檢測共用子表達式。
公布組件420可配置成通過采用“Publish”運算符為源分析組件410確定用于多次使用的唯一源生成別名,例如
IObservable<R>Publish<T, R > (IObservable<T>source, Func<IObservabIe<T> ,IObservabIe<R>>f);
因為可出現(xiàn)多個不同源,所以可引入具有較大數(shù)量的“Publish”運算符以同時簡化很多源的公布(例如,將Tl、T2…Tn用于一般源參數(shù)和函數(shù)參數(shù)。)不管表達式利用多少源,結(jié)果可以是建立對這些源的單次預(yù)訂。
源分析組件410和公布組件420可關(guān)于共享源以及如何使用共享源交換信息。例如,可利用其參數(shù)位置對源加標簽。該索引與反應(yīng)性表達式中的參數(shù)位置相匹配。例如 “Lift ((a,b, c,)=>a*b+c) (xs, ys, xs) ”得到兩個不同的源“xs” 和“ys”。第一源“xs” 可具有索弓I “O”和“2”,而第二源“ys”可具有索引“I”??晒嘉ㄒ辉矗玫焦己瘮?shù)(例如,公布代碼422)中的別名,其中它們可如前所述地使用多次。在運行示例中,這導(dǎo)致以下的骨架“0bservable. Publish (xs, ys, (xs_, ys_) =>···. ”可向公布函數(shù)的主體提供經(jīng)提升的計算。其輸入包括函數(shù)參數(shù)在索引映射412中表示的(生成別名的)源上的映射。在運行示例中,“O”映射到“xs_”,“I”映射到“ys_”,“2”映射到“xs_”。換句話說,參數(shù)“a”、“b”和 “c”分別從“xs_”、“ys_”和“xs_”汲取。注意,副效應(yīng)組件310關(guān)于冗余公布是智能的。例如,如上,既使“ys”源僅使用一次,也被公布。優(yōu)化可消除這種冗余步驟。例如,此處可基于所檢測的提供給提升函數(shù)的源的等值來動態(tài)生成代碼。
還可通信所提取的共用源表達式的殘余表達式。例如,如果“xs”對于兩次使用的確是相同的源,則 “Lift ((a, b) =>a+b) (xs. Where (x=>x%2==0, xs. Where (x=>x%2==0). Select (x=>x+l)) ”將導(dǎo)致公共子表達式“xs. Where (x=>x%2==0) ”的公布。在這種情況下, 參數(shù)索引映射412可包括關(guān)于公布后應(yīng)用的殘余表達式的附加信息。在運行示例中,“xs. Where(x=>x%2==0)”現(xiàn)在充當具有索引“O”和“I”的公共源。然而,對于索引“0”,殘余表達式可被設(shè)置為空,而索引“I”攜帶殘余表達式“Select (X=>X+1) ”。公共源仍被公布一次,且別名源被向前攜帶,“xs. Publish (xs_=>···) ”。然而,還向前攜帶具有殘余表達式的索引映射。在公布函數(shù)的表達式內(nèi),提升函數(shù)中使用的“a”可從“xs_”中提取(因為對應(yīng)于“a”的索引O不具有殘余表達式),而在使用殘余“xs_. Select (x=>x+l) ”表達式之后也可向“xs_” 汲取使用的“b”(符合索引I中的條目)。
重寫器組件430可配置成將表達式重寫到反應(yīng)性表達式。它可將參數(shù)的索引映射412用于由源分析組件410和/或公布組件420提供的始發(fā)源的參數(shù)。重寫器組件430 可配置成按順序分析函數(shù)的參數(shù),查詢源的索引映射412,該源將提供對應(yīng)于提升后的參數(shù)的值。在完成該映射之后,可構(gòu)建一串“CombineLatest”運算符調(diào)用,并且作為整體提供最初的函數(shù)(例如,CombineLatest代碼433)。例如,再次考慮“Lift ((a, b, c)=>a*b+c) (xs, ys, xs) 通過提升生成的函數(shù)包括以下邏輯1)檢測序列“xs”的重復(fù)使用,導(dǎo)致索引映射“XS->0,2”和“ys->l”;2)當重復(fù)使用“xs”時至少對于“xs”插入公布調(diào)用“XS.Publish (xs_=>-) ” ;以及 3)保持對映射 “xs_->0 (a),2 (c) ” 和 “ys->l (b) ” 的跟蹤。現(xiàn)在重寫組件430可使用對于被使用的源的“CombineLatest”調(diào)用構(gòu)建公布主體。僅使用一次的源可進行而沒有先前的 “Publish” :“xs_=>xs_. CombineLatest (ys, (x, y) =>···) ”。使用該索引映射,“CombineLatest”組合器函數(shù)參數(shù)可被映射到所提供的被提升函數(shù)。在這種情況下,“a”和“C,,兩者映射到“X”且“b”映射至IJ “y” (X,y) =>X*y+X”。如后所討論的, 對“DistinctUntiIChanged”調(diào)用可與為“CombineLatest”調(diào)用生成的表達式交錯
返回圖3,優(yōu)化組件120還包括重新評估組件320,其可配置成在可能的情況下限制表達式的重現(xiàn)評估,或換言之是表達式的重新計算。例如,在一個實例中,重新評估被限制于輸入序列值改變的實例。如果在每次改變后重新評估表達式,則存在不必要觸發(fā)重新評估的重復(fù)值。因此,重新評估組件320可配置成發(fā)起對不同值的重新評估,或換言之是對不同于先前值的重新評估。根據(jù)一個實現(xiàn),這可通過利用運算符“DistinctUntilChanged” 來實現(xiàn)。
作為實例而非限制,考慮以下的代碼段
var f=Lift ((a, b, c) =>f I (a) *f2 (b) +f3 (c));
假設(shè)“f”的三個輸入都不同,則重寫可如下
(ol, o2, o3) =>ol. CombineLatest (o2, (x, y) =>f I (x) *f2 (y)). CombineLatest (o3, (t, z) =>t+f3 (z))
對“ol”的改變將觸發(fā)對“fl(x)*f2(y)”的重新評估。然而,如果結(jié)果并非是從“ffl(x)*f2(y)”的先前計算值(“x”是來自“ol”的先前元素)改變而來的,則由“CombineLatest (o3,...) ”觸發(fā)的評估是冗余的。我們可通過注入 “DistinctUntilChanged”調(diào)用來在此點切斷計算
(ο I, ο 2 , ο 3 ) = > ο I. CombineLatest (ο 2 , (χ , y) = > f I (χ) * f 2 (y)). DistinctUntilChangedO . CombineLatest(ο3, (t, ζ)=>t+f3(ζ))
事實上,這種改變傳播的減少可基于對函數(shù)的表達式的進一步分析。在此處示出的樣本中,“fl(x)”(以及任何其它的這種函數(shù)應(yīng)用)是黑框,對于很多“χ”值其輸出可以是相同的。既使這種“X”值的源(在樣本中,“ol”)可發(fā)信號通知更新,“fl(x)”可保持穩(wěn)定。 例如,考慮使輸入值乘以O(shè)的函數(shù)。重寫可用于描繪重新評估的孤立,如下
(ol, o2, o3) =>ol. Select (x=>f I (x))
. DistinctUntilChanged(). CombineLatest(o2. Select(y=>f2(y))
. DistinctUntilChanged () , (x_, y_) = >x_*y_) . CombineLatest (o3. Select(z=>f3(z)). DistinctUntilChanged (), (t, z_)=>t+z_)
換言之,“Di stinctUnti IChanged”運算可定位成靠近輸入源以標識不同的連續(xù)元素或相對于在輸入上的運算更高。具體的位置是可配置的且依賴于函數(shù)本身的性質(zhì)(例如, 唯一值的數(shù)量、值的分布…)。在運算中,高速緩存可維持先前元素,可使其與后續(xù)元素進行比較以確定輸入元素是否不同。
優(yōu)化組件120還可包括一個或多個域?qū)S媒M件330,其基于專用域或域信息來優(yōu)化反應(yīng)性表達式。以下示出使用域?qū)S媒M件330的假設(shè)數(shù)學知識(math-savvy)實施例??紤]或示例
var f=Lift ((a, b, c) =>a*b+c);
此處,編程人員已經(jīng)指定λ表達式““(8,13,(3)=>&樸+(3”被提升或換言之生成λ 表達式的反應(yīng)性版本,且輸出被指派給“f”。在此點上,不能優(yōu)化表達式,結(jié)果可生成一般的代碼段,其可接受任何三個可觀測序列作為輸入。然而,如果對應(yīng)于提升參數(shù)“a”和“c”的輸入恰巧是相同的序列,則可優(yōu)化為
var res=f (xs, ys, xs);
如前面討論的,這可被重寫為
xs. Publish (xs_=>xs_. CombineLatest (ys, (x, y) =>x氺y+x));
然而,限制可完成函數(shù)的重寫以使其簡化,因為“a”和“c”現(xiàn)在包含相同的值“X”。 現(xiàn)在,“X”可如下析出
xs. Publish (xs_=>xs_. CombineLatest (ys, (x, y) => (x+1) *y));
相對于所涉及的序列類型——此處是可觀測的整數(shù)序列,這種優(yōu)化是域?qū)S玫摹?br>
作為附加或替換,特定優(yōu)化功能可在優(yōu)化組件120之外,如圖5所示的系統(tǒng)500。 系統(tǒng)500包括前述生成組件110和優(yōu)化組件120。系統(tǒng)500還描述與優(yōu)化組件120通信耦合并在其外部的域優(yōu)化組件510。例如,可基于表達式中涉及的序列類型從一個或多個源發(fā)現(xiàn)這種外部域優(yōu)化組件510。域優(yōu)化組件510可在其優(yōu)化中任選地使用外部信息和反饋環(huán)。域優(yōu)化組件510的輸出可以是經(jīng)域優(yōu)化的反應(yīng)性表達式。此外,盡管描述為依賴于優(yōu)化組件120,然而這不是必須的。事實上,反應(yīng)性表達式(經(jīng)優(yōu)化或未經(jīng)優(yōu)化)可經(jīng)由優(yōu)化組件120通過域優(yōu)化組件510,或直接被域優(yōu)化組件510接收或檢索。
可經(jīng)由優(yōu)化組件120施加各種其它優(yōu)化策略。作為示例而非限制,可利用改變頻率作為優(yōu)化的基礎(chǔ)。可將反應(yīng)性表達式編碼為計及輸入源提供元素(或者換言之是源的“閑談(chattiness)”)的頻率。在表達式表示在表達式樹中的情況下,優(yōu)化可對應(yīng)于重新平衡表達式,此處關(guān)于改變的頻率。一般而言,期望將最短路徑用于最經(jīng)常改變的東西。例如, 假設(shè)你具有三個輸入“A”、“B”和“C”,且“C”改變最快。因此,優(yōu)化將在“A”和“B”上執(zhí)行 “CombineLatest”操作,然后在“C”上執(zhí)行“CombineLatest”。現(xiàn)在“C”具有最短路徑長度。這類似于最重要的人最接近頂部且具有最小的通信延遲量(或,換言之是最小的管理者干擾量)的組織結(jié)構(gòu)。此外,源改變的頻率可隨時間改變,反應(yīng)性表達式可根據(jù)輸入序列改變頻率而重新優(yōu)化。
可通過用戶指定的策略控制優(yōu)化技術(shù)。作為示例而非限制,考慮利用 “DistinctUntilChanged”運算符。該運算符昂貴之處在于它需要維持狀態(tài),即由源提供的最后元素。如果源不具有相同的相鄰元素,則使用運算符是浪費的。因此,用戶可配置運算符以及由此的優(yōu)化何時被采用。假設(shè)每秒提供位置信息且具有100英尺分辨率的全球定位系統(tǒng)(GPS)。如果個人在散步,則使用“DistinctUntilChanged”運算符是有用的,因為在 100英尺旅程時接收新值之前需要一些時間。然而,如果某人駕車行駛在高速路上,使用運算符沒有太大意義,因為任何值都不太可能被丟棄。此外,還可建立使容納用于比較的元素以確定不同元素的高速緩存無效的到期策略。
可基于運行時分析動態(tài)執(zhí)行優(yōu)化,或者在用戶提供的表達式被檢查到之后的編譯時間靜態(tài)執(zhí)行優(yōu)化。例如,動態(tài)優(yōu)化可涉及分析所提供的可觀測序列或源并基于輸入發(fā)射專用代碼。例如,靜態(tài)優(yōu)化可涉及分析非反應(yīng)性表達式并去除冗余參數(shù)(例如,(a,b)=>a), 從而共享計算(例如,使用分配律…)。此外,可動態(tài)重新調(diào)節(jié)反應(yīng)性表達式的實現(xiàn)。在這種情況下,可采用閾值、策略或成本優(yōu)點分析來確定是否以及何時重新調(diào)節(jié)實現(xiàn)以進一步優(yōu)化執(zhí)行。
參考若干組件之間的交互已經(jīng)描述了上述系統(tǒng)、架構(gòu)、環(huán)境等。應(yīng)該理解,這樣的系統(tǒng)和組件可以包括其中指定的那些組件或子組件,某些指定的組件或子組件,和/或附加的組件。子組件也可以被實現(xiàn)為在通信上被耦合到其他組件而不是被包括在父組件中的組件。此外,一個或多個組件和/或子組件可以組合成提供聚集功能的單個組件。系統(tǒng)、組件、和/或子組件之間的通信可以根據(jù)推送(push)和/或拉取(pull)模型來實現(xiàn)。各組件也可以與一個或多個其他組件進行交互,出于簡要考慮在此未具體描述其他組件,但本領(lǐng)域的技術(shù)人員均已知。
此外,以上公開系統(tǒng)以及以下方法的各個部分可以包括或采用基于人工智能、機器學習或知識或規(guī)則的組件、子組件、進程、裝置、方法或機制(例如,支持向量機、神經(jīng)網(wǎng)絡(luò)、專家系統(tǒng)、貝葉斯信任網(wǎng)絡(luò)、模糊邏輯、數(shù)據(jù)融合引擎、分類器等)。這樣的組件和其它組件可以自動化其執(zhí)行的某些機制或過程,由此使得系統(tǒng)和方法的各部分更為自適應(yīng)以及高效及智能。作為示例而非限制,這些機制可推斷出反應(yīng)性表達式優(yōu)化。
考慮到以上描述的示例性系統(tǒng),參考圖6-9的流程圖將可以更好地理解依照所公開的主題實現(xiàn)的方法。盡管為了說明簡潔起見,按照一系列框示出和描述了方法,但是,應(yīng)該理解和知道,所要求保護的主題不限于框的順序,因為一些框可以按與此處所描繪和描述的不同的順序進行和/或與其他框并發(fā)地進行。此外,并非全部所示出的框都是實現(xiàn)下面所描述的方法所必需的。
參考圖6,示出便于反應(yīng)性編程的方法600。在附圖標記610處,例如基于通過編程指定的非反應(yīng)性或標準表達式生成反應(yīng)性表達式。換言之,可將非反應(yīng)性表達式提升為反應(yīng)性表達式。例如,可利用“CombineLatest”運算符從輸入序列構(gòu)造可觀測序列,并提供諸如函數(shù)之類的非反應(yīng)性表達式作為自變量。在附圖標記620,優(yōu)化反應(yīng)性表達式。換言之,生成反應(yīng)性表達式的經(jīng)優(yōu)化版本??墒褂脽o數(shù)新穎或已知的優(yōu)化技術(shù),包括但不限于濾掉對重復(fù)輸入序列的預(yù)訂以避免重復(fù)副效應(yīng)或改進性能,以及將反應(yīng)性表達式的重新評估,或改變傳播限于其中輸入序列值改變的情形,以限制過多的重新評估。
圖7描繪了優(yōu)化反應(yīng)性表達式的方法700。在附圖標記710,標識反應(yīng)性表達式中的唯一子表達式。在720,例如基于對象標識符生成用于標識子表達式的輸入源的代碼。在附圖標記730,生成用于濾掉子表達式的重復(fù)輸入源的代碼。結(jié)果,限制可觀測序列或輸入源的預(yù)訂,從而避免副效應(yīng)的重復(fù)并提高性能。
圖8示出優(yōu)化反應(yīng)性表達式的方法800的流程圖。在數(shù)字810,從源獲取輸入。例如,根據(jù)對可觀測序列的預(yù)訂,可觀測序列可將值推入觀測器。在附圖標記820,關(guān)于輸入是否于先前或最后提供的輸入相同作出確定。例如,可維持包括用于比較目的的最后提供值的高速緩存。如果在820,輸入相同(“是”),則方法終止并且實際上丟棄該輸入?;蛘撸绻斎氩幌嗤?,而是與相鄰值不同(“否”),則在附圖標記830更新與源相關(guān)聯(lián)的一個或多個元素。
圖9描繪了優(yōu)化反應(yīng)性表達式的方法900。在附圖標記910,計算數(shù)據(jù)源改變的頻率。換言之,確定輸入源的閑談(chattiness)。在數(shù)字920,例如,關(guān)于是否已經(jīng)滿足關(guān)于策略指定的閾值作出確定。換言之,該確定涉及例如基于特定頻率或改變頻率或基于成本/優(yōu)點分析(其中成本關(guān)聯(lián)于作出的改變且優(yōu)點是實現(xiàn)變化的效果)修改反應(yīng)性表達式的實現(xiàn)是否明智。如果不滿足閾值(“否”),則方法可簡單地終止。然而,如果在920,確定滿足閾值(“是”),則方法在數(shù)字930處繼續(xù),其中基于數(shù)據(jù)源改變的頻率優(yōu)化反應(yīng)性表達式。例如,與最大的改變頻率相關(guān)聯(lián)的源可被定位成具有最短的路徑長度。
此處使用的術(shù)語“組件”和“系統(tǒng)”及其各種形式旨在表示與計算機相關(guān)的實體,其可以是硬件、硬件和軟件的組合、軟件、或執(zhí)行中的軟件。例如,組件可以是但不限于是,在處理器上運行的進程、處理器、對象、實例、可執(zhí)行程序、執(zhí)行的線程、程序和/或計算機。作為說明,在計算機上運行的應(yīng)用和計算機都可以是組件。一個或多個組件可以駐留在進程和/或執(zhí)行線程中,并且組件可以位于一個計算機內(nèi)和/或分布在兩個或更多計算機之間。
在本文中使用的詞語“示例性”或其各種形式意味著用作示例、實例或說明。在此被描述為“示例性”的任何方面或設(shè)計并不一定要被解釋為相比其它方面或設(shè)計更優(yōu)選或有利。此外,各示例只是出于清楚和理解的目的來提供的并且并不意味著以任何方式限制或約束所要求保護主題或本發(fā)明的相關(guān)部分。可以理解,本來可呈現(xiàn)不同范圍的多個附加或替換示例,但出于簡明的目的已被省略。
本描述和所附權(quán)利要求書中使用的連接詞“或”旨在意味著包括性“或”而非互斥性“或”,除非另有指定或從上下文中清晰可見。換言之,“X”或“Y”旨在意味著“X”和“Y 的任何包括性排列?!崩纾绻啊瓵’采用‘X’”,“‘A’采用‘Y’”或“‘A’采用‘A’和‘B’兩者”,則在任何上述情況下都滿足“‘A’采用‘X’或‘Y’”。
如此處所使用,術(shù)語“推論”或“推斷”通常指的是從經(jīng)由事件和/或數(shù)據(jù)捕捉的一組觀察結(jié)果來推理或推斷系統(tǒng)、環(huán)境、和/或用戶的狀態(tài)的過程??梢允褂猛茢鄟順俗R特定上下文或動作,也可以生成例如狀態(tài)上的概率分布。推斷可以是概率性的,即,基于對數(shù)據(jù)和事件的考慮,計算在感興趣狀態(tài)上的概率分布。推斷也可以是指用于從事件集和/或數(shù)據(jù)集構(gòu)成高級別事件的技術(shù)。這樣的推斷導(dǎo)致從一組觀察到的事件和/或存儲的事件數(shù)據(jù)構(gòu)建新的事件或動作,不管事件在時間上是否緊密相關(guān),以及事件和數(shù)據(jù)是來自一個還是多個事件和數(shù)據(jù)源??刹捎酶鞣N分類方案和/或系統(tǒng)(例如,支持向量機、神經(jīng)網(wǎng)絡(luò)、專家系統(tǒng)、貝葉斯置信網(wǎng)絡(luò)、模糊邏輯、數(shù)據(jù)融合引擎……)來執(zhí)行關(guān)于所要求保護主題的自動化和/或推斷的動作。
而且,對于在詳細描述或權(quán)利要求書中使用術(shù)語“包括”、“包含”、“具有”、“含有” 或其它形式的變型而言,這樣的術(shù)語旨在以類似于術(shù)語“包括”的方式體現(xiàn)包含性,如同“包括”在用作權(quán)利要求書中的過渡詞時所解釋的那樣。
為了為所要求保護主題提供上下文,圖10以及以下討論旨在提供對其中可以實現(xiàn)本主題的各方面的合適環(huán)境的簡要、概括描述。然而,合適的環(huán)境只是示例并且并非旨在對使用范圍或功能提出任何限制。
盡管能夠在可以在一臺或多臺計算機上運行的程序的計算機可執(zhí)行指令的一般上下文中描述以上公開的系統(tǒng)和方法,但是,本領(lǐng)域的技術(shù)人員將認識到,各方面也可以與其他程序模塊等相結(jié)合地實現(xiàn)。一般而言,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、組件和數(shù)據(jù)結(jié)構(gòu)等。此外,本領(lǐng)域技術(shù)人員可以理解,上述系統(tǒng)和方法可用各種計算機系統(tǒng)配置實現(xiàn),包括單處理器、多處理器或多核處理器計算機系統(tǒng)、小型計算設(shè)備、大型計算機、以及個人計算機、手持式計算設(shè)備(例如,個人數(shù)字助理(PDA)、電話、手表龐)、基于微處理器或可編程消費或工業(yè)電子設(shè)備等。各方面也可以在其中任務(wù)由通過通信網(wǎng)絡(luò)鏈接的遠程處理設(shè)備執(zhí)行的分布式計算環(huán)境中實現(xiàn)。然而,所要求保護主題的某些方面,如果不是所有方面的話,可以在獨立計算機上實施。在分布式計算環(huán)境中,程序模塊可以位于本地和遠程存儲器存儲設(shè)備中的一個或兩者中。參考圖10,示出了示例通用計算機1010或計算設(shè)備(例如,臺式機、膝上型計算機、服務(wù)器、手持式設(shè)備、可編程消費或工業(yè)電子產(chǎn)品、機頂盒、游戲系統(tǒng)……)。計算機1010包括一個或多個處 理器1020、存儲器1030、系統(tǒng)總線1040、大容量存儲1050、以及一個或多個接口組件1070。系統(tǒng)總線1040與至少上述系統(tǒng)組件通信地耦合。然而,可以理解,在其最簡單的形式中,計算機1010可包括耦合到存儲器1030的一個或多個處理器1020,該一個或多個處理器920執(zhí)行存儲在存儲器1030中的各種計算機可執(zhí)行動作、指令和/或組件。處理器1020可以用通用處理器、數(shù)字信號處理器(DSP)、專用集成電路(ASIC)JI場可編程門陣列(FPGA)或其它可編程邏輯器件、分立門或晶體管邏輯、分立硬件組件或被設(shè)計為執(zhí)行此處描述的功能的其任意組合來實現(xiàn)。通用處理器可以是微處理器,但在替換方案中,處理器可以是任何處理器、控制器、微控制器、或狀態(tài)機。處理器1020還可被實現(xiàn)為計算設(shè)備的組合,例如DSP和微處理器的組合、多個微處理器、多核處理器、結(jié)合DSP核的一個或多個微處理器、或任何其它這種配置。計算機1010可包括各種計算機可讀介質(zhì)或以其他方式與各種計算機可讀介質(zhì)交互以便于控制計算機1010來實現(xiàn)所要求保護主題的一個或多個方面。計算機可讀介質(zhì)可以是能由計算機1010訪問的任何可用介質(zhì),并包含易失性和非易失性介質(zhì)以及可移動和不可移動介質(zhì)。作為示例而非限制,計算機可讀介質(zhì)可包括計算機存儲介質(zhì)和通信介質(zhì)。計算機存儲介質(zhì)包括以用于存儲諸如計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)這樣的信息的任意方法或技術(shù)來實現(xiàn)的易失性和非易失性、可移動和不可移動介質(zhì)。計算機存儲介質(zhì)包括,但不限于,存儲器設(shè)備(例如,隨機存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)……)、磁存儲設(shè)備(例如,硬盤、軟盤、磁帶盒、磁帶……)、光盤(例如,緊致盤(⑶)、數(shù)字多功能盤(DVD)……)、以及固態(tài)設(shè)備(例如,固態(tài)驅(qū)動器(SSD)、閃存驅(qū)動器(例如,卡、棒、鍵驅(qū)動器……)……)、或者可用于存儲所需信息并且可由計算機1010訪問的任何其他介質(zhì)。通信介質(zhì)通常以諸如載波或其他傳輸機制等已調(diào)制數(shù)據(jù)信號來體現(xiàn)計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù),并包括任何信息傳送介質(zhì)。術(shù)語已調(diào)制數(shù)據(jù)信號摂是指具有以在信號中編碼信息的方式被設(shè)定或改變其一個或多個特征的信號。作為示例而非限制,通信介質(zhì)包括諸如有線網(wǎng)絡(luò)或直接線連接之類的有線介質(zhì),以及諸如聲學、RF、紅外及其他無線介質(zhì)之類的無線介質(zhì)。上述的任意組合也應(yīng)包含在計算機可讀介質(zhì)的范圍內(nèi)。存儲器1030和大容量存儲1050是計算機可讀存儲介質(zhì)的示例。取決于計算設(shè)備的確切配置和類型,存儲器1030可以是易失性的(例如RAM)、非易失性的(例如ROM、閃存龐)或是兩者的某種組合。作為示例,包括諸如在啟動期間在計算機1010內(nèi)的元件之間傳輸信息的基本例程的基本輸入/輸出系統(tǒng)(BIOS)可被存儲在非易失性存儲器中,而易失性存儲器可擔當外部高速緩存存儲器以便于處理器1020的處理等。大容量存儲1050包括相對于存儲器1030用于存儲大量數(shù)據(jù)的可移動/不可移動、易失性/非易失性計算機存儲介質(zhì)。例如,大容量存儲1050包括但不限于,諸如磁盤或光盤驅(qū)動器、軟盤驅(qū)動器、閃存存儲器、固態(tài)驅(qū)動器、或記憶棒的一個或多個設(shè)備。存儲器1030和大容量存儲1050可包括或其中存儲有操作系統(tǒng)1060、一個或多個應(yīng)用1062、一個或多個程序模塊1064和數(shù)據(jù)1066。操作系統(tǒng)1060用于控制和分配計算機1010的資源。應(yīng)用1062包括系統(tǒng)和應(yīng)用軟件之一或兩者,并且可利用操作系統(tǒng)1060對資源的管理通過存儲在存儲器1030和/或大容量存儲1050中的程序模塊1064和數(shù)據(jù)1066來執(zhí)行一個或多個動作。因此,應(yīng)用1062可根據(jù)由此提供的邏輯來將通用計算機1010變成專用機器。所要求保護主題的全部或各部分可以使用產(chǎn)生控制計算機以實現(xiàn)所公開功能的軟件、固件、硬件或其任意組合的標準編程和/或工程技術(shù)來實現(xiàn)。作為示例而非限制,反 應(yīng)性編程系統(tǒng)100或其部分可以是或可以形成應(yīng)用1062的一部分,并且包括存儲在存儲器和/或大容量存儲1050中的一個或多個模塊1064和數(shù)據(jù)1066,這些模塊和數(shù)據(jù)的功能可在由一個或多個處理器1020執(zhí)行時實現(xiàn)。根據(jù)一個特定實施例,處理器1020可與片上系統(tǒng)(SOC)或在單個集成電路基座上包括或換言之集成硬件和軟件的類似架構(gòu)相對應(yīng)。此處,處理器1020可包括至少與處理器1020和存儲器1030相似的一個或多個處理器以及存儲器等。常規(guī)處理器包括最少量的硬件和軟件并且廣泛依賴于外部硬件和軟件。作為對比,處理器的SOC實現(xiàn)更強大,因為它將硬件和軟件嵌入其中以能夠用最少的硬件和軟件或不依賴于外部硬件和軟件來啟用特定功能。例如,反應(yīng)性編程系統(tǒng)100和/或相關(guān)聯(lián)的功能可被嵌入到SOC體系結(jié)構(gòu)中的硬件內(nèi)。計算機1010還包括通信地耦合到系統(tǒng)總線1040并方便與計算機1010的交互的一個或多個接口組件1070。作為示例,接口組件1070可以是端口(例如,串行、并行、PCMCIA、USB、火線龐)或接口卡(例如,聲音、視頻龐)等等。在一個示例實現(xiàn)中,接口組件1070可被具體化為用戶輸入/輸出接口,該用戶輸入/輸出接口使得用戶能夠通過一個或多個輸入設(shè)備(例如,諸如鼠標等定點設(shè)備、跟蹤球、指示筆、觸摸墊、鍵盤、話筒、操縱桿、游戲手柄、圓盤式衛(wèi)星天線、掃描儀、照相機、其他計算機……)來將命令和信息輸入到計算機1010中。在另一示例實現(xiàn)中,接口組件1070可被具體化為輸出外圍接口,該輸出外圍接口向顯示器(例如,CRT、IXD、等離子……)、揚聲器、打印機和/或其它計算機等提供輸出。此夕卜,接口組件1070可被具體化為網(wǎng)絡(luò)接口,該網(wǎng)絡(luò)接口使得能夠諸如通過有線或無線通信鏈路與其他計算設(shè)備(未示出)通信。以上所已經(jīng)描述的內(nèi)容包括所要求保護主題的各方面的示例。當然,出于描繪所要求保護主題的目的而描述每一個可以想到的組件或方法的組合是不可能的,但本領(lǐng)域內(nèi)的普通技術(shù)人員應(yīng)該認識到,所要求保護主題的許多進一步的組合和排列都是可能的。從而,所公開的主題旨在涵蓋落入所附權(quán)利要求書的精神和范圍內(nèi)的所有這樣的變更、修改和變化。
權(quán)利要求
1.一種促進反應(yīng)性編程的方法,包括 采用至少一個處理器(1020),所述處理器被配置來執(zhí)行存儲在存儲器(1030)中的計算機可執(zhí)行指令以執(zhí)行以下動作 自動生成使輸入序列改變后的計算工作最小化的反應(yīng)性表達式的經(jīng)優(yōu)化版本。
2.如權(quán)利要求I所述的方法,其特征在于,還包括從非反應(yīng)性表達式生成反應(yīng)性表達式。
3.如權(quán)利要求I所述的方法,其特征在于,生成經(jīng)優(yōu)化的版本包括消除對單個源的多次預(yù)訂。
4.如權(quán)利要求I所述的方法,其特征在于,生成經(jīng)優(yōu)化的版本包括應(yīng)用一個或多個域?qū)S玫膬?yōu)化。
5.如權(quán)利要求I所述的方法,其特征在于,生成經(jīng)優(yōu)化的版本包括生成將對反應(yīng)性表達式的重新評估限于輸入序列值改變的實例的代碼。
6.一種促進反應(yīng)性編程的系統(tǒng)(100),包括 耦合到存儲器(1030)的處理器(1020),所述處理器(1020)被配置來執(zhí)行存儲在所述存儲器(1030)中的以下計算機可執(zhí)行組件 第一組件(110),配置成從非反應(yīng)性表達式生成反應(yīng)性表達。
7.如權(quán)利要求6所述的系統(tǒng),其特征在于,還包括配置成優(yōu)化反應(yīng)性表達式的第二組件。
8.如權(quán)利要求7所述的系統(tǒng),其特征在于,所述第二組件配置成改變反應(yīng)性表達式以避免副效應(yīng)的重復(fù)。
9.如權(quán)利要求7所述的系統(tǒng),其特征在于,所述第二組件配置成改變反應(yīng)性表達式以限制對反應(yīng)性表達式的至少部分的重新評估。
10.如權(quán)利要求7所述的系統(tǒng),其特征在于,所述第二組件配置成改變反應(yīng)性表達式以優(yōu)化特定域。
全文摘要
本發(fā)明公開了反應(yīng)性表達式生成和優(yōu)化。促進反應(yīng)性編程??蓮姆欠磻?yīng)性表達式或換言之標準表達式自動生成反應(yīng)性表達式。作為附加或替換,可按多種不同方式優(yōu)化反應(yīng)性表達式以使計算工作最小化。
文檔編號G06F9/44GK102929637SQ20121044201
公開日2013年2月13日 申請日期2012年11月7日 優(yōu)先權(quán)日2011年11月8日
發(fā)明者B·德斯梅特, H·J·M·梅杰 申請人:微軟公司