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

用于構(gòu)造基于組件的應(yīng)用的可執(zhí)行代碼的方法和系統(tǒng)的制作方法

文檔序號(hào):6602854閱讀:150來(lái)源:國(guó)知局
專利名稱:用于構(gòu)造基于組件的應(yīng)用的可執(zhí)行代碼的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域
本發(fā)明一般涉及基于組件的(component-based)代碼生成,并且更具體地涉及用 于構(gòu)造基于組件的應(yīng)用的增量(incremental)方法。
背景技術(shù)
基于組件的應(yīng)用是使用多個(gè)互連的功能組件或操作器(operator)建立(build) 的應(yīng)用。在該環(huán)境中,組件是小塊代碼,其執(zhí)行如數(shù)據(jù)轉(zhuǎn)換、過(guò)濾、注釋、分類、解復(fù)用和劃分 的一般操作。兩個(gè)組件可以通過(guò)流相互作用,所述流攜帶潛在無(wú)限量的數(shù)據(jù)。組件可能根 據(jù)指定序列以預(yù)定方式對(duì)數(shù)據(jù)操作以產(chǎn)生一些輸出。典型地,這些組件的每一個(gè)根據(jù)涉及代碼生成和代碼編譯的兩步處理建立。代碼 生成步驟包括從應(yīng)用的陳述性描述生成可執(zhí)行代碼。具體地,假定特定類型的組件,代碼生 成涉及調(diào)用對(duì)應(yīng)于該類型的代碼生成器,并且為其提供用于組件的合適的配置參數(shù)。代碼 生成器然后為組件生成通用編程語(yǔ)言(例如,C或C++編程語(yǔ)言)的專用代碼。代碼編譯步 驟包括將專用代碼編譯為可在目標(biāo)平臺(tái)(例如,基于因特爾X86指令組架構(gòu)的計(jì)算機(jī))上 執(zhí)行的對(duì)象代碼。通用建立工具典型地用于協(xié)調(diào)生成和/或編譯步驟。這種建立工具的一 些示例是 “make ”、“ gnumake ”、"nmake ”、“ jam” 和 “ant ” 工具。在一些情況下,包含基于組件的應(yīng)用的陳述性描述的文件可以改變。結(jié)果,與應(yīng) 用相關(guān)聯(lián)的一些組件可以改變,使用于那些組件的代碼的重新生成成為必要。依賴于時(shí)間 戳數(shù)據(jù)來(lái)確定代碼是否已經(jīng)改變的傳統(tǒng)建立工具不但重新生成所有組件的代碼,而且還完 全重新編譯重新生成的代碼。因此,甚至為實(shí)際上還沒(méi)有改變(例如,還沒(méi)有改變它們處理 數(shù)據(jù)的方式)的組件也重新生成和重新編譯代碼,僅僅因?yàn)樗鼈兊臅r(shí)間戳比對(duì)象代碼的更 新。

發(fā)明內(nèi)容
用于為基于組件的應(yīng)用構(gòu)造可執(zhí)行代碼的方法的一個(gè)實(shí)施例包括接收編譯用于 基于組件的應(yīng)用的源代碼的請(qǐng)求,其中請(qǐng)求識(shí)別源代碼,并且其中源代碼包括多個(gè)源代碼 組件,源代碼組件的每一個(gè)實(shí)現(xiàn)應(yīng)用的不同組件;以及執(zhí)行用于每個(gè)源代碼組件的一系列 步驟,其中所述一系列步驟包括為源代碼組件導(dǎo)出導(dǎo)出的簽名;檢索對(duì)應(yīng)于用于源代碼 組件的可執(zhí)行代碼的當(dāng)前可用實(shí)例的存儲(chǔ)的簽名;比較導(dǎo)出的簽名和存儲(chǔ)的簽名;當(dāng)導(dǎo)出 的簽名不匹配存儲(chǔ)的簽名時(shí),將源代碼組件編譯為可執(zhí)行代碼;以及當(dāng)導(dǎo)出的簽名匹配存 儲(chǔ)的簽名時(shí),從庫(kù)中獲得用于源代碼組件的可執(zhí)行代碼。


參照實(shí)施例可以進(jìn)行本發(fā)明的更具體描述,使得可以詳細(xì)理解本發(fā)明的上述特征 的方式,一些實(shí)施例在附圖中圖示。然而,要注意附圖僅圖示本發(fā)明的典型實(shí)施例,因此不 認(rèn)為限制其范圍,由于本發(fā)明可以允許其它等效的實(shí)施例。
圖1是圖示可以適于從本發(fā)明受益的第一示例性基于組件的應(yīng)用的框圖;圖2是圖示根據(jù)本發(fā)明的編譯器的一個(gè)實(shí)施例的框圖;圖3是圖示根據(jù)本發(fā)明的用于生成基于組件的應(yīng)用的代碼的方法的一個(gè)實(shí)施例 的流程圖;圖4是圖示可以適于從本發(fā)明受益的第二示例性基于組件的應(yīng)用的框圖;以及圖5是使用通用計(jì)算設(shè)備實(shí)現(xiàn)的代碼生成方法的高級(jí)框圖。
具體實(shí)施例方式在一個(gè)實(shí)施例中,本發(fā)明是用于增量地構(gòu)造基于組件的應(yīng)用的方法和裝置。本發(fā) 明的實(shí)施例采用基于元數(shù)據(jù)的簽名技術(shù),以避免不必要地重新生成和重新編譯可執(zhí)行組件 代碼。具體地,元數(shù)據(jù)用于描述定義應(yīng)用的每個(gè)組件的配置。簽名從該用于每個(gè)組件的元 數(shù)據(jù)計(jì)算,并且與為組件生成的可執(zhí)行代碼相關(guān)聯(lián)地保持在代碼庫(kù)中。在代碼生成時(shí),搜索 代碼庫(kù),并且如果在那里發(fā)現(xiàn)存儲(chǔ)的代碼對(duì)應(yīng)于要為其生成新的代碼的組件,則檢索對(duì)應(yīng) 于存儲(chǔ)的代碼的簽名。如果存儲(chǔ)的代碼的簽名不同于為新的代碼計(jì)算的簽名,則根據(jù)新的 代碼重新生成用于該組件的代碼。如果簽名沒(méi)有不同,則不重新生成用于該組件的代碼。圖1是圖示可以適于從本發(fā)明受益的第一示例性基于組件的應(yīng)用100的框圖。具 體地,示例性基于組件的應(yīng)用100是流處理應(yīng)用;然而,要理解本發(fā)明基本上可以用在任何 類型的基于組件的應(yīng)用開(kāi)發(fā)架構(gòu)中,并且不限于流處理應(yīng)用。應(yīng)用100包括通過(guò)流相互連接的多個(gè)組件或“操作器” 102^1023下文中統(tǒng)稱為 “操作器102” )。操作器102配置為對(duì)進(jìn)入流數(shù)據(jù)104進(jìn)行操作,并且將操作的結(jié)果輸出 (也可以以流的形式)到數(shù)據(jù)庫(kù)106。在一個(gè)實(shí)施例中,每個(gè)操作器102是多個(gè)可能類型之一,包括但不限于源 (Source)(例如,操作器Ii^1,其用于從外部數(shù)據(jù)源讀取數(shù)據(jù))、功能元件(Functor)(例 如,操作器1022、1023、1026和1027,其用于對(duì)流數(shù)據(jù)執(zhí)行如過(guò)濾的基本數(shù)據(jù)變換)、集合 (Aggregate)(例如,操作器1024,其用于邏輯地將流數(shù)據(jù)分組為各概要)、連接(Join)(例 如,操作器1025,其用于將兩個(gè)流相關(guān))、以及宿(Sink)(例如,操作器102n,其用于使數(shù)據(jù)具 體化)。這些操作器102的每個(gè)可以以特定方式配置。換句話說(shuō),每個(gè)操作器102是特定類 型的可配置組件。因此,在示例性流處理應(yīng)用100的環(huán)境中,每個(gè)操作器102可以稱為“操 作器實(shí)例”。例如,示例性應(yīng)用100可以配置來(lái)處理金融數(shù)據(jù)流,如實(shí)況股市傳播。在這樣的應(yīng) 用中,源操作器102i可以從進(jìn)入數(shù)據(jù)流104讀取輸入,并且將該輸入傳遞到第一和第二功 能元件操作器1022和1023。第一功能元件操作器1022可以傳遞交易并且從輸入數(shù)據(jù)流計(jì) 算量?jī)r(jià),而第二功能元件操作器1023可能傳遞來(lái)自進(jìn)入數(shù)據(jù)流的股票報(bào)價(jià)。然后交易和量 價(jià)從第一功能元件操作器1022傳遞到集合操作器1024,其可以計(jì)算進(jìn)入數(shù)據(jù)流中每個(gè)股票 訂單或符號(hào)的移動(dòng)平均。集合操作器1024然后可以將移動(dòng)平均傳遞到第三功能元件操作器 1026,其計(jì)算進(jìn)入數(shù)據(jù)流中股票的交易量加權(quán)平均價(jià)(VWAP)。連接操作器1025可以接收來(lái) 自第二功能元件操作器1023的股票報(bào)價(jià)和來(lái)自第三功能元件操作器1026的交易量加權(quán)平 均價(jià),并且計(jì)算交易指數(shù)(bargain index)。連接操作器1025然后可以將交易指數(shù)傳遞到 第四功能元件操作器1027,其可以在將數(shù)據(jù)傳遞到宿操作器102n之前丟棄具有零值交易指數(shù)的消息,宿操作器102n然后將結(jié)果寫(xiě)入到數(shù)據(jù)庫(kù)106。如上所述,編譯如示例性應(yīng)用100的流處理應(yīng)用涉及從應(yīng)用的邏輯描述生成可執(zhí) 行的代碼。給定特定類型的操作器實(shí)例,代碼生成涉及調(diào)用相應(yīng)的代碼生成器,并且提供合 適的配置參數(shù)給代碼生成器。代碼生成器為操作器實(shí)例生成通用編程語(yǔ)言(例如,C或C++ 編程語(yǔ)言)的專用代碼。生成的代碼然后編譯為可在目標(biāo)平臺(tái)上執(zhí)行的對(duì)象代碼。編譯通 常使用通用建立工具(如“make”工具)執(zhí)行。例如,考慮以高級(jí)編程語(yǔ)言表示的以下兩個(gè)示例性功能元件操作器實(shí)例,其中 兩個(gè)功能元件操作器用于通過(guò)處理來(lái)自稱為TradeQuote的最初流的數(shù)據(jù)生成新的流 (TradeFi Iter和QuoteFi Iter)。這些示例和下面示出的那些以SPADE編程語(yǔ)言書(shū)寫(xiě), SPADE HefMIg-Wfi Gedik ^Λ "SPADE :The System SDeclarative Stream Processing Engine”,SIGMOD 會(huì)議 2008 :1123_1134 中進(jìn)一步詳細(xì)描述。Stream TradeFiIter(ticker:String, myvwap:Float,volume:Float): = Functor (TradeQuote) [ttype =,,Trade,,& volume > 0. 0](表 達(dá)式1){myvwap: = price 氺 volume}Stream QuoteFilter(ticker:String, askprice:Float, asksize:Float): = Functor (TradeQuote) [ttype =,,Quote,,& askprice > 0. 0] {} (表 達(dá)式2)表達(dá)式1和表達(dá)式2表示相應(yīng)的功能元件操作器實(shí)例的陳述性描述的高級(jí)編程語(yǔ)
言翻譯。表達(dá)式1和表達(dá)式2中的兩個(gè)功能元件操作器實(shí)例以不同方式清楚地配置。具體 地,每個(gè)操作器實(shí)例生成的流的模式(schema)是不同的(S卩,用于TradeFilter的模式對(duì) 用于QuoteFilter的模式)。此外,如過(guò)濾條件(即,ttype =” Trade” & volume > 0. O對(duì) ttype =,,Quote,,& askprice > 0. 0)的一些參數(shù)是不同的(即,它們產(chǎn)生的作為結(jié)果的流 消息是不同的,并且在表達(dá)式1中,基于輸入元組的屬性值計(jì)算稱為myvwap的新的消息屬 性)。此外,屬性分配是不同的。這指示與功能元件操作器實(shí)例相關(guān)聯(lián)的代碼生成器將為至 少這兩個(gè)功能元件操作器實(shí)例生成不同代碼。圖2是圖示根據(jù)本發(fā)明的編譯器200的一個(gè)實(shí)施例的框圖。在圖2的環(huán)境中,稱 為“編譯器”的實(shí)體執(zhí)行代碼生成和編譯,如下面進(jìn)一步詳細(xì)討論的。例如,編譯器200可 以實(shí)現(xiàn)來(lái)生成用于基于組件的應(yīng)用(如圖1中圖示的基于組件的應(yīng)用100)的操作器實(shí)例 或組件的代碼。如圖所示,編譯器200接收用于提出的操作器實(shí)例的配置參數(shù)202 (例如, 流處理應(yīng)用的環(huán)境中的流模式、過(guò)濾判定(predicate)等),并且將用于提出的操作器實(shí)例 的相應(yīng)對(duì)象代碼輸出到目標(biāo)機(jī)器204??梢砸杂布④浖騼烧叩慕M合實(shí)現(xiàn)編譯器200。編 譯器200可以包括多個(gè)元件,如簽名比較器、簽名數(shù)據(jù)庫(kù)和代碼生成器。編譯器200的一個(gè) 示例是SPADE編程語(yǔ)言編譯器,如根據(jù)本發(fā)明修改的。如圖所示,編譯器200包括簽名比較引擎206、庫(kù)或簽名數(shù)據(jù)庫(kù)208、多個(gè)代碼生成 器ZlOiHOj下文中統(tǒng)稱“代碼生成器210”)、以及后端212。當(dāng)編譯器200接收用于基于 組件的程序的提出的操作器實(shí)例的配置參數(shù)202時(shí),其將配置參數(shù)202傳遞到簽名比較處 理器206。如參照?qǐng)D3進(jìn)一步詳細(xì)討論的,簽名比較處理器206從配置參數(shù)202導(dǎo)出用于提出的操作器實(shí)例的簽名。簽名比較處理器206然后比較導(dǎo)出的簽名與為操作器實(shí)例的之前 生成版本存儲(chǔ)的簽名。從簽名數(shù)據(jù)庫(kù)208檢索存儲(chǔ)的簽名。如果簽名比較引擎206基于簽名比較確定應(yīng)該為提出的操作器實(shí)例生成可執(zhí)行 代碼,則簽名比較處理器206將配置參數(shù)202傳遞到代碼生成器210,其對(duì)應(yīng)于由提出的操 作器實(shí)例表示的操作器的類型(例如,源、功能元件、集合、連接、宿等)。代碼生成器210為 操作器實(shí)例生成通用編程語(yǔ)言的專用代碼,并且將專用代碼傳遞到后端編譯器(例如,C或 C++編程語(yǔ)言編譯器)212。后端編譯器212將專用代碼編譯為可在目標(biāo)機(jī)器204上執(zhí)行的 對(duì)象代碼,然后將對(duì)象代碼提供到目標(biāo)機(jī)器204。圖3是圖示根據(jù)本發(fā)明的、用于生成用于基于組件的應(yīng)用的代碼的方法300的一 個(gè)實(shí)施例的流程圖。例如,可以通過(guò)圖2中圖示的編譯器200的簽名比較處理器206實(shí)現(xiàn) 方法300。例如,當(dāng)基于組件的應(yīng)用改變并且重新運(yùn)行編譯器時(shí),可以實(shí)現(xiàn)方法300。在步驟302初始化方法300,并且進(jìn)到步驟304,其中方法300接收指令以重新生 成用于基于組件的應(yīng)用的代碼。因此,該指令要求為應(yīng)用中的至少一個(gè)操作器實(shí)例的提出 版本生成代碼,其中操作器實(shí)例的當(dāng)前版本存在于應(yīng)用的當(dāng)前版本中。在步驟306,方法300導(dǎo)出用于操作器實(shí)例的提出版本的簽名。在一個(gè)實(shí)施例中, 簽名是可擴(kuò)展標(biāo)記語(yǔ)言(XML)文檔,其捕獲操作器實(shí)例的提出版本的配置參數(shù)。在該示例 中,簽名表示可以用于將操作器的可修改方面綁的配置參數(shù)。在該示例中,簽名表示可以用 于將操作器的可修改方面綁定到特定設(shè)置的配置參數(shù)。因此,簽名捕獲可以觸發(fā)不同代碼 的生成的所有相關(guān)操作器參數(shù)。例如,在數(shù)據(jù)流處理應(yīng)用的環(huán)境中,用于操作器實(shí)例的簽名 可以包括流模式、過(guò)濾判定、連接和分組設(shè)置等。在一個(gè)實(shí)施例中,從與操作器實(shí)例相關(guān)聯(lián) 的元數(shù)據(jù)導(dǎo)出操作器實(shí)例的簽名。例如,方法300可以從操作器實(shí)例的源代碼提取配置參 數(shù),并且生成元數(shù)據(jù)的基于串或XML的表示作為簽名。在一個(gè)實(shí)施例中,元數(shù)據(jù)中的編譯時(shí) 間可估計(jì)常數(shù)表示用在運(yùn)行時(shí)間加載的位置保持器(Place holder)(例如,修改的配置參 數(shù))代替。該元數(shù)據(jù)捕獲與操作器實(shí)例相關(guān)聯(lián)的所有配置參數(shù)。在步驟308,方法從代碼庫(kù)檢索與操作器實(shí)例的當(dāng)前版本相關(guān)聯(lián)的簽名。在一個(gè)實(shí) 施例中,代碼庫(kù)與為操作器實(shí)例生成的代碼一起保持與應(yīng)用相關(guān)聯(lián)的每個(gè)操作器實(shí)例的簽名。在步驟310,方法300比較提出的操作器實(shí)例和當(dāng)前操作器實(shí)例的簽名,以便確定 簽名是否匹配。如上所討論的,從與操作器實(shí)例相關(guān)聯(lián)的所有配置參數(shù)的元數(shù)據(jù)導(dǎo)出捕獲 操作器實(shí)例的簽名。給定這些配置參數(shù),與操作器類型相關(guān)聯(lián)的代碼生成器可以為操作器 實(shí)例創(chuàng)建適合的代碼。因此,如果用于兩個(gè)操作器實(shí)例的元數(shù)據(jù)相同,則為那些操作器實(shí)例 生成的代碼(以及簽名)也是相同的。然而,如果用于兩個(gè)操作器實(shí)例的元數(shù)據(jù)是不同的, 則為那些操作器實(shí)例生成的代碼(以及簽名)也是不同的。在一個(gè)實(shí)施例中,全文(infull) 比較簽名,并且必須按順序匹配到各個(gè)位以便發(fā)現(xiàn)匹配。如果方法300在步驟310斷定提出的操作器實(shí)例和當(dāng)前操作器實(shí)例的簽名不匹 配,則方法300進(jìn)到步驟312,并且重新生成用于操作器實(shí)例的代碼(S卩,根據(jù)操作器實(shí)例的 提出的版本生成代碼)。方法300然后在步驟316中終止之前存儲(chǔ)重新生成的代碼和簽名 (例如,在圖2的簽名數(shù)據(jù)庫(kù)208中)??商娲兀绻椒?00在步驟310斷定提出的操作器實(shí)例和當(dāng)前操作器實(shí)例的簽名匹配,則方法300進(jìn)到步驟314,并且在步驟316中終止之前確定用于操作器實(shí)例的代 碼不需要重新生成(即,操作器實(shí)例的提出的版本與操作器實(shí)例的當(dāng)前版本相同)。從而,方法300避免為沒(méi)有從應(yīng)用的之前版本改變的操作器實(shí)例不必要的重新生 成代碼。相同的操作器實(shí)例應(yīng)該共享相同的代碼。例如,考慮以下高級(jí)代碼,其創(chuàng)建在表達(dá) 式1和表達(dá)式2中描述的程序段的31個(gè)實(shí)例。for_begin@day 1 to day 31 # for each daystream TradeFilteriday(ticker:String, myvwap:Float, volume:Float): = Functor (TradeQuoteiday) [ttype =,,Trade,,& volume > 0. 0]{myvwap: = price 氺 volume}stream QuoteFilteriday(ticker:String, askprice:Float, asksize:Float): = Functor (TradeQuote) [ttype =,,Quote,,& askprice > 0. 0] {}for_end(表達(dá)式 3)根據(jù)方法300,有利的是避免為表達(dá)式3中的62(即,31乘2)個(gè)操作器實(shí)例重新 生成代碼,而是僅為兩個(gè)操作器實(shí)例重新生成代碼(因?yàn)榻M件的相同組將重新用于31天的
每一天)。方法300的一個(gè)值得注意的例外是其中用于操作器類型的代碼生成器已經(jīng)改變 (例如,由于高級(jí)語(yǔ)言編譯器的新版本的可用性)的情況。在這種情況下,即使操作器實(shí) 例的新版本和操作器實(shí)例的當(dāng)前版本的簽名匹配,也仍必須重新生成用于操作器實(shí)例的代 碼??梢允褂梦募r(shí)間戳檢測(cè)代碼生成器中的改變。例如,如果已經(jīng)比最后生成的代碼更 近地修改代碼生成器,則建立工具可以重新生成代碼而不用檢查操作器實(shí)例的簽名。方法300的基于簽名的技術(shù)還可以用于避免當(dāng)基于組件的應(yīng)用包含重復(fù)的操作 器實(shí)例時(shí)的不必要的代碼的重新生成和重新編碼。如上所討論的,為每個(gè)操作器實(shí)例生成 簽名,并且為每個(gè)唯一簽名調(diào)用一次相應(yīng)的代碼生成器。因此,共享相同簽名的操作器實(shí)例 變?yōu)橄嗤僮髌黝愋偷膶?shí)例,并且共享相同的代碼。共享用于操作器實(shí)例的代碼依次可以 通過(guò)避免不必要的代碼生成顯著地減少編譯時(shí)間。然而,在操作器實(shí)例之間的代碼共享在一些情況下可能過(guò)于嚴(yán)格,因?yàn)椴荒苋〉?操作器實(shí)例之間的相似的全部?jī)?yōu)點(diǎn)。例如,考慮以下代碼引用(excerpt),其中在此情況下, 用于將從文件輸入的數(shù)據(jù)轉(zhuǎn)換為要流出的消息的大量源操作器的配置中的小改變導(dǎo)致過(guò) 度的代碼生成for_begin@day 1 to day 3 # for each daystream TradeFilteriday(ticker:String, myvwap:Float, volume:Float): = Source ()[file://taq_data_+toString(iday), binformat]{}for_end(表達(dá)式 4)具體地,為每個(gè)操作器實(shí)例生成操作器實(shí)例代碼的不同編程語(yǔ)言(例如,C或C++ 編程語(yǔ)言)實(shí)現(xiàn)。例如,參照表達(dá)式4的代碼引用,注意到每個(gè)源操作器從由不同的統(tǒng)一資 源標(biāo)識(shí)符(URI)指定的文件讀取數(shù)據(jù),該URI在基于傳統(tǒng)技術(shù)的實(shí)現(xiàn)中將被嵌入生成的代 碼中,使得為操作器的不同實(shí)例生成的代碼稍稍不同。因此,本發(fā)明的實(shí)施例進(jìn)一步尋求避免當(dāng)應(yīng)用包含重復(fù)的操作器實(shí)例時(shí)的不必要的代碼重新生成,所述重復(fù)的操作器實(shí)例僅在依賴于編譯時(shí)間已知的常數(shù)的參數(shù)配置不 同。參數(shù)配置中的編譯時(shí)間常數(shù)可以轉(zhuǎn)換為當(dāng)操作器實(shí)例采運(yùn)行時(shí)間初始化時(shí)要由操作器 實(shí)例加載的變量。例如,表達(dá)式4中的文件名稱可以通過(guò)在生成的代碼中包括額外邏輯以 便從操作器實(shí)例的變量提取文件名稱,轉(zhuǎn)換為操作器實(shí)例的變量。以此方式,表達(dá)式4中的 所有源操作器實(shí)例可以共享代碼,但是可以在運(yùn)行時(shí)間提供不同變量,因?yàn)椴僮髌魈幚磉?輯本身保持不變。在一個(gè)實(shí)施例中,該代碼共享技術(shù)應(yīng)用于部分恒定的操作器參數(shù),只要可變(非 恒定)參數(shù)匹配不同的操作器實(shí)例。在一個(gè)實(shí)施例中,從操作器實(shí)例的簽名排除編譯時(shí)間 常數(shù)(上面討論的),即使它們是操作器實(shí)例的元數(shù)據(jù)的部分,因?yàn)楫?dāng)如圖3所示進(jìn)行簽名 比較時(shí),它們觸發(fā)重新編譯。即使當(dāng)多個(gè)操作器實(shí)例是相互的精確副本時(shí),操作器實(shí)例的連接的差別也可能導(dǎo) 致生成的代碼的改變。例如,連接信息可以變?yōu)椴僮髌鲗?shí)例配置的部分。例如,考慮以下高 級(jí)代碼stream TradeFilterl (tickerString, myvwap:Float, volume:Float): = Functor (QuotesA) [ttype =,,Trade,,& volume > 0. 0] {}stream TradeFilter2 (ticker: String, myvwap:Float, volume:Float): = Functor (QuotesA, QuotesB) [ttype = "Trade,,& volume > 0. 0] {}(表達(dá)式 5)在表達(dá)式5中,兩個(gè)功能元件操作器實(shí)例是相同的,除了第二功能元件操作器實(shí) 例具有連接到其輸入端口的兩個(gè)流(即,QuotesA和QuotesB),而第一功能元件操作器實(shí)例 僅具有連接到其輸入端口的但個(gè)流(即,QuotesA)。類似地,可以是由兩個(gè)功能元件操作器 實(shí)例生成的輸出流連接到不同數(shù)目的下游操作器的情況。因此,本發(fā)明的實(shí)施例進(jìn)一步尋求避免當(dāng)應(yīng)用包含僅僅它們相互連接方式不同的 重復(fù)操作器實(shí)例時(shí)的不必要的代碼重新生成。在一個(gè)實(shí)施例中,這通過(guò)從容器(container) 代碼分離操作器代碼來(lái)實(shí)現(xiàn)。容器可以容納(host)多個(gè)操作器,并且負(fù)責(zé)建立操作器之間 的連接。類似于操作器實(shí)例,容器實(shí)例也自動(dòng)生成。從操作器圖到容器圖的映射是靈活的。同樣類似于操作器實(shí)例,可以為容器實(shí)例導(dǎo)出簽名以避免不必要的代碼重新生成 和重新編譯。因此,可以通過(guò)在應(yīng)用中采用多個(gè)操作器容納容器的不同實(shí)例來(lái)最小化代碼 的重新生成和重新編譯。要注意,容器代碼通常不像操作器代碼那樣復(fù)雜。例如,圖4是圖示可以適于從本發(fā)明受益的第二示例性基于組件的應(yīng)用400的框 圖。如所圖示的,應(yīng)用400包括通過(guò)流互連的多個(gè)組件或操作器實(shí)例402^4023下文中統(tǒng) 稱為“操作器實(shí)例402”)。同樣如所圖示的,這些操作器實(shí)例402由容器實(shí)例404、406和 ^S1IOSm(下文中統(tǒng)稱為“容器實(shí)例408”)容納。容器實(shí)例404、406和408的每一個(gè)容納 至少一個(gè)操作器實(shí)例402。在一個(gè)實(shí)施例中,所有操作器實(shí)例402以相同方式配置,因此共享代碼。此外,如 所圖示的,存在m個(gè)容器實(shí)例408,它們?cè)趦?nèi)部連接和從而容納的操作器實(shí)例402的方面是 相同的。在示例性應(yīng)用400的環(huán)境下,將僅需要為容器實(shí)例408之一生成代碼,并且該代碼 然后可以對(duì)所有m個(gè)容器實(shí)例408共享。本發(fā)明的實(shí)施例進(jìn)一步尋求當(dāng)應(yīng)用包含重復(fù)容器實(shí)例時(shí)避免不必要的代碼生成,
9所述重復(fù)容器實(shí)例包含以相同方式連接的相同操作器實(shí)例。在一個(gè)實(shí)施例中,這以類似于 之前在此描述的解決方式的方式實(shí)現(xiàn)。具體地,為每個(gè)容器實(shí)例導(dǎo)出簽名,其中用于容器實(shí) 例的簽名捕獲容器實(shí)例的內(nèi)連接拓?fù)湟约坝纱巳菁{的操作器實(shí)例的簽名。以此方式,具有 相同配置的容器實(shí)例可以共享代碼。圖5是使用通用計(jì)算設(shè)備500實(shí)現(xiàn)的代碼生成方法的高級(jí)框圖。在一個(gè)實(shí)施例中, 通用計(jì)算設(shè)備500包括處理器502、存儲(chǔ)器504、代碼生成模塊505和各種輸入/輸出(I/O) 設(shè)備506,如顯示器、鍵盤、鼠標(biāo)、觸筆(stylus)、無(wú)線網(wǎng)絡(luò)接入卡等。在一個(gè)實(shí)施例中,至少 一個(gè)I/O設(shè)備是存儲(chǔ)設(shè)備(例如,盤驅(qū)動(dòng)器、光盤驅(qū)動(dòng)器、軟盤驅(qū)動(dòng)器)。應(yīng)該理解,代碼生 成模塊505可以實(shí)現(xiàn)為物理設(shè)備或子系統(tǒng),其通過(guò)連接信道耦合到處理器??商娲兀a生成模塊505可以由一個(gè)或多個(gè)軟件應(yīng)用(或甚至是例如使用專 用集成電路(ASIC)的軟件和硬件的組合)表示,其中在通用計(jì)算設(shè)備500的存儲(chǔ)器504中, 軟件從存儲(chǔ)介質(zhì)(例如I/O設(shè)備506)加載并且由處理器502操作。因此,在一個(gè)實(shí)施例 中,如在此參照之前的附圖描述的用于為基于組件的應(yīng)用生成代碼的代碼生成模塊505可 以存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)或載體(例如,RAM、磁或光驅(qū)動(dòng)器或盤等)上。應(yīng)該注意,盡管沒(méi)有明確指定,但是在此描述的方法的一個(gè)或多個(gè)步驟可以包括 存儲(chǔ)、顯示和/或輸出步驟,如對(duì)于特定應(yīng)用要求的。換句話說(shuō),在方法中討論的任何數(shù)據(jù)、 記錄、字段和/或中間結(jié)果可以存儲(chǔ)、顯示、和/或輸出到另一設(shè)備,如對(duì)于特定應(yīng)用要求 的。此外,描述確定操作或涉及判定的附圖中的步驟或塊不必要求確定操作的兩個(gè)分支實(shí) 踐。換句話說(shuō),確定操作的分支之一可以視為可選步驟。盡管前述貫注于本發(fā)明的實(shí)施例,但是可以設(shè)計(jì)本發(fā)明的其它和進(jìn)一步的實(shí)施例 而不背離其基本范圍。在此展現(xiàn)的各種實(shí)施例或其各部分可以組合來(lái)創(chuàng)建進(jìn)一步的實(shí)施 例。此外,如頂、側(cè)、底、前、后等的術(shù)語(yǔ)是相對(duì)或位置術(shù)語(yǔ),并且相對(duì)于圖中圖示的示例性實(shí) 施例使用,并且如此的這些術(shù)語(yǔ)可以互換。
權(quán)利要求
一種用于為基于組件的應(yīng)用構(gòu)造可執(zhí)行代碼的方法,所述方法包括通過(guò)在計(jì)算機(jī)系統(tǒng)中執(zhí)行的編譯器接收編譯用于基于組件的應(yīng)用的源代碼的請(qǐng)求,其中所述請(qǐng)求識(shí)別所述源代碼,并且其中所述源代碼包括多個(gè)源代碼組件,所述多個(gè)源代碼組件的每一個(gè)實(shí)現(xiàn)所述應(yīng)用的不同組件;以及通過(guò)所述編譯器執(zhí)行用于多個(gè)源代碼組件的每個(gè)源代碼組件的一系列步驟,所述一系列步驟包括為所述源代碼組件導(dǎo)出導(dǎo)出的簽名;檢索對(duì)應(yīng)于用于所述源代碼組件的可執(zhí)行代碼的當(dāng)前可用實(shí)例的存儲(chǔ)的簽名;比較導(dǎo)出的簽名和存儲(chǔ)的簽名;響應(yīng)于導(dǎo)出的簽名不匹配存儲(chǔ)的簽名,將所述源代碼組件編譯為可執(zhí)行代碼;以及當(dāng)導(dǎo)出的簽名匹配存儲(chǔ)的簽名時(shí),從庫(kù)中獲得用于所述源代碼組件的可執(zhí)行代碼。
2.如權(quán)利要求1所述的方法,其中所述導(dǎo)出的簽名從與所述源代碼相關(guān)聯(lián)的元數(shù)據(jù)導(dǎo) 出,并且所述存儲(chǔ)的簽名之前從與源代碼的之前版本相關(guān)聯(lián)的元數(shù)據(jù)導(dǎo)出,從該源代碼的 之前版本生成用于所述源代碼組件的可執(zhí)行代碼的當(dāng)前可用實(shí)例。
3.如權(quán)利要求2所述的方法,其中與所述源代碼相關(guān)聯(lián)的元數(shù)據(jù)捕獲所述源代碼的一 個(gè)或多個(gè)配置參數(shù),并且與源代碼的之前版本相關(guān)聯(lián)的元數(shù)據(jù)捕獲用于所述源代碼組件的 可執(zhí)行代碼的當(dāng)前可用實(shí)例的一個(gè)或多個(gè)配置參數(shù)。
4.如權(quán)利要求3所述的方法,其中所述導(dǎo)出的簽名是捕獲所述源代碼的一個(gè)或多個(gè)配 置參數(shù)的可擴(kuò)展標(biāo)記語(yǔ)言文檔,并且所述存儲(chǔ)的簽名是捕獲源代碼的之前版本的一個(gè)或多 個(gè)配置參數(shù)的可擴(kuò)展標(biāo)記語(yǔ)言文檔。
5.如權(quán)利要求3所述的方法,其中與所述源代碼相關(guān)聯(lián)的元數(shù)據(jù)中的一個(gè)或多個(gè)編譯 時(shí)間可估計(jì)常數(shù)表示用在運(yùn)行時(shí)間加載的位置保持器代替。
6.如權(quán)利要求1所述的方法,其中所述存儲(chǔ)的簽名與庫(kù)中用于所述源代碼組件的可執(zhí) 行代碼的當(dāng)前可用實(shí)例相關(guān)聯(lián)。
7.如權(quán)利要求6所述的方法,其中所述庫(kù)保持用于所述多個(gè)源代碼組件中的每個(gè)源代 碼組件的代碼和簽名。
8.如權(quán)利要求1所述的方法,其中所述源代碼組件是對(duì)輸入數(shù)據(jù)操作的操作器。
9.如權(quán)利要求1所述的方法,其中所述源代碼組件是容納對(duì)輸入數(shù)據(jù)操作的一個(gè)或多 個(gè)操作器的容器。
10.一種用于為基于組件的應(yīng)用構(gòu)造可執(zhí)行代碼的系統(tǒng),所述系統(tǒng)包括用于實(shí)現(xiàn)權(quán)利 要求1-9的任一的方法的部件。
11.一種用于為基于組件的應(yīng)用構(gòu)造可執(zhí)行代碼的編譯器,所述編譯器包括用于接收編譯用于基于組件的應(yīng)用的源代碼的請(qǐng)求的輸入,其中所述請(qǐng)求識(shí)別所述源 代碼,并且其中所述源代碼包括多個(gè)源代碼組件,所述多個(gè)源代碼組件的每一個(gè)實(shí)現(xiàn)所述 應(yīng)用的不同組件;以及耦合到輸入的多個(gè)元件,用于執(zhí)行用于多個(gè)源代碼組件的每個(gè)源代碼組件的一系列步 驟,所述多個(gè)元件包括簽名比較器,用于為所述源代碼組件導(dǎo)出導(dǎo)出的簽名;簽名數(shù)據(jù)庫(kù),用于存儲(chǔ)對(duì)應(yīng)于用于所述源代碼組件的可執(zhí)行代碼的之前生成實(shí)例的存儲(chǔ)的簽名;以及代碼生成器,用于當(dāng)簽名不匹配存儲(chǔ)的簽名時(shí),將所述源代碼組件編譯為可執(zhí)行代碼, 以及當(dāng)簽名匹配存儲(chǔ)的簽名時(shí),從庫(kù)中獲得用于所述源代碼組件的可執(zhí)行代碼。
12.如權(quán)利要求11所述的編譯器,其中所述簽名比較處理器配置為從所述源代碼的一 個(gè)或多個(gè)配置參數(shù)導(dǎo)出所述導(dǎo)出的簽名。
13.如權(quán)利要求11所述的編譯器,其中所述代碼生成器對(duì)應(yīng)于所述源代碼組件的類型。
14.如權(quán)利要求11所述的編譯器,其中所述導(dǎo)出的簽名是捕獲所述源代碼組件的一個(gè) 或多個(gè)配置參數(shù)的可擴(kuò)展標(biāo)記語(yǔ)言文檔。
15.如權(quán)利要求11所述的編譯器,其中所述導(dǎo)出的簽名是從與所述源代碼組件相關(guān)聯(lián) 的元數(shù)據(jù)導(dǎo)出的。
全文摘要
用于為基于組件的應(yīng)用構(gòu)造可執(zhí)行代碼的方法的一個(gè)實(shí)施例包括接收編譯用于基于組件的應(yīng)用的源代碼的請(qǐng)求,其中請(qǐng)求識(shí)別源代碼,并且其中源代碼包括多個(gè)源代碼組件,源代碼組件的每一個(gè)實(shí)現(xiàn)應(yīng)用的不同組件;以及執(zhí)行用于每個(gè)源代碼組件的一系列步驟,其中所述一系列步驟包括為源代碼組件導(dǎo)出導(dǎo)出的簽名;檢索對(duì)應(yīng)于用于源代碼組件的可執(zhí)行代碼的當(dāng)前可用實(shí)例的存儲(chǔ)的簽名;比較導(dǎo)出的簽名和存儲(chǔ)的簽名;當(dāng)導(dǎo)出的簽名不匹配存儲(chǔ)的簽名時(shí),將源代碼組件編譯為可執(zhí)行代碼;以及當(dāng)導(dǎo)出的簽名匹配存儲(chǔ)的簽名時(shí),從庫(kù)中獲得用于源代碼組件的可執(zhí)行代碼。
文檔編號(hào)G06F9/44GK101887365SQ20101017955
公開(kāi)日2010年11月17日 申請(qǐng)日期2010年5月17日 優(yōu)先權(quán)日2009年5月15日
發(fā)明者亨里克·安德雷德, 侯銳, 吳坤龍, 布格拉·格迪克, 王華勇 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
永昌县| 屏山县| 海兴县| 边坝县| 大冶市| 汤阴县| 济源市| 宽城| 罗山县| 紫金县| 营口市| 阳新县| 正阳县| 吉林市| 房产| 肇东市| 饶河县| 中超| 大安市| 秭归县| 仁布县| 崇礼县| 九寨沟县| 虎林市| 峨边| 白朗县| 宣城市| 和平县| 明星| 桂东县| 泉州市| 深州市| 金溪县| 宜兴市| 民权县| 峨眉山市| 万盛区| 清新县| 宁都县| 宜宾市| 阳江市|