專(zhuān)利名稱:注入組合查詢的單子評(píng)估的制作方法
注入組合查詢的單子評(píng)估
背景技術(shù):
計(jì)算機(jī)之間的數(shù)據(jù)交換可以采用客戶機(jī)-服務(wù)器通信、點(diǎn)到點(diǎn)通信、進(jìn)程到進(jìn)程通信等形式。一些已有的系統(tǒng)嘗試通過(guò)預(yù)先編程一個(gè)設(shè)備從另一個(gè)設(shè)備接收的數(shù)據(jù)查詢來(lái)預(yù)期這些數(shù)據(jù)查詢。然而,此類(lèi)系統(tǒng)需要相當(dāng)多的資源,并且無(wú)法預(yù)期每一個(gè)可能的數(shù)據(jù)查詢。其他已有的系統(tǒng)允許設(shè)備創(chuàng)建命令式查詢,例如在JAVASCRIPT腳本語(yǔ)言中。然而,對(duì)此類(lèi)系統(tǒng)來(lái)說(shuō),這些查詢會(huì)因?yàn)樗霾樵兯哂械拈L(zhǎng)度及其句法復(fù)雜度而難以構(gòu)成、序列化和解析。更進(jìn)一步,至少由于命令式查詢考慮了執(zhí)行來(lái)自不可信的來(lái)源的代碼(例如執(zhí)行不受限制的分配和拷貝),所述命令式查詢會(huì)暴露出安全漏洞。就此而論,這些現(xiàn)有系統(tǒng)無(wú)法防止或包含那些已被注入到經(jīng)由超文本傳輸協(xié)議(HTTP)之類(lèi)的傳輸協(xié)議發(fā)送的通信之中的惡意查詢的執(zhí)行
發(fā)明內(nèi)容
本公開(kāi)的實(shí)施例允許將操作雙向、動(dòng)態(tài)可編程地注入到第一進(jìn)程與第二進(jìn)程之間的通信中。第二進(jìn)程從第一進(jìn)程接收一個(gè)或多個(gè)具有閉包的運(yùn)算符的序列。所述閉包代表的是第二進(jìn)程在單子(monad)內(nèi)部應(yīng)用的一個(gè)或多個(gè)函數(shù)。第二進(jìn)程對(duì)所接收的具有閉包的運(yùn)算符進(jìn)行評(píng)估,以便執(zhí)行函數(shù)。在評(píng)估過(guò)程中,所述閉包被轉(zhuǎn)換成簡(jiǎn)單類(lèi)型的閉包。更進(jìn)一步,對(duì)具有經(jīng)過(guò)轉(zhuǎn)換的閉包的運(yùn)算符所進(jìn)行的評(píng)估將被綁定在單子內(nèi)部,以便限制函數(shù)的運(yùn)行。本概述是為了以簡(jiǎn)化形式引入精選概念而被提供的,并且在以下的詳細(xì)描述中將會(huì)進(jìn)一步描述這些概念。本概述的目的既不是唯一確定所保護(hù)主題的關(guān)鍵或決定性要素,也不是幫助確定描述所保護(hù)的主題的范圍。
圖I是示出了第一進(jìn)程與第二進(jìn)程進(jìn)行通信來(lái)獲取具有查詢注入的數(shù)據(jù)的例示框圖。圖2是示出了用以評(píng)估所接收的具有閉包的運(yùn)算符的第二進(jìn)程的操作的例示流程圖。圖3示是出了通過(guò)與web服務(wù)進(jìn)行通信來(lái)獲取具有查詢注入的數(shù)據(jù)的客戶機(jī)設(shè)備的例示框圖。圖4是不出了對(duì)作為統(tǒng)一資源定位符(URL)中具有l(wèi)ambda表達(dá)式的運(yùn)算符嵌入的查詢所進(jìn)行的單子處理的例示流程圖。圖5是示出了用于注入查詢的單子處理(monadic processing)的計(jì)算設(shè)備上的計(jì)算機(jī)可執(zhí)行組件的例示框圖。在附圖中,相應(yīng)的參考字符指示相應(yīng)的部分。
具體實(shí)施方式
參考附圖,本公開(kāi)的實(shí)施例允許評(píng)估可動(dòng)態(tài)編程、組成的非命令式(non-imperative)查詢。在一些實(shí)施例中,使用了查詢運(yùn)算符集合的聲明閉包(declarative closure)是在用于web應(yīng)用和移動(dòng)應(yīng)用中的雙向查詢注入的腳本語(yǔ)言中實(shí)施的。雖然這里的一些示例是參考lambda表達(dá)式公開(kāi)的,但是本公開(kāi)的各方面并不局限于lambda表達(dá)式,而是可以結(jié)合任何形式的閉包或其他閉合表達(dá)式來(lái)操作。例如,這里的實(shí)施例是可以與匿名內(nèi)部類(lèi)一起操作的。本公開(kāi)的方面包括能對(duì)可枚舉的數(shù)據(jù)集合(例如其元素在指定 時(shí)間在存儲(chǔ)器中是可用的)或異步數(shù)據(jù)集合(例如其元素是在不同時(shí)間到達(dá)的)實(shí)施組合查詢的查詢運(yùn)算符集合。枚舉量(enumerables)代表的是分布在空間域上的數(shù)據(jù),而可觀測(cè)量(observables)代表的則是分布在時(shí)間域上的數(shù)據(jù)。舉個(gè)例子,枚舉量可以跨越包括存儲(chǔ)器、本地磁盤(pán)存儲(chǔ)器、遠(yuǎn)端數(shù)據(jù)庫(kù)等等在內(nèi)的空間域。利用枚舉量,可以將應(yīng)用編寫(xiě)成好像所有數(shù)據(jù)在存儲(chǔ)器中是同時(shí)可用的,即使這些數(shù)據(jù)在物理上分布于多個(gè)設(shè)備。在可觀測(cè)模型中,應(yīng)用被編寫(xiě)成好像數(shù)據(jù)是以不可預(yù)測(cè)的方式分布于時(shí)間上的,即使一些或所有數(shù)據(jù)在特定時(shí)間是部分可用的。由于是可編程的,本公開(kāi)的方面中的查詢?cè)试S應(yīng)用開(kāi)發(fā)人員以不可預(yù)測(cè)的方式來(lái)使用服務(wù)器或web應(yīng)用的數(shù)據(jù)資源。例如,在這里沒(méi)有必要使用客戶機(jī)可能希望的所有可能的查詢來(lái)對(duì)服務(wù)器進(jìn)行預(yù)先編程。由于一些不可預(yù)測(cè)的方式可能是惡意的,因此,本公開(kāi)的方面設(shè)想了沙箱、類(lèi)型檢查、超時(shí)、重啟及其他手段來(lái)防止運(yùn)行惡意功能。就此而論,本公開(kāi)的方面能夠?qū)崿F(xiàn)可編程的web服務(wù),例如web服務(wù)304。舉例來(lái)說(shuō),組合查詢是模塊化的,并且很容易在圖形用戶界面中構(gòu)造(例如按鈕、下拉列表、菜單等等)。這些查詢由具有l(wèi)ambda表達(dá)式的一個(gè)或多個(gè)運(yùn)算符的管道序列(例如查詢管道或單子管道)組成。管道序列中的每一個(gè)階段都包括具有至少一個(gè)lambda表達(dá)式的至少一個(gè)運(yùn)算符。由于這些具有l(wèi)ambda表達(dá)式的運(yùn)算符很短并且是聲明式的,因此,具有l(wèi)ambda表達(dá)式的運(yùn)算符是以很低的成本發(fā)送、簽名、記人日志、解析、處理、分析、改寫(xiě)、編譯、沙箱化及歸檔的,而這至少會(huì)使處理得以簡(jiǎn)化。這些查詢可以由服務(wù)器使用網(wǎng)絡(luò)套接字和/或基于事件的輸入-輸出環(huán)境來(lái)實(shí)現(xiàn)。在一些實(shí)施例中,這些查詢被封裝到超文本標(biāo)記語(yǔ)言(HTML)中(例如使用統(tǒng)一資源定位符來(lái)編碼)和/或在超文本傳輸協(xié)議(HTTP)POST主體中用公鑰密碼加密系統(tǒng)(PKCS)來(lái)進(jìn)行數(shù)字簽名。此外,這些查詢還可以被解析成JAVASCRIPT對(duì)象標(biāo)注(notation),以便與C#之類(lèi)的編程語(yǔ)言進(jìn)行互通。關(guān)于具有l(wèi)ambda表達(dá)式的運(yùn)算符的一個(gè)示例是Select (X => x < 10)”。運(yùn)算符是Select”并且lambda表達(dá)式是“X => x〈 10”。這個(gè)lambda表達(dá)式的含義是“返回布爾表達(dá)式‘X < 10’的值的X的函數(shù)”。Lambda表達(dá)式是從一種類(lèi)型的值到另一種類(lèi)型的值的函數(shù)或其他變換。在本段的這個(gè)示例中,X具有數(shù)值類(lèi)型(例如由于小于運(yùn)算符“〈”的存在而推斷出),并且返回的函數(shù)值具有布爾類(lèi)型(例如從返回類(lèi)型“〈”推斷為“真”或“偽,,)。每一個(gè)具有l(wèi)ambda表達(dá)式的運(yùn)算符都具有一個(gè)處于點(diǎn)”左側(cè)的單子表達(dá)式。舉例來(lái)說(shuō),如果M是單子表達(dá)式,那么“M. Select (X => x〈 10) ”是具有l(wèi)ambda表達(dá)式的例示運(yùn)算符。每一個(gè)具有l(wèi)ambda表達(dá)式的運(yùn)算符轉(zhuǎn)而產(chǎn)生新的單子表達(dá)式。如果將具有l(wèi)ambda表達(dá)式的運(yùn)算符鏈接在一起,則能夠創(chuàng)建單子管道。舉例來(lái)說(shuō),“M. Select (someLambda).Where (someLambda) ”是一個(gè)單子表達(dá)式,其中
M是一個(gè)單子表達(dá)式
Select (some lamb da) ”是具有l(wèi)ambda表達(dá)式的運(yùn)算符,
Where (some lamb da) ”是另一個(gè)具有l(wèi)ambda表達(dá)式的運(yùn)算符,
“M. Select (somelambda) ”是另一個(gè)單子表達(dá)式,以及
“M. Select (somelambda). Where (somelambda) ” 是第三個(gè)單子表達(dá)式。這些查詢可以用來(lái)自語(yǔ)言集成查詢(LINQ)框架的查詢運(yùn)算符集合來(lái)組成,但是其·他基于查詢的框架也是可以考慮的。具有l(wèi)ambda表達(dá)式的查詢運(yùn)算符組合或管道可以依照表述性狀態(tài)轉(zhuǎn)移(REST)樣式而被嵌入在統(tǒng)一資源定位符(URL)中。所述查詢是雙向的,而這至少部分是因?yàn)樗霾樵兛杀粡目蛻魴C(jī)注入到服務(wù)器或是從服務(wù)器注入到客戶機(jī)。此外,這些查詢還可以被推送-拉取(push-pull),其中推送風(fēng)格的表達(dá)式(例如基于IObservable)和拉取風(fēng)格的表達(dá)式(例如基于IEnumerable)可以使用許多相同的LINQ運(yùn)算符和lambda來(lái)編寫(xiě)。在一些情況中,用于IEnumerable數(shù)據(jù)集合(例如分布在空間中)的查詢管道在句法上與用于IObservable數(shù)據(jù)集合(例如分布在時(shí)間上)的查詢管道是相同的。在使用LINQ的實(shí)施例中,所述查詢包括下表I的類(lèi)別中顯示的一個(gè)或多個(gè)查詢運(yùn)算符。在例示運(yùn)算符中,自變量“someLambda”代表的是任何lambda表達(dá)式(例如“X => x< 10”,“(X,y) => X + 7*y + 32 - 4*x*y” 等等)。
類(lèi)別隱麗符
『展 ^ SdeciMany(SomeLambda)
轉(zhuǎn)換.SeIect(SomeLamMa)_
過(guò)濾.VherejscroeLambda)
.Sum <someLambd a, someLam bd a),
累積 Avg _ieLambd a, someLambda).
.Max{someLambda, someLambdaj ti· ^ GroupBylsomeL ambd a) fl W OrelerBy · omeLambd a)
組合 2 p^DthsrMonad, sooieLaj
加入 ^ Joi n (ptlner Monad, someLam bd a. someLamMa, scmeLambda)_
累積 Aggceg ate 參 eed, someLam Wa)
表I.例示類(lèi)別和例示運(yùn)算符。接下來(lái)參考圖1,該例示框圖示出的是第一進(jìn)程104與第二進(jìn)程106進(jìn)行通信,以便獲取具有查詢注入的數(shù)據(jù)。第一進(jìn)程104和第二進(jìn)程106可以由經(jīng)由網(wǎng)絡(luò)通信的單獨(dú)的計(jì)算設(shè)備運(yùn)行。例如,第一進(jìn)程104可以由客戶機(jī)設(shè)備302運(yùn)行,第二進(jìn)程106可以由web服務(wù)304或其他云服務(wù)(參見(jiàn)圖3)運(yùn)行。在另一個(gè)示例中,第一進(jìn)程104可以由web服務(wù)304運(yùn)行,并且第二進(jìn)程106可以由客戶機(jī)設(shè)備302運(yùn)行。在再一個(gè)示例中,第一進(jìn)程104可以在與運(yùn)行第二進(jìn)程106的設(shè)備對(duì)等的設(shè)備上運(yùn)行。作為替換,第一進(jìn)程104和第二進(jìn)程106可以由相同的計(jì)算設(shè)備102 (作為圖I的可選顯示)運(yùn)行。例如,第一進(jìn)程104可以與在計(jì)算設(shè)備102上運(yùn)行的一個(gè)線程相關(guān)聯(lián),并且第二進(jìn)程106可以與在同一計(jì)算設(shè)備102上運(yùn)行的另一個(gè)線程相關(guān)聯(lián)。第一進(jìn)程104希望得到來(lái)自第二進(jìn)程106的數(shù)據(jù)。所請(qǐng)求的數(shù)據(jù)可以是至少能被第二進(jìn)程106訪問(wèn)的任何數(shù)據(jù),這其中包括但不局限于由第二進(jìn)程106運(yùn)行或評(píng)估某個(gè)查詢所產(chǎn)生的數(shù)據(jù)。所請(qǐng)求的數(shù)據(jù)還可以是通過(guò)運(yùn)行一個(gè)或多個(gè)函數(shù)產(chǎn)生的數(shù)據(jù)。在一些實(shí)施例中,該請(qǐng)求是對(duì)數(shù)據(jù)集合應(yīng)用一個(gè)過(guò)濾器,以便產(chǎn)生數(shù)據(jù)子集。例如,第一進(jìn)程104可以請(qǐng)求滿足了該請(qǐng)求中定義的一個(gè)或多個(gè)判據(jù)的電子郵件消息、日歷數(shù)據(jù)、產(chǎn)品信息、地圖數(shù)據(jù)、零售店名稱和位置等等。所述請(qǐng)求還可以包括訂閱第二進(jìn)程106可提供的更新的請(qǐng)求。在一些實(shí)施例中,與直接訪問(wèn)所請(qǐng)求的數(shù)據(jù)不同,第一進(jìn)程104將會(huì)預(yù)備或產(chǎn)生 至少一個(gè)描述預(yù)期數(shù)據(jù)的查詢。在一些實(shí)施例中,該查詢采用的是具有l(wèi)ambda表達(dá)式的運(yùn)算符序列的形式。在運(yùn)算符排序非常重要或是有意為之的實(shí)施例中,所述查詢將會(huì)采用序列或其他有序集合的形式(允許重復(fù)),而不是其他無(wú)序集合的形式(不允許重復(fù))。具有l(wèi)ambda表達(dá)式的運(yùn)算符可被排序,以便由第一進(jìn)程104運(yùn)行,或者這些運(yùn)算符可以在運(yùn)行或評(píng)估之前由第二進(jìn)程106重新排序。雖然在這里是參考lambda表達(dá)式或是其衍生物來(lái)進(jìn)行描述的,但是本公開(kāi)的方面并不局限于具有l(wèi)ambda表達(dá)式的運(yùn)算符或者單獨(dú)的lambda表達(dá)式,而是可以與其他查詢表示一起操作。第一進(jìn)程104將所述查詢注入到從第一進(jìn)程104發(fā)送至第二進(jìn)程106的消息中。查詢也可以被注入到由第一進(jìn)程104之外的進(jìn)程所發(fā)送的消息中。第二進(jìn)程106通過(guò)執(zhí)行該查詢來(lái)產(chǎn)生所請(qǐng)求的數(shù)據(jù),然后將所請(qǐng)求的數(shù)據(jù)返回給第一進(jìn)程104以供其消耗。這樣一來(lái),第一進(jìn)程104會(huì)將查詢處理卸載或委托給第二進(jìn)程106,由此減小了計(jì)算負(fù)擔(dān)、復(fù)雜度以及第一進(jìn)程104的存儲(chǔ)器使用。第二進(jìn)程106可以存儲(chǔ)所注入的查詢,并且在從第二進(jìn)程106到第一進(jìn)程104的將來(lái)的數(shù)據(jù)流上運(yùn)行該查詢。由此,所注入的查詢既可以只運(yùn)行一次,也可以作為“常備查詢(standing query)”而被保存,以便重復(fù)運(yùn)行至其被替換或是在經(jīng)過(guò)指定時(shí)間之后期限屆滿。接下來(lái)參考圖2,該例示流程圖示出的是第二進(jìn)程106評(píng)估所接收的具有閉包的運(yùn)算符的操作。第二進(jìn)程106可以接收或以其他方式訪問(wèn)第一進(jìn)程104產(chǎn)生的具有閉包的一個(gè)或多個(gè)運(yùn)算符。在其他實(shí)施例中,第二進(jìn)程106之外的進(jìn)程接收具有閉包的運(yùn)算符(例如執(zhí)行通信的進(jìn)程)。在這樣的實(shí)施例中,第二進(jìn)程106從例如存儲(chǔ)器中的某個(gè)位置訪問(wèn)所接收的具有閉包的運(yùn)算符。在202,如果第二進(jìn)程106接收到具有閉包的運(yùn)算符,那么在204,第二進(jìn)程106將會(huì)評(píng)估該閉包。舉例來(lái)說(shuō),所述評(píng)估包括評(píng)估和/或運(yùn)行每一個(gè)具有閉包的運(yùn)算符。與第二進(jìn)程106相關(guān)聯(lián)的調(diào)度器504或優(yōu)化器確定是否一次一個(gè)順序地評(píng)估具有閉包的運(yùn)算符,是否通過(guò)重新排列具有閉包的運(yùn)算符來(lái)優(yōu)化評(píng)估,和/或是否可以在評(píng)估具有閉包的其他運(yùn)算符的同時(shí)(舉例來(lái)說(shuō),如果第二進(jìn)程是多線程的)評(píng)估一個(gè)或多個(gè)具有閉包的運(yùn)算符。通過(guò)評(píng)估所接收的具有閉包的運(yùn)算符來(lái)執(zhí)行這里定義的函數(shù)或查詢的處理包括在206,將每一個(gè)閉包轉(zhuǎn)換成簡(jiǎn)單類(lèi)型的閉包。簡(jiǎn)單類(lèi)型演算與其他形式的表達(dá)式形成了鮮明的對(duì)比。將閉包轉(zhuǎn)換成簡(jiǎn)單類(lèi)型包括但不局限于防止或禁止自應(yīng)用和/或遞歸評(píng)估閉包。例如,第二進(jìn)程106將會(huì)阻止遞歸評(píng)估以及自應(yīng)用所述閉包。在另一個(gè)示例中,第二進(jìn)程106將會(huì)禁止評(píng)估諸如(function(X) {x(x) ;}) (function(x) {x(x) ;})之類(lèi)的表達(dá)式。在評(píng)估過(guò)程中,在208,第二進(jìn)程106會(huì)將每一個(gè)經(jīng)過(guò)轉(zhuǎn)換的閉包綁定在單子內(nèi)部,以便限制函數(shù)或查詢的運(yùn)行。雖然在這里是參考單子論述的,但是本公開(kāi)的方面可以與其他運(yùn)行代理一起操作,以便檢測(cè)和防止惡意查詢的運(yùn)行,例如步進(jìn)(st印ping)(例如通過(guò)每一個(gè)閉包來(lái)監(jiān)視存儲(chǔ)器訪問(wèn)),簽發(fā)(endorsement)、伙伴運(yùn)行(buddy execution)、抽象運(yùn)行、主機(jī)超時(shí)、驗(yàn)證等等。在一些實(shí)施例中,將閉包綁定在單子內(nèi)部包括將同一函數(shù)應(yīng)用于那些通過(guò)運(yùn)行每一個(gè)與閉包相關(guān)聯(lián)的函數(shù)而被輸出的數(shù)據(jù)。例如,每個(gè)所評(píng)估的具有閉包的運(yùn)算符的輸出都可被置入或轉(zhuǎn)換成特定的數(shù)據(jù)容器結(jié)構(gòu)。在一些實(shí)施例中,對(duì)單子內(nèi)部的閉包所進(jìn)行的評(píng)估可被描述成是“沙箱化”所述評(píng)估或閉包。作為示例,將運(yùn)算符綁定在單子內(nèi)部包括將每一個(gè)具有一個(gè)或多個(gè)閉包的運(yùn)算符X應(yīng)用于查詢管道中處于X之前的運(yùn)算符所產(chǎn)生的 數(shù)據(jù)。查詢管道中的第一項(xiàng)是單子類(lèi)型的表達(dá)式,并且該鏈中的每一個(gè)后續(xù)運(yùn)算符(具有閉包)的類(lèi)型將被檢查,以確保所有數(shù)據(jù)全都保留在單子中。附著于運(yùn)算符閉包將會(huì)檢測(cè)和變換單子內(nèi)部的單獨(dú)的值,但是閉包和閉包所附著的運(yùn)算符不允許將這些單獨(dú)的值“泄漏”到單子外部(除了具有“第一運(yùn)算符”或“ElementAt”運(yùn)算符的情形)。通過(guò)在單子內(nèi)部執(zhí)行綁定處理,可以處理源于對(duì)每一個(gè)具有閉包的運(yùn)算符所進(jìn)行的評(píng)估的任何副作用。在一些實(shí)施例中,在單子內(nèi)部對(duì)具有閉包的運(yùn)算符進(jìn)行評(píng)估,通過(guò)阻止已注入的查詢(例如從未經(jīng)核實(shí)的來(lái)源接收)訪問(wèn)系統(tǒng)資源或系統(tǒng)調(diào)用以及請(qǐng)求未被解析的引用來(lái)增強(qiáng)安全性。例如,單子運(yùn)行允許查詢僅僅調(diào)用在指定的函數(shù)集合內(nèi)可用的函數(shù)。此外,單子運(yùn)行還可以禁止以下的一項(xiàng)或多項(xiàng)處理寫(xiě)入文件系統(tǒng)或其他存儲(chǔ)器,不受限制的存儲(chǔ)器分配,聯(lián)網(wǎng),顯示,不受控制的庫(kù)加載,以及訪問(wèn)查詢上下文外部的自由變量(例如那些處于函數(shù)體中但卻不在該函數(shù)的參數(shù)列表中的變量)。然而,在一些實(shí)施例中,第二進(jìn)程106還可以允許查詢?cè)u(píng)估,以便訪問(wèn)一個(gè)或多個(gè)只讀的全局變量。 在一些實(shí)施例中,通過(guò)將經(jīng)過(guò)轉(zhuǎn)換的閉包綁定在單子內(nèi)部,創(chuàng)建了在類(lèi)別理論中被稱為Kleisli組合的結(jié)果。接下來(lái)參考圖3,該例示框圖示出的是客戶機(jī)設(shè)備302通過(guò)與web服務(wù)304進(jìn)行通信來(lái)獲取具有查詢注入的數(shù)據(jù)??蛻魴C(jī)設(shè)備302代表的是能與web服務(wù)304通信的任何設(shè)備。在下文中將會(huì)參考圖5來(lái)描述客戶機(jī)設(shè)備302的示例。客戶機(jī)設(shè)備302將查詢注入到一個(gè)從客戶機(jī)設(shè)備302發(fā)送到web服務(wù)304的消息中。Web服務(wù)304對(duì)該查詢進(jìn)行評(píng)估,并且將返回的數(shù)據(jù)提供給客戶機(jī)設(shè)備302。在一些實(shí)施例中,客戶機(jī)設(shè)備302將會(huì)運(yùn)行一個(gè)瀏覽器,其將查詢嵌入到發(fā)送至web服務(wù)304的URL 510中。Web服務(wù)304 (例如網(wǎng)站)則會(huì)評(píng)估所嵌入的查詢,以便產(chǎn)生返回?cái)?shù)據(jù)。在一些實(shí)施例中,web服務(wù)304代表的是揭示枚舉符的可枚舉數(shù)據(jù)生成器??蛻魴C(jī)302代表的是數(shù)據(jù)使用者,其對(duì)枚舉符調(diào)用方法以獲取數(shù)據(jù)。更進(jìn)一步,web服務(wù)304可以充當(dāng)可觀測(cè)數(shù)據(jù)生成器,以便接受來(lái)自充當(dāng)觀測(cè)方的客戶機(jī)設(shè)備302的訂閱。所述web服務(wù)304會(huì)在客戶機(jī)設(shè)備302中調(diào)用方法來(lái)推送數(shù)據(jù)。例如,客戶機(jī)設(shè)備302通過(guò)對(duì)IEnumerable調(diào)用函數(shù)GetEnumerator來(lái)獲取枚舉器,其具有以下例示方法
public interface IEnumerator〈T>
{ T Current { get; } bool MoveNext (); void Reset () ; }
客戶機(jī)設(shè)備302通過(guò)調(diào)用其在以下示例中的函數(shù)來(lái)從枚舉符中拉取數(shù)據(jù)using(var ator = able. GetEnumerator)while (ator. MoveNext())
Console. WriteLine(ator. Current);
Web服務(wù)304使用一個(gè)如下所示的函數(shù)來(lái)揭示IObservable public interface 10bservable<out T> : IEnumerable { IDisposable Subscribe (IObserver〈T> observer); }
客戶機(jī)設(shè)備302在IObservable接口中實(shí)施回調(diào),并且web服務(wù)器304的可觀測(cè)量會(huì)通過(guò)調(diào)用如下所示的回調(diào)處理來(lái)將數(shù)據(jù)推送到客戶機(jī)設(shè)備302 public interface 10bserver<in T>
{ void OnNext(Τ value);
void OnCompleted();
void OnError (Exception error); }
接下來(lái)將參考圖4來(lái)描述由web服務(wù)304評(píng)估在URL 510中嵌入的查詢的示例。接下來(lái)參考圖4,該例示流程圖示出的是對(duì)URL 510中作為帶有l(wèi)ambda表達(dá)式的運(yùn)算符嵌入的查詢所進(jìn)行的單子處理。在402,如果第二進(jìn)程106或其他進(jìn)程接收到來(lái)自第一進(jìn)程104的URL 510,那么在404,嵌入在URL 510中且?guī)в衛(wèi)ambda表達(dá)式的運(yùn)算符將被提取。例如,URL 510是經(jīng)由網(wǎng)絡(luò)接收的且被存儲(chǔ)在可被第二進(jìn)程106訪問(wèn)的存儲(chǔ)區(qū)域中。在106,所提取的帶有l(wèi)ambda表達(dá)式的運(yùn)算符可被優(yōu)化,以便用于評(píng)估或運(yùn)行。在408,第二進(jìn)程106會(huì)對(duì)帶有l(wèi)ambda表達(dá)式的運(yùn)算符進(jìn)行評(píng)估,以便產(chǎn)生第一進(jìn)程104所請(qǐng)求的數(shù)據(jù)。在410,所述評(píng)估包括將lambda表達(dá)式轉(zhuǎn)換成簡(jiǎn)單類(lèi)型的lambda表達(dá)式。在412,關(guān)于每一個(gè)簡(jiǎn)單類(lèi)型的lambda表達(dá)式的評(píng)估還包括將帶有經(jīng)過(guò)轉(zhuǎn)換的lambda表達(dá)式的運(yùn)算符綁定在單子內(nèi)部,以便封裝從每一個(gè)lambda表達(dá)式產(chǎn)生的數(shù)據(jù)。例如,將lambda表達(dá)式綁定在單子內(nèi)部的處理包括在評(píng)估lambda表達(dá)式的時(shí)候,將至少一個(gè)操作應(yīng)用于從每一個(gè)lambda表達(dá)式產(chǎn)生的數(shù)據(jù)。在414,所產(chǎn)生的數(shù)據(jù)將被發(fā)送到第一進(jìn)程104。接下來(lái)參考圖5,該例示框圖示出的是計(jì)算設(shè)備102上用于注入查詢的單子處理的計(jì)算機(jī)可執(zhí)行組件。在圖5的示例中,計(jì)算設(shè)備102與用戶相關(guān)聯(lián),并且代表的是用于以雙向推送-拉取的可動(dòng)態(tài)編程方式來(lái)將操作注入第一進(jìn)程104與第二進(jìn)程106之間的通信的系統(tǒng)。在一些實(shí)施例中,計(jì)算設(shè)備102對(duì)應(yīng)的是第二進(jìn)程106或是用于處理lambda表達(dá)式的設(shè)備。計(jì)算設(shè)備102代表的是任何通過(guò)運(yùn)行指令(例如應(yīng)用程序、操作系統(tǒng)功能或是這二者)來(lái)實(shí)施與計(jì)算設(shè)備102相關(guān)聯(lián)的操作和功能的設(shè)備。計(jì)算設(shè)備102可以包括移動(dòng)計(jì)算設(shè)備或是其他任何便攜設(shè)備。在一些實(shí)施例中,移動(dòng)計(jì)算設(shè)備包括移動(dòng)電話、膝上型計(jì)算機(jī)、平板計(jì)算機(jī)、計(jì)算平板、上網(wǎng)本、游戲設(shè)備和/或便攜式媒體播放器。計(jì)算設(shè)備102還可以包括便攜性較差的設(shè)備,例如臺(tái)式個(gè)人計(jì)算機(jī)、信息亭以及桌面設(shè)備。此外,計(jì)算設(shè)備102可以代表處理單元或其他計(jì)算設(shè)備群組。計(jì)算設(shè)備102具有至少一個(gè)處理器504、調(diào)度器504以及存儲(chǔ)區(qū)域。處理器504包括任何數(shù)量的處理單元,并且被編程成運(yùn)行用于實(shí)施本公開(kāi)的各方面的計(jì)算機(jī)可執(zhí)行指令。這些指令可以由處理器504或是在計(jì)算設(shè)備102內(nèi)部運(yùn)行的多個(gè)處理器執(zhí)行,或者由計(jì)算設(shè)備102外部的處理器執(zhí)行。在一些實(shí)施例中,處理器504被編程為運(yùn)行如圖(例如圖2和圖4)所示的指令。作為替換或補(bǔ)充,本公開(kāi)的各方面設(shè)想了一個(gè)能夠在定制的硬件或微代碼中運(yùn)行具有l(wèi)ambda表達(dá)式的運(yùn)算符的執(zhí)行引擎。調(diào)度器504包括用于分析具有l(wèi)ambda表達(dá)式的運(yùn)算符以及確定對(duì)于每一個(gè)運(yùn)算 符進(jìn)行評(píng)估的順序和定時(shí)的進(jìn)程。所述調(diào)度器504通過(guò)運(yùn)行來(lái)優(yōu)化lambda表達(dá)式的評(píng)估。計(jì)算設(shè)備102還具有一個(gè)或多個(gè)計(jì)算機(jī)可讀媒體,例如存儲(chǔ)區(qū)域。存儲(chǔ)區(qū)域包括與計(jì)算設(shè)備102相關(guān)聯(lián)或是可供其訪問(wèn)的任何數(shù)量的媒體。所述存儲(chǔ)區(qū)域可以處于計(jì)算設(shè)備102的內(nèi)部(如圖5所示)、計(jì)算設(shè)備102的外部(未顯示)或是所有這二者(未顯示)。特別地,存儲(chǔ)區(qū)域存儲(chǔ)了一個(gè)或多個(gè)應(yīng)用508。在被處理器504運(yùn)行的時(shí)候,所述應(yīng)用508會(huì)操作以在計(jì)算設(shè)備102執(zhí)行功能。例示的應(yīng)用508包括郵件應(yīng)用程序、web瀏覽器、日歷應(yīng)用程序、地址薄應(yīng)用程序、消息傳遞程序、媒體應(yīng)用、基于位置的服務(wù)、搜索程序、提醒服務(wù)等等。應(yīng)用508可以與配對(duì)的應(yīng)用或服務(wù)進(jìn)行通信,例如經(jīng)由網(wǎng)絡(luò)來(lái)與web服務(wù)304進(jìn)行通信。例如,應(yīng)用508可以代表所下載的客戶端應(yīng)用,其與在云中運(yùn)行的服務(wù)器端服務(wù)相對(duì)應(yīng)。接下來(lái)描述的是被設(shè)計(jì)成實(shí)施本公開(kāi)的各方面的應(yīng)用508的例示結(jié)構(gòu)。該例示應(yīng)用508是使用諸如.NET框架之類(lèi)的框架而在具有網(wǎng)絡(luò)套接字的中間層服務(wù)器中實(shí)施的。雖然網(wǎng)絡(luò)套接字保留了用于提供從web服務(wù)304到客戶機(jī)設(shè)備302的未經(jīng)請(qǐng)求的更新的選項(xiàng),但是本公開(kāi)的各方面還可以與其他傳輸機(jī)制一起操作,例如超文本傳輸協(xié)議(HTTP)。客戶機(jī)設(shè)備302上的OnNext方法是作為偵聽(tīng)器添加給網(wǎng)絡(luò)套接字的。所述OnNext方法分析并應(yīng)用來(lái)自客戶機(jī)設(shè)備302的查詢,然后將應(yīng)用所述查詢得到的輸出數(shù)據(jù)提供給客戶機(jī)設(shè)備 302。在將帶有l(wèi)ambda表達(dá)式的運(yùn)算符嵌入在URL、例如URL 510中的實(shí)施例中,存儲(chǔ)區(qū)域還會(huì)存儲(chǔ)URL 510。在借助公鑰密碼加密標(biāo)準(zhǔn)(PKCS)來(lái)包含帶有l(wèi)ambda表達(dá)式的運(yùn)算符或是將其包含于諸如JAVASCRIPT腳本語(yǔ)言之類(lèi)的腳本的實(shí)施例中,存儲(chǔ)區(qū)域?qū)?huì)存儲(chǔ)PKCS包或JAVASCRIPT對(duì)象標(biāo)注。在一些實(shí)施例中,PKCS提供了來(lái)源驗(yàn)證(例如誰(shuí)發(fā)送了查詢),篡改防護(hù)(例如沒(méi)有中間方修改過(guò)查詢),不可抵賴性(例如初始發(fā)送方不能宣稱其沒(méi)有發(fā)送過(guò)該查詢)和/或隱私性(例如只有預(yù)定接收方才可以解密所述查詢)。所述存儲(chǔ)區(qū)域還會(huì)存儲(chǔ)一個(gè)或多個(gè)計(jì)算機(jī)可執(zhí)行組件。例示的組件包括通信接口組件512、腳本組件514、類(lèi)型檢查組件516以及封裝組件518。通過(guò)運(yùn)行這些組件,可以執(zhí)行如圖2所示的操作。在圖5所示的示例中,腳本組件514、類(lèi)型檢查組件516以及封裝組件518代表的是第二進(jìn)程。在其他示例(未顯示)中,第二進(jìn)程106還會(huì)提供與通信接口組件512相關(guān)聯(lián)的功能。在由處理器504運(yùn)行的時(shí)候,通信接口組件512促使處理器504從第一進(jìn)程104接收其中注入了帶有l(wèi)ambda表達(dá)式的運(yùn)算符序列的通信。帶有l(wèi)ambda表達(dá)式的運(yùn)算符代表的是由第二進(jìn)程106執(zhí)行以產(chǎn)生輸出數(shù)據(jù)的一個(gè)或多個(gè)函數(shù)。在一些實(shí)施例中,通信接口組件512包括網(wǎng)絡(luò)接口卡和/或用于操作網(wǎng)絡(luò)接口卡的計(jì)算機(jī)可執(zhí)行指令(例如驅(qū)動(dòng)器)。在由處理器504運(yùn)行的時(shí)候,腳本組件514促使處理器504通過(guò)第二進(jìn)程106來(lái)靜態(tài)分析帶有l(wèi)ambda表達(dá)式的運(yùn)算符,以便將lambda轉(zhuǎn)換成簡(jiǎn)單類(lèi)型的形式,出于優(yōu)化或其他方面的原因而對(duì)帶有l(wèi)ambda表達(dá)式的運(yùn)算符序列重新排序,以及通過(guò)執(zhí)行函數(shù)來(lái)產(chǎn)生輸出數(shù)據(jù)。舉個(gè)例子,腳本組件514會(huì)對(duì)代表了以下的一項(xiàng)或多項(xiàng)的單子數(shù)據(jù)集合執(zhí)行函數(shù)可枚舉數(shù)據(jù)集合,分布在空間上的數(shù)據(jù)項(xiàng)的集合,以及代表了分布在時(shí)間上的數(shù)據(jù)集合的可觀測(cè)流。在這個(gè)示例中,帶有l(wèi)ambda表達(dá)式的運(yùn)算符代表的是管道化的表達(dá)式序列。關(guān)于腳本組件514的一些實(shí)施例考慮了包含類(lèi)型檢查組件516以及封裝組件518。在其他實(shí)施例中,類(lèi)型檢查組件516和封裝組件518是與腳本組件514分離的,但是仍舊與之通信。 在由處理器504運(yùn)行的時(shí)候,類(lèi)型檢查組件516會(huì)促使處理器504將每一個(gè)lambda表達(dá)式轉(zhuǎn)換成簡(jiǎn)單類(lèi)型的lambda表達(dá)式。在運(yùn)行時(shí)間,在由處理器504運(yùn)行的時(shí)候,封裝組件518會(huì)促使處理器504將單子內(nèi)部的那些帶有在靜態(tài)分析過(guò)程中轉(zhuǎn)換的lambda表達(dá)式的運(yùn)算符應(yīng)用于經(jīng)過(guò)重新排序且?guī)в衛(wèi)ambda表達(dá)式的運(yùn)算符管道的每一個(gè)在先階段的結(jié)果,以便包含函數(shù)的運(yùn)行。例如,封裝組件518會(huì)創(chuàng)建一個(gè)容器數(shù)據(jù)結(jié)構(gòu),以便封裝通過(guò)評(píng)估每一個(gè)帶有l(wèi)ambda表達(dá)式的運(yùn)算符而輸出的數(shù)據(jù)。創(chuàng)建容器數(shù)據(jù)結(jié)構(gòu)的處理可以包括在對(duì)帶有l(wèi)ambda表達(dá)式的運(yùn)算符進(jìn)行評(píng)估的時(shí)候,將至少一種操作應(yīng)用于每一個(gè)帶有經(jīng)過(guò)轉(zhuǎn)換的lambda表達(dá)式的運(yùn)算符。相同的操作或操作集合將被應(yīng)用于帶有l(wèi)ambda表達(dá)式且經(jīng)過(guò)評(píng)估的運(yùn)算符的管道中的每一個(gè)階段的輸出上。在一些實(shí)施例中,封裝檢查組件(未顯示)通過(guò)執(zhí)行靜態(tài)檢查來(lái)確認(rèn)單子管道的每一個(gè)階段都通過(guò)具有恰當(dāng)?shù)膯巫宇?lèi)型而保持了單子完整性。這樣做提供了某種保障來(lái)確保封裝組件518不會(huì)在運(yùn)行時(shí)違反單子完整性。在腳本組件514評(píng)估了帶有l(wèi)ambda表達(dá)式的運(yùn)算符之后,通信接口組件512會(huì)將所產(chǎn)生的輸出數(shù)據(jù)提供給第一進(jìn)程104。附加示例
以下列舉的是使用lambda表達(dá)式來(lái)顯示字串“Hello World”的單子沙箱化的函數(shù)的示例。"Hel lo〃
Return O // Lifts hello into the sandbox (the I0〈string>
monad)
.SelectMany (str => str. ToUpper(). Return ()) // transforms thestring and lifts result into the monad
.SelectMany(str => (str + 〃,World!〃)· Return()) // can neverget out of the monad
.SelectMany(str => {Console. WriteLine(str) ; return Unit ();})Il Now in the I0〈unit> monad
這樣做將會(huì)產(chǎn)生“Hello,World!”。括號(hào)內(nèi)的類(lèi)型會(huì)改變,但是將會(huì)保持在單子內(nèi)部。在這個(gè)示例中,Select方法在該模型中并未得到允許。SelectMany方法在每一次調(diào)用中“平化”掉(flatten out)恰好一級(jí)單子嵌套,以使sandbox (sandbox (x))在轉(zhuǎn)入管道中的下一個(gè)lambda表達(dá)式之前變成sandbox (X)。在一些實(shí)施例中,第一進(jìn)程104嵌入的查詢可以對(duì)應(yīng)于一個(gè)用于檢查數(shù)據(jù)集合中的項(xiàng)目以產(chǎn)生可能較小的數(shù)據(jù)集合的過(guò)濾器。舉個(gè)例子,在用于嘈雜的電話和無(wú)線電信道上的語(yǔ)言拼寫(xiě)的各種音標(biāo)字母(例如“alpha”、“braV0”、“Charlie”、“delta”等等)的數(shù)據(jù)庫(kù)中,第一進(jìn)程104有可能僅僅關(guān)注的是國(guó)際民用航空組織(ICAO)采納的音標(biāo)字母。以下顯示了使用LINQ運(yùn)算符的lambda表達(dá)式組成的例示查詢
phoneticAlphabets
.Where(function(w){return w.Origination == Origination. ICAO;})
.OrderBy (function(w){return w. CodeWord;}) 在這個(gè)示例中,第一進(jìn)程104會(huì)將這個(gè)查詢發(fā)送給第二進(jìn)程106,其被編碼在如下所示的URL中
http://· . . /phoneticAlphabets. Where (function (w)%7breturn+w.0rigination%3d%3d0rigination.ICA0%3b%7d).OrderBy (function (w)%7breturn+w.CodeWord%3b%7d)
如果經(jīng)過(guò)驗(yàn)證的用戶信道可用,那么第二進(jìn)程106會(huì)將該查詢與經(jīng)過(guò)驗(yàn)證的用戶信道相關(guān)聯(lián);否則,所述查詢將會(huì)借助PKCS包絡(luò)(例如在HTTP POST動(dòng)詞的主體中,而不是像REST-ful嵌入處理中那樣將查詢嵌入在URL中)來(lái)傳遞。對(duì)于PKCS包絡(luò)而言,第二進(jìn)程106將會(huì)檢查PKCS包絡(luò)上的簽名,以便實(shí)施發(fā)送方驗(yàn)證、篡改防護(hù)以及不可抵賴性。然后,第二進(jìn)程106會(huì)在日志中記錄、解釋、編譯以及評(píng)估單子中的查詢,由此將結(jié)果返回給第一進(jìn)程104。在另一個(gè)示例中,用戶關(guān)注的是音標(biāo)字母中包含了字母“I*”的碼字。以下顯示了由使用LINQ運(yùn)算符的lambda表達(dá)式組成的例示查詢
phoneticAlphabets
.Where (function (w) {return w. CodeWord. ToCharArray (). Contains (’ r’);})
.Select (function (w){return w. CodeWord;})
.Distinct ()
第一進(jìn)程104將該查詢編碼到以下所述的URL中,以便將傳送到第二進(jìn)程106。ht tp : //phonet i c. alphabets, com/RE STLINQ/phoneticAlphabets.Where (function (w)%7breturn+w. CodeWord. ToEnumerable(). Contains(’ r’) %3b%7d).Select (function (w)%7breturn+w. CodeWord%3b%7d). Distinct ()
在雙向示例中,第二進(jìn)程106從第一進(jìn)程104那里訂閱了周期性的位置更新流或偶爾的興趣更新。同樣,第一進(jìn)程104從處于客戶機(jī)設(shè)備302的附近地理位置的公司那里訂閱了與特定興趣相匹配的零星供給。以下顯示了第二進(jìn)程106的例示代碼。clientObservable // proxy to the observable on the client side.Subscribe(client => RelevantBusinesses = AllBusinesses
.Within(client. Vicinity)
.Where(business => business. IsRelevant(client))Subscribe方法的自變量是被編寫(xiě)成lambda表達(dá)式的觀測(cè)方函數(shù)。Lambda表達(dá)式的這種用法與其在查詢運(yùn)算符內(nèi)部的用法存在差別。在這個(gè)示例中,lambda表達(dá)式對(duì)來(lái)自第一進(jìn)程104的事件做出響應(yīng)。在查詢運(yùn)算符的上下文中,lambda表達(dá)式被應(yīng)用于單子(例如可枚舉單子和/或可觀測(cè)單子)內(nèi)部的數(shù)據(jù)元素。函數(shù)參數(shù)出現(xiàn)在=> 箭頭的左側(cè),并且函數(shù)主體出現(xiàn)在右側(cè)。標(biāo)注x=>…代表的是function (X) {return··· ;}。Subscribe方法確保每次來(lái)自第一進(jìn)程104的更新到達(dá)第二進(jìn)程106的時(shí)候就調(diào)用觀測(cè)方函數(shù)。觀測(cè)方函數(shù)取回是在當(dāng)前附近位置內(nèi)部過(guò)濾且與第一進(jìn)程104相關(guān)的可觀測(cè)事務(wù)的集合。所述可觀測(cè)集合則被指定了屬性RelevantBusinesses。第一進(jìn)程104以如下所述的方式來(lái)訂閱屬性RelevantBusinesses。server. RelevantBusinesses // proxy to the server’s observable.SelectMany(business => business. Offers·.Where(offer => this. Interests. Match(offer))
Merge ()
.Subscribe(offer => this. RespondToOffer(offer))
這個(gè)以“具有l(wèi)ambda表達(dá)式的運(yùn)算符”的形式撰寫(xiě)的查詢借助SelectMany方法合并來(lái)自事務(wù)的供給,通過(guò)更為私有的匹配關(guān)注度過(guò)濾所合并的供給,然后則會(huì)訂閱一個(gè)供給觀測(cè)方函數(shù),其中所述函數(shù)將會(huì)決定如何在每一個(gè)供給到達(dá)的時(shí)候?qū)ζ渥龀鲰憫?yīng)。該示例示出了,在一些實(shí)施例中出于隱私方面的原因?qū)⒁恍┎樵儽3衷诘谝贿M(jìn)程104的一端。在一些實(shí)施例中,查詢是可動(dòng)態(tài)編程的(例如,來(lái)自一個(gè)進(jìn)程的查詢可以由其他查詢改變)。在一個(gè)示例中,第二進(jìn)程106以一個(gè)指示“每隔η次觀察才進(jìn)行發(fā)送”的指令的形式來(lái)將“減慢”(例如流量控制)注入到第一進(jìn)程104中。以下查詢是用帶有l(wèi)ambda表達(dá)式的運(yùn)算符的形式撰寫(xiě)的,這些查詢示出的是來(lái)自第一進(jìn)程104且被第二進(jìn)程106注入了另一個(gè)lambda表達(dá)式的查詢。所注入的帶有l(wèi)ambda表達(dá)式的運(yùn)算符是.Where(tick=〉(tick%2==0))。clientObservable // proxy to the observable on the client side
.Where(tick => (tick % 2 == 0) // only every other one, please!
.Subscribe (client => RelevantBusinesses = AllBusinesses .Within(client. Vicinity)
.Where(business => business. IsRelevant (client))
以上查詢可以用如下所示的另一形式改寫(xiě),以便強(qiáng)調(diào)作為特定于域的語(yǔ)言(DSL)(例如帶有作為指令集的LINQ)的評(píng)估器的查詢處理器的結(jié)構(gòu),其中作為選擇,所述結(jié)構(gòu)是利用硬件增強(qiáng)和優(yōu)化處理來(lái)實(shí)施的。clientObservable // proxy to the observable on the client side
.LinqEval(Linqlnstruction. Where, 〃tick => (tick % 2 == 0)〃)
.Subscribe (client => RelevantBusinesses = AllBusinesses .Within(client. Vicinity)
.Where(business => business. IsRelevant(client))
在另一個(gè)示例中,客戶機(jī)設(shè)備302是希望發(fā)現(xiàn)附近的披薩餐廳的移動(dòng)設(shè)備。所述客戶機(jī)設(shè)備302將會(huì)構(gòu)成以下查詢 Where Cb => b. Categoryl==Undefined')
Where Cb => /pizza/i. test(b. Category)')
所述查詢可以作為HTTP POST中的文本來(lái)打包,并且有可能在PKCS包絡(luò)中受到保護(hù),或者也可以嵌入在如下所示的URL的內(nèi)部。http://· . . / standingQuery=. Where(function(b)%7Breturn%20b. Category!%3D%3Dundefined%3B%7D)%0B. Where(function(b)%7Breturn%20%2Fpizza%2Fi. test(b.Category)%3B%7D)
圖I、圖3和圖5的不同部件的功能的至少一部分可以由圖I、圖3和/或圖5中的其他部件來(lái)執(zhí)行,或是由圖I、圖3和/或圖5中未顯示的實(shí)體(例如處理器、web服務(wù)、服務(wù)器、應(yīng)用程序、計(jì)算設(shè)備等等)來(lái)執(zhí)行。
在一些實(shí)施例中,圖2和圖4所示的操作可以作為編碼在計(jì)算機(jī)可讀介質(zhì)上的軟件指令來(lái)實(shí)施,在被編程或設(shè)計(jì)成執(zhí)行操作的硬件中實(shí)施,或是以這二者實(shí)施。例如,本公開(kāi)的各方面可以作為片上系統(tǒng)來(lái)實(shí)施。雖然本公開(kāi)的各方面沒(méi)有追蹤個(gè)人可識(shí)別信息,但是這些實(shí)施例是參考通過(guò)監(jiān)視用戶得到和/或從用戶那里收集的數(shù)據(jù)來(lái)描述的。在此類(lèi)實(shí)施例中,關(guān)于數(shù)據(jù)收集的通知將被提供給用戶(例如借助對(duì)話框或是首選項(xiàng)設(shè)置),并且給用戶機(jī)會(huì)以同意或拒絕所述監(jiān)視和/或收集。所述同意可以采用選擇同意或選擇不同意的形式。例示的操作環(huán)境
例示的計(jì)算機(jī)可讀媒體包括閃存驅(qū)動(dòng)器、數(shù)字多用途盤(pán)(DVD )、緊湊型盤(pán)(CD )、軟盤(pán)以及盒式磁帶。作為示例而不是限制,計(jì)算機(jī)可讀媒體包括計(jì)算機(jī)存儲(chǔ)媒體和通信媒體。計(jì)算機(jī)存儲(chǔ)媒體包括以任何用于存儲(chǔ)信息(諸如計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù))的方法或技術(shù)實(shí)施的易失和非易失、可移除和不可移除媒體。計(jì)算機(jī)存儲(chǔ)媒體排除了傳播的數(shù)據(jù)信號(hào)。例示的計(jì)算機(jī)存儲(chǔ)媒體包括硬盤(pán)、閃存驅(qū)動(dòng)器以及其他固態(tài)存儲(chǔ)器。相比之下,通信媒體通常會(huì)將計(jì)算可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù)包含在載波之類(lèi)的調(diào)制數(shù)據(jù)信號(hào)或其他傳輸介質(zhì)中,并且包含了任何信息遞送媒體。雖然在這里是結(jié)合例示的計(jì)算系統(tǒng)環(huán)境來(lái)描述的,但是本發(fā)明的實(shí)施例可以與眾多其他的通用或?qū)S糜?jì)算系統(tǒng)環(huán)境或配置一起操作。關(guān)于適合與本發(fā)明的各方面一起使用的眾所周知的計(jì)算系統(tǒng)、環(huán)境和/或配置的示例包括但不局限于移動(dòng)計(jì)算設(shè)備、個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、手持或膝上型設(shè)備、多處理器系統(tǒng)、游戲機(jī)、基于微處理器的系統(tǒng)、機(jī)頂盒、可編程消費(fèi)類(lèi)電子設(shè)備、移動(dòng)電話、網(wǎng)絡(luò)PC、迷你計(jì)算機(jī)、大型計(jì)算機(jī)、包含了以上任何系統(tǒng)或設(shè)備的分布式計(jì)算環(huán)境等等。本發(fā)明的實(shí)施例可以在由一個(gè)或多個(gè)計(jì)算機(jī)或其他設(shè)備執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的通用上下文中描述,例如程序模塊。計(jì)算機(jī)可執(zhí)行指令可被組織到一個(gè)或多個(gè)計(jì)算機(jī)可執(zhí)行組件或模塊中。通常,程序模塊包括但不局限于執(zhí)行特定任務(wù)或?qū)嵤┨囟ǔ橄髷?shù)據(jù)類(lèi)型的例程、程序、對(duì)象、組件和數(shù)據(jù)結(jié)構(gòu)等等。本發(fā)明的各方面可以結(jié)合任意數(shù)量和組織的此類(lèi)組件或模塊來(lái)實(shí)施。例如,本發(fā)明的各方面并不局限于特定的計(jì)算機(jī)可執(zhí)行指令或是在附圖中示出并在這里描述的特定組件或模塊。本發(fā)明的其他實(shí)施例可以包括具有與這里示出和描述的功能相比具有更多或更少的功能的不同的計(jì)算機(jī)可執(zhí)行指令或組件。本發(fā)明的各方面將通用計(jì)算機(jī)變換成在被配置成執(zhí)行這里描述的指令時(shí)的專(zhuān)用計(jì)算設(shè)備。在這里示出和描述的實(shí)施例以及沒(méi)有在這里具體描述但卻處于本發(fā)明的各方面的范圍以內(nèi)的實(shí)施例構(gòu)成了使用單子來(lái)處理在URL 510的腳本語(yǔ)言中嵌入的查詢運(yùn)算符的例示手段,以及通過(guò)web服務(wù)304之類(lèi)的web服務(wù)來(lái)對(duì)帶有l(wèi)ambda表達(dá)式的運(yùn)算符進(jìn)行單子評(píng)估的例示手段。除非另有規(guī)定,否則,在這里示出和描述的本發(fā)明的實(shí)施例中的操作的執(zhí)行或運(yùn)行順序并不是必要的。換言之,除非另有規(guī)定,否則這些操作可以按照任何順序執(zhí)行,并且與這里公開(kāi)的實(shí)施例相比,本發(fā)明的實(shí)施例可以包括附加的操作或更少的操作。例如,在另一個(gè)操作之前、同時(shí)或是之后運(yùn)行或執(zhí)行特定操作的處理可被認(rèn)為處于本發(fā)明的方面的范圍以內(nèi)。在介紹本發(fā)明的各方面的元素或是其實(shí)施例的時(shí)候,冠詞“一”、“該”以及“所述”指的是存在一個(gè)或多個(gè)元素。術(shù)語(yǔ)“包括”、“包含”和“具有”應(yīng)該是包含性的,并且指的是可以存在除了所列舉的元素之外的附加元素。 雖然在這里詳細(xì)描述了本發(fā)明的各方面,但是很明顯,在不脫離附加權(quán)利要求定義的本發(fā)明的各方面的范圍的情況下,修改和變更都是可行的。由于可以在不脫離本發(fā)明的各方面的范圍的情況下在上述結(jié)構(gòu)、產(chǎn)品和方法中進(jìn)行不同的改動(dòng),因此,包含在以上描述中并在附圖中顯示的所有主題應(yīng)該被解釋成是說(shuō)明性而不是限制性的。
權(quán)利要求
1.一種用于以雙向、可動(dòng)態(tài)編程的方式來(lái)將操作注入到第一進(jìn)程(104)與第二進(jìn)程(106)之間的通信中的系 統(tǒng),所述系統(tǒng)包括 與第二進(jìn)程(106)相關(guān)聯(lián)的存儲(chǔ)區(qū)域(506),所述存儲(chǔ)區(qū)域(506)存儲(chǔ)統(tǒng)一資源定位符(URL) (510),所述統(tǒng)一資源定位符中嵌入了帶有閉包的一個(gè)或多個(gè)運(yùn)算符,所述帶有閉包的運(yùn)算符對(duì)應(yīng)于至少一個(gè)關(guān)于數(shù)據(jù)的請(qǐng)求;以及 處理器(502),其被編程成 經(jīng)由網(wǎng)絡(luò)從第一進(jìn)程(104)接收該URL (510),以及將接收到的URL (510)保存在存儲(chǔ)區(qū)域(506)中; 從存儲(chǔ)區(qū)域(506)中保存的URL (510)中提取帶有閉包的運(yùn)算符; 由第二進(jìn)程(106)評(píng)估所提取的帶有閉包的運(yùn)算符,以便產(chǎn)生所請(qǐng)求的數(shù)據(jù),所述評(píng)估包括 將閉包轉(zhuǎn)換成簡(jiǎn)單類(lèi)型的閉包,以及 將帶有經(jīng)過(guò)轉(zhuǎn)換的閉包的運(yùn)算符綁定在單子內(nèi)部,以便封裝從帶有經(jīng)過(guò)轉(zhuǎn)換的閉包的運(yùn)算符中產(chǎn)生的數(shù)據(jù);以及 將所產(chǎn)生的數(shù)據(jù)發(fā)送到第一進(jìn)程(104)。
2.權(quán)利要求I的系統(tǒng),其中第一進(jìn)程是由客戶機(jī)設(shè)備運(yùn)行的,并且第二進(jìn)程是由云服務(wù)運(yùn)行的。
3.權(quán)利要求I的系統(tǒng),其中第一進(jìn)程是由云服務(wù)運(yùn)行的,并且第二進(jìn)程是由客戶機(jī)設(shè)備運(yùn)行的。
4.權(quán)利要求I的系統(tǒng),其中處理器被編程成通過(guò)將至少一個(gè)操作應(yīng)用于通過(guò)評(píng)估每一個(gè)帶有經(jīng)過(guò)轉(zhuǎn)換的閉包的運(yùn)算符所產(chǎn)生的數(shù)據(jù)而將帶有經(jīng)過(guò)轉(zhuǎn)換的閉包的運(yùn)算符綁定在單子內(nèi)部,其中相同的操作被應(yīng)用于從管道中帶有經(jīng)過(guò)轉(zhuǎn)換的閉包的在先運(yùn)算符中產(chǎn)生的數(shù)據(jù)上。
5.權(quán)利要求I的系統(tǒng),還包括 用于利用單子處理以腳本語(yǔ)言嵌入在URL中的查詢運(yùn)算符的裝置;以及 用于由web服務(wù)來(lái)對(duì)帶有閉包的運(yùn)算符進(jìn)行單子評(píng)估的裝置。
6.一種方法,包括 從第一進(jìn)程(104)接收一個(gè)或多個(gè)帶有閉包的運(yùn)算符,所述帶有閉包的運(yùn)算符代表的是由第二進(jìn)程(106)執(zhí)行的一個(gè)或多個(gè)函數(shù);以及 第二進(jìn)程(106)對(duì)接收到的帶有閉包的運(yùn)算符進(jìn)行評(píng)估,以便通過(guò)以下處理來(lái)運(yùn)行函數(shù) 將閉包轉(zhuǎn)換成簡(jiǎn)單類(lèi)型的閉包;以及 將帶有經(jīng)過(guò)轉(zhuǎn)換的閉包的運(yùn)算符綁定在單子內(nèi)部,以便限制所述函數(shù)的運(yùn)行。
7.權(quán)利要求6的方法,其中將帶有經(jīng)過(guò)轉(zhuǎn)換的閉包的運(yùn)算符綁定在單子內(nèi)部包括以下的一項(xiàng)或多項(xiàng)處理創(chuàng)建Kleisli組合,以及將至少一個(gè)操作應(yīng)用于通過(guò)運(yùn)行每一個(gè)函數(shù)得到的輸出數(shù)據(jù)上,其中相同的操作被應(yīng)用于每一個(gè)函數(shù)。
8.權(quán)利要求6的方法,其中計(jì)算設(shè)備運(yùn)行第一進(jìn)程和第二進(jìn)程,其中接收帶有閉包的運(yùn)算符包括接收一個(gè)或多個(gè)編碼在腳本語(yǔ)言中和/或打包在超文本標(biāo)記語(yǔ)言中的查詢,以及其中評(píng)估帶有閉包的運(yùn)算符包括對(duì)從包含下列各項(xiàng)的集合中選擇的查詢運(yùn)算符進(jìn)行評(píng)估擴(kuò)展、轉(zhuǎn)換、過(guò)濾、編組、加入、排序、組合以及累積。
9.權(quán)利要求6的方法,其中評(píng)估帶有閉包的運(yùn)算符包括以下的一個(gè)或多個(gè)處理對(duì)帶有閉包的運(yùn)算符進(jìn)行排序以便進(jìn)行順序評(píng)估,以及將過(guò)濾器應(yīng)用于數(shù)據(jù)集合以便產(chǎn)生數(shù)據(jù)子集,以及其中轉(zhuǎn)換閉包包括以下的一個(gè)或多個(gè)處理禁止遞歸評(píng)估所述閉包,以及禁止針對(duì)所述閉包的自應(yīng)用更高階自變量。
10.權(quán)利要求6的方法,其中一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)媒體包含了計(jì)算機(jī)可執(zhí)行組件,所述組件包括 通信接口組件,其在被運(yùn)行的時(shí)候使至少一個(gè)處理器從第一進(jìn)程接收注入了帶有閉包的運(yùn)算符的序列的通信,所述帶有閉包的運(yùn)算符代表的是由第二進(jìn)程執(zhí)行以產(chǎn)生輸出數(shù)據(jù)的函數(shù);以及 腳本組件,其在被運(yùn)行的時(shí)候使至少一個(gè)處理器通過(guò)第二進(jìn)程來(lái)按順序靜態(tài)分析帶有閉包的運(yùn)算符,以便執(zhí)行函數(shù)來(lái)產(chǎn)生輸出數(shù)據(jù),所述腳本組件包括 類(lèi)型檢查組件,其在被運(yùn)行的時(shí)候使至少一個(gè)處理器將每一個(gè)閉包轉(zhuǎn)換成簡(jiǎn)單類(lèi)型的閉包;以及 封裝組件,其在被運(yùn)行的時(shí)候使至少一個(gè)處理器在單子內(nèi)部應(yīng)用將帶有在靜態(tài)分析期間被類(lèi)型檢查組件轉(zhuǎn)換過(guò)的閉包的運(yùn)算符應(yīng)用于來(lái)自帶有閉包的運(yùn)算符的序列中的在先階段的輸出數(shù)據(jù)上,以便包含函數(shù)的運(yùn)行, 其中所述通信接口組件將所產(chǎn)生的輸出數(shù)據(jù)提供給第一進(jìn)程。
全文摘要
本申請(qǐng)涉及注入組合查詢的單子評(píng)估。這里的實(shí)施例能在單子內(nèi)部對(duì)注入的查詢進(jìn)行評(píng)估。一個(gè)或多個(gè)帶有閉包的運(yùn)算符將被從第一進(jìn)程接收。帶有閉包的運(yùn)算符代表的是由第二進(jìn)程應(yīng)用的一個(gè)或多個(gè)函數(shù)。第二進(jìn)程對(duì)接收到的帶有閉包的運(yùn)算符進(jìn)行評(píng)估,以便在單子內(nèi)部應(yīng)用函數(shù)。在評(píng)估過(guò)程中,第二進(jìn)程將閉包轉(zhuǎn)換成簡(jiǎn)單類(lèi)型的閉包。更進(jìn)一步,第二進(jìn)程將經(jīng)過(guò)轉(zhuǎn)換的閉包綁定在單子內(nèi)部,以便限制函數(shù)的運(yùn)行。在一些實(shí)施例中,所述查詢(例如一個(gè)或多個(gè)帶有閉包的運(yùn)算符的序列)是使用來(lái)自編碼在表述性狀態(tài)轉(zhuǎn)移(REST)風(fēng)格的統(tǒng)一資源定位符(URL)中的語(yǔ)言集成查詢(LINQ)框架的查詢運(yùn)算符集合組成的。
文檔編號(hào)G06F9/54GK102902595SQ201210405280
公開(kāi)日2013年1月30日 申請(qǐng)日期2012年10月22日 優(yōu)先權(quán)日2011年10月21日
發(fā)明者B.貝克曼, E.格森, G.金基, A.巴-齊夫, S.欽奈, H.J.M.梅杰 申請(qǐng)人:微軟公司