計算機(jī)系統(tǒng)當(dāng)前被廣泛應(yīng)用。一些此類系統(tǒng)在它們被部署在終端用戶的場所之前被(某些在很大程度上)定制。作為示例,一些此類計算機(jī)系統(tǒng)包括業(yè)務(wù)系統(tǒng),諸如顧客關(guān)系管理(CRM)系統(tǒng)、企業(yè)資源規(guī)劃(ERP)系統(tǒng)、業(yè)務(wù)線(LOB)系統(tǒng)等。在這些類型的系統(tǒng)中,用戶或顧客首先購買通用業(yè)務(wù)系統(tǒng),且用戶或顧客通常對該通用業(yè)務(wù)系統(tǒng)進(jìn)行定制、擴(kuò)展或其它修改,以便獲得其自己的定制部署。
通常,這樣的定制已經(jīng)要么通過對源代碼的直接修改要么通過使原始軟件的作者將許多鉤點(diǎn)(hook-point)插入到軟件源代碼中而被提供。
對源代碼的直接修改為定制提供了最大的靈活性。通過這樣的修改,可以對軟件做出任意修改。當(dāng)原始軟件需要被修改時,例如當(dāng)需要更新或補(bǔ)丁時,這種方案的限制變得明顯。在這樣的實例中,對原始源代碼的修改可能不再與各種定制互操作。這樣,開發(fā)者必須返回到修改并仔細(xì)地將每個先前生成的定制對接或修改到經(jīng)更新/打補(bǔ)丁的源代碼。在大多數(shù)情況下,這種手動且乏味的過程往往需要顯著的開發(fā)者時間并因此是非常昂貴的。
在原始源代碼中提供許多鉤點(diǎn)是在其中可以實現(xiàn)定制的另一種方式。原始應(yīng)用的作者可以將許多鉤點(diǎn)插入在做出呼出的地方。這被稱為“事件”。在事件中,原始作者將在源代碼中所定義的各位置處插入一個或多個呼出。每個這樣的呼出將調(diào)出傳遞某些預(yù)定義參數(shù)的指定事件。另外,在運(yùn)行時,呼出將檢查以查明是否存在任何對事件的訂閱者。如果存在對事件的訂閱者,那么訂閱者代碼被加載并被執(zhí)行。標(biāo)準(zhǔn)事件的一個限制是軟件的原始作者可能沒有在代碼中的精確位置處提供需要應(yīng)用定制的開發(fā)者所需要的鉤點(diǎn)。而且,原始作者將定義呼出的合約或參數(shù)。在一些實例中,如果呼出的合約或參數(shù)被原始作者通過升級或補(bǔ)丁改變,則依賴于所述呼出的定制可能失敗。
概述
提供了一種修改源代碼的編程單元的執(zhí)行行為的計算機(jī)實現(xiàn)的方法。所述方法包括加載源代碼的編程單元并確定是否針對該編程單元定義了至少一個定制。至少一個定制基于所述定制的先決條件是否被滿足而被選擇性地執(zhí)行。
提供本概述以便以簡化的形式介紹以下在詳細(xì)描述中進(jìn)一步描述的一些概念。本概述并非旨在標(biāo)識出要求保護(hù)的主題的關(guān)鍵特征或必要特征,亦非旨在用作輔助確定要求保護(hù)的主題的范圍。所要求保護(hù)的主題不限于解決在背景中提及的任何或所有缺點(diǎn)的實現(xiàn)。
附圖簡述
圖1是根據(jù)本發(fā)明一實施例的在其中開發(fā)者提供了與原始源代碼有關(guān)的定制的環(huán)境的圖示。
圖2是通過執(zhí)行流水線來執(zhí)行軟件應(yīng)用的處理器的圖示。
圖3是根據(jù)本發(fā)明的一個實施例的執(zhí)行軟件應(yīng)用的計算機(jī)實現(xiàn)的方法。
圖4是根據(jù)本發(fā)明的一個實施例的定義訂閱者動態(tài)事件的方法。
圖5示出在其中本發(fā)明的實施例是特別有用的示例性架構(gòu)的框圖。
圖6示出在其中本發(fā)明的實施例是有用的云計算架構(gòu)。
圖7-10示出在其中本發(fā)明的實施例是有用的各種移動設(shè)備。
圖11是一個說明性計算環(huán)境的框圖。
詳細(xì)描述
本發(fā)明的各實施例通常允許將任意定制應(yīng)用到代碼的基本上任意的可執(zhí)行單元,包括源代碼的方法、函數(shù)、模塊和甚至一個或多個行,而無需修改原始源代碼。根據(jù)在此所述的實施例,執(zhí)行原始源代碼的平臺將提供“動態(tài)鉤”,所述動態(tài)鉤允許生成與原始源代碼有關(guān)的定制的開發(fā)者訂閱該開發(fā)者定義的一個或多個事件。只要所定義的事件的先決條件仍然有效,就可以在不影響定制的操作的情況下提供來自軟件制造商的對原始源代碼的改變,例如更新和/或補(bǔ)丁。
圖1是根據(jù)本發(fā)明一實施例的在其中開發(fā)者14提供了與原始源代碼12有關(guān)的定制18的環(huán)境的圖示。在環(huán)境10中,已經(jīng)從源代碼發(fā)布者,例如微軟公司,獲得了源代碼12。此處使用的“源代碼”旨在意指被編譯或匯編到計算機(jī)可執(zhí)行程序中的命令的文本列表。源代碼可以以許多已知的或?qū)黹_發(fā)的編程語言中的任意編程語言來提供。通常,源代碼將由軟件產(chǎn)品的一個或多個作者逐行地輸入。
如上所述,許多軟件產(chǎn)品旨在在被終端用戶部署之前就被定制。這樣的軟件產(chǎn)品的一個示例是企業(yè)資源計劃系統(tǒng)。然而,無論何時期望在無需改變軟件產(chǎn)品的源代碼的情況下改變軟件產(chǎn)品的行為,本發(fā)明的各實施例都是可應(yīng)用的。在圖1示出的示例中,開發(fā)者14具有對源代碼12的訪問,如由虛線16所示。這樣的訪問可以是通過任意合適的方式的,包括在線訪問或離線訪問(例如源代碼的硬拷貝)。源代碼可以被用作參考。為了定制軟件產(chǎn)品,開發(fā)者14查看源代碼12并生成一個或多個定制18。這些定制18是動態(tài)事件定義的形式,如將在下面詳細(xì)描述的。定制18被提供給執(zhí)行平臺20,該執(zhí)行平臺將通常已經(jīng)具有原始、非改動狀態(tài)的源代碼12。執(zhí)行平臺20是硬件、軟件或其組合的任意合適的安排,所述安排能夠接收源代碼、基于源代碼生成機(jī)器可執(zhí)行代碼并執(zhí)行所述機(jī)器可執(zhí)行代碼。這樣,執(zhí)行平臺20可以是單個個人計算機(jī)、在企業(yè)中工作的一組服務(wù)器、設(shè)備的單核或在云計算環(huán)境中工作的一大組服務(wù)器。執(zhí)行平臺20可以包括一個或多個處理器24以及合適的存儲組件26以支持編程編譯和/或執(zhí)行。
執(zhí)行平臺20將原始源代碼12與定制18一起執(zhí)行,以向與執(zhí)行平臺20交互的一個或多個客戶機(jī)22提供經(jīng)定制的軟件操作。在一個示例中,客戶機(jī)22是通過通信鏈接28在操作上耦合到執(zhí)行平臺20的計算機(jī),以便允許客戶機(jī)22與由執(zhí)行平臺20所執(zhí)行的軟件產(chǎn)品交互。鏈接28可以包括任何合適的通信鏈接,包括經(jīng)由LAN或WAN的有線或無線通信。
圖2是通過執(zhí)行流水線30執(zhí)行軟件應(yīng)用的執(zhí)行平臺的處理器的圖示。雖然,流水線30被示為包括編程源單元1··N的線性流水線,但提供這樣的簡化是說明編程執(zhí)行通常通過命令序列來步進(jìn)。在圖2中所示的示例中,編程執(zhí)行當(dāng)前在單元5上,如指針32所示。一旦單元5的執(zhí)行完成,處理器24將開始執(zhí)行單元6。然而,在這樣的執(zhí)行之前,處理器將確定是否任何定制已經(jīng)相對于編程單元6被附加或定義。借助于其定義,這樣的定制將具有指定它是應(yīng)該在單元6之前、取代單元6、或在單元6之后運(yùn)行的指示因此,執(zhí)行平臺20將根據(jù)定制定義,在單元6之前、取代單元6、或在單元6之后執(zhí)行與定制對應(yīng)的代碼。一旦編程單元6和任何相關(guān)聯(lián)的定制已經(jīng)執(zhí)行,執(zhí)行平臺就移至編程單元7。如此處所使用的,編程單元旨在意指任何一個或多個可執(zhí)行代碼行,其行可以包括例如一個方法。因此,由于定制是在任意編程單元之前、取代任意編程單元、或在任意編程單元之后注入,本發(fā)明的各實施例提供了開發(fā)者可以在源代碼中的任意點(diǎn)定義“鉤”的顯著的靈活性。
圖3是根據(jù)本發(fā)明的一個實施例的執(zhí)行軟件應(yīng)用的方法。方法40在框42開始,在此處(在圖1和2中示出的)處理器24加載方法或編程單元。接著,在框44,處理器24檢查以查明是否存在與在框42處加載的方法或編程單元相關(guān)聯(lián)的任何定制。如果是,則控制傳遞到框46,在此處與加載的方法或單元相關(guān)聯(lián)的定制被處理器24加載。接著,基于定制的定義,先于在框42處加載方法或單元、取代在框42處加載方法或單元,或后于在框42處加載方法或單元,處理器24在框48處執(zhí)行定制。在定制沒有取代加載的方法或單元的示例中,如由所述定制所定義的,在執(zhí)行所述定制之前或之后所述加載的方法或單元也由處理器24在框48處執(zhí)行??刂齐S后傳遞至框50,在此處下一編程單元/方法被加載。如在圖3中所示,如果給定的方法或編程單元不具有相關(guān)聯(lián)的定制,則控制從判定框44傳遞至框50。方法40將繼續(xù)循環(huán)直到程序執(zhí)行被停止或完成。
圖4是根據(jù)本發(fā)明的一個實施例的定義動態(tài)事件的方法。方法60在框62處開始,在此處,開發(fā)者標(biāo)識源代碼的定制將要與其相關(guān)聯(lián)的特定單元。源代碼的所述單元可以是源代碼的函數(shù)、方法、模塊或個體行。源代碼的所述單元的標(biāo)識可以通過函數(shù)或模塊的名字,或在源代碼的個體行的情況下,是源代碼的在所選行之前的一個或多個行的標(biāo)識以及源代碼的在源代碼的所選行之后的一個或多個行的標(biāo)識。接著,在框64,開發(fā)者選擇所述定制將如何相對于原始源代碼來執(zhí)行。例如,定制可以在66之前、取代68,或在70之后執(zhí)行所標(biāo)識的源代碼。而且,當(dāng)定制取代所標(biāo)識的源代碼執(zhí)行時,如果需要的話,所述定制可以將所標(biāo)識的域代碼作為來自定制的子調(diào)用來運(yùn)行。另外,如在框72處所指示的,還可以構(gòu)想其它執(zhí)行序列指示符。例如,在多個定制將要在源代碼的所選單元之前被執(zhí)行的情形中,一個定制可以被指示為“絕對最先”或“絕對最后”。接著,在框74,開發(fā)者指示定制的范圍。該范圍指示將通常允許定制能夠訪問源代碼的所選單元內(nèi)的變量和其它信息。在框76,開發(fā)者可以提供使用在源代碼的所選單元內(nèi)的變量和其它信息中的一些或全部的代碼。這允許原文在所有方面改變都改變,而所訂閱的變量保持不變。而且,到變量“按名字(by name)”的鏈接為原始開發(fā)者提供了一種故意中斷定制可能具有的任何合約的途徑。以此方式,開發(fā)者可以簡單地改變變量的名字,這將要求依賴于原始變量名的定制將需要被重新訪問。最后,在框78,定制被保存并提供給執(zhí)行平臺以用于以原始、未經(jīng)修改的源代碼執(zhí)行。
在下面的示例中,表1提供了計算給定訂單的折扣作為下訂單的過程的部分的某種偽代碼:
表1
在表1中闡明的示例中,開發(fā)者(以提供對10%的折扣計算的改變?yōu)槿蝿?wù))可能希望提供定制。例如,如果總量大于2000,則開發(fā)者可能需要加入額外的5%折扣。為了在數(shù)量超過2000時提供15%折扣,或如果數(shù)量大于2000提供原始折扣的150%,開發(fā)者可以定義如表2所闡述的定制。該定制允許在表1中所闡述的原始代碼的行為被修改,而無需改變?nèi)魏卧即a。
表2
在表2中的偽代碼與表1中由具有原始方法的名字的HookMethod(鉤方法)定義所提供的原始CalculateDiscount(計算折扣)方法相關(guān)聯(lián)。該HookMethod在元數(shù)據(jù)中被定義。在所示的示例中,定義是使用C#樣式句法中的屬性。然而,這只是示例并且可以使用任何其他合適的樣式。原始方法與表2的偽代碼的關(guān)聯(lián)性,通知執(zhí)行平臺,表2的代碼與表1中闡述的原始方法相關(guān)聯(lián)。另外,通過設(shè)置“Run=AfterOriginal”,執(zhí)行平臺將在表1的代碼被執(zhí)行之后再執(zhí)行表2的代碼。MyOwnCalculateDiscount(我自己計算的折扣)的聲明列出了需要從原始方法中提出的參數(shù)、行。另外,MyOwnCalculateDiscount設(shè)置范圍“OriginalScope_org”,使得定制將能夠訪問來自原始方法的參數(shù)和變量。_org的所有使用將被執(zhí)行平臺跟蹤,并且在編譯之后,編譯器將在元數(shù)據(jù)中存儲對MyOwnCalculateDiscount將通過CalculateDiscount順序地被調(diào)用并且MyOwnCalculateDiscount將訪問行(參數(shù))、數(shù)量(作為本地變量)以及ReturnValue(原始返回值)的指示。
在運(yùn)行時,執(zhí)行平臺20現(xiàn)在將在從原始CalculateDiscount返回之前調(diào)用MyOwnCalculateDiscount,允許MyOwnCalculateDiscount提供基本上任何期望的經(jīng)定制的功能。_org范圍變量將實際上指示原始變量。
在原始代碼被更新、打補(bǔ)丁或由原始軟件發(fā)布者簡單改變的情況下,本發(fā)明的各實施例是特別有用的。例如,在下面的表3中,原始方法CalculateDiscount已經(jīng)被修改為包括customer(客戶)和date(日期)信息。
表3
借助于所存儲的與MyOwnCalculateDiscount有關(guān)的元數(shù)據(jù),顯然,在經(jīng)改變的源代碼中仍然滿足MyOwnCalculateDiscount的先決條件。具體來說,方法CalculateDiscount仍然存在,并且在其參數(shù)中它仍然具有“Lines[]lines”參數(shù)以及名為數(shù)量的本地變量。這樣,對源代碼的改變將不會影響由開發(fā)者為定制定義的“合約”。MyOwnCalculateDiscount將不會知曉也不會使用新的參數(shù)Customer或Date。然而,MyOwnCalculateDiscount不將這樣的參數(shù)作為其合約的部分來列出。這樣,MyOwnCalculateDiscount將繼續(xù)運(yùn)行對數(shù)量和返回值的適當(dāng)操作。然而,如果在合約中由開發(fā)者所指定的任意項(例如方法的名字、行參數(shù)或數(shù)量變量)在經(jīng)更新的源代碼中被改變或刪除,那么在應(yīng)用定制時合約將中斷并導(dǎo)致錯誤。
在MyOwnCalculateDiscount中特別注意的是所述方法是用“Lines[]lines”參數(shù)定義的,但所述參數(shù)沒有被MyOwnCalculateDiscount使用的事實。然而,通過開發(fā)者仍然要求“Lines[]lines”,它已經(jīng)成為定制的合約的部分并因此需要成為原始簽名的部分。這在開發(fā)者通過這么做可以依賴于變量的情況下特別有利,盡管定制不需要它。換句話說,如果CalculateDiscount方法被改變使得在原始方法中不再需要所述行,定制應(yīng)該中斷(即通過應(yīng)用定制錯誤來通知),使得開發(fā)者可以檢查定制以查明代碼是否仍然有效。這允許開發(fā)者將合約定義為如所期望的那樣細(xì)化(接近)原始代碼。在合約中要求的細(xì)節(jié)越多,當(dāng)原始代碼被改變時中斷的幾率越大。反之也是正確的。具體來說,如果對原始代碼的更新的開發(fā)者希望確保在行上操作的所有定制被要求重新訪問它們的定制,開發(fā)者可以改變變量的名字,這將中斷合約。
(下述)表4示出當(dāng)CalculateDiscount被調(diào)用時被執(zhí)行的某種偽代碼的示例。
表4
如可見,執(zhí)行平臺20將代碼注入以檢查正被調(diào)用的方法是否已經(jīng)被掛鉤并且如果是則將把所有相關(guān)的信息傳遞給機(jī)制,所述機(jī)制過濾所述信息并最終調(diào)用被掛鉤到所述方法的定制。在表4中示出的示例僅僅是出于說明的目的被提供,在實際實現(xiàn)中,附加優(yōu)化可以被使用并且“ReplaceOriginal(替代原始)”機(jī)制也可以被提供。
在上述示例中提供的所有偽代碼僅僅出于說明目的。本發(fā)明的各實施例可以應(yīng)用于使用源代碼的任意編程語言。在一些示例中,本發(fā)明的各實施例提供了一種元數(shù)據(jù)驅(qū)動的掛鉤機(jī)制,其中訂閱者定義了原始源代碼的合約對作者(contract vs.an author)。只要合約可被履行,就可以對底層源代碼做出升級和其它改變,而無需中斷定制。另外,簡單地通過查閱元數(shù)據(jù)和源代碼就確定這樣的合約是否可以被履行是可能的。這樣,在中斷或其它異常可以被確定之前,代碼不需要被運(yùn)行。
如上所闡述的,存在定制可以被掛鉤到原始源代碼的許多方式。Run=AfterOriginal指示告知執(zhí)行平臺20原始源代碼應(yīng)該首選運(yùn)行,隨后是定制。一種替代是Run=BeforeOriginal,這將允許定制在將控制傳遞至原始方法之前改變?nèi)我怅U述和可能的類變量。還有另一個替代為Run=ReplaceOriginal,這將取消對原始源代碼的調(diào)用并僅僅調(diào)用定制。如果開發(fā)者希望覆蓋整個方法,則可以使用后者。指示Run=ReplaceOriginal要求執(zhí)行框架20在中斷時跟蹤對原始代碼做出的改變,因為在源代碼升級或改變之后所述定制現(xiàn)在正在移除“未知的”代碼。另外,當(dāng)使用ReplaceOriginal時,_org變量應(yīng)該包含CallOriginal方法,這樣如果需要的話可以對原始方法做出調(diào)用,在此之后定制將再次獲得控制和完成其工作。
在此所述的在定制中使用的代碼的特殊之處在于所述代碼所使用的所有構(gòu)造在需要時都是“間接”針對底層實變量。這當(dāng)中的一些可以在編譯時發(fā)生而一些可以在運(yùn)行時發(fā)生,例如定制的代碼可以訪問項目表,而無需具有關(guān)于這樣的表的所有字段的信息。然而,只要項目表具有由定制所使用的字段,所述定制就將正確地運(yùn)作。
可以理解的是,本發(fā)明的各實施例是可應(yīng)用于各種各樣的計算環(huán)境的。下面是在其中本發(fā)明的實施例可以是特別有利的計算環(huán)境的一些示例。
圖5示出其中本文中描述的各實施例是有用的一個示例性架構(gòu)的框圖。架構(gòu)100包括顧客業(yè)務(wù)系統(tǒng)101(其可以是在場系統(tǒng)、基于云的系統(tǒng)、或另一系統(tǒng))。業(yè)務(wù)系統(tǒng)101可被用戶通過由業(yè)務(wù)系統(tǒng)101或由用戶設(shè)備116生成的用戶界面115來訪問。在一個實施例中,用戶界面115具有用戶輸入機(jī)制117,用戶114可致動該用戶輸入機(jī)制以便操縱業(yè)務(wù)系統(tǒng)101。
顧客業(yè)務(wù)系統(tǒng)101解說性地包括處理器102、數(shù)據(jù)存儲104、用戶界面組件105、更新安裝器組件106、沖突解決組件119和業(yè)務(wù)過程組件121。數(shù)據(jù)存儲104解說性地包括數(shù)據(jù)108、應(yīng)用110、描述業(yè)務(wù)過程112的信息、描述工作流114的信息以及其它項107。在一個實施例中,應(yīng)用110包括被用來運(yùn)行業(yè)務(wù)系統(tǒng)101中的業(yè)務(wù)過程112和工作流114的業(yè)務(wù)邏輯。應(yīng)用110解說性地對數(shù)據(jù)108操作,該數(shù)據(jù)可包括表示業(yè)務(wù)系統(tǒng)101中的項的實體。從而,應(yīng)用110可包括總分類賬應(yīng)用、倉儲應(yīng)用、允許用戶跟蹤業(yè)務(wù)機(jī)會、跟蹤業(yè)務(wù)系統(tǒng)中的銷售或生產(chǎn)的應(yīng)用、或各種其它業(yè)務(wù)應(yīng)用。實體例如包括表示顧客的顧客實體、表示業(yè)務(wù)機(jī)會的機(jī)會實體、表示倉儲項的倉儲實體、表示報價和提議的報價和提議實體等。數(shù)據(jù)108可包括各種其它實體和數(shù)據(jù),且上面提及的那些僅是作為示例提及的。用戶可解說性地訪問顧客業(yè)務(wù)系統(tǒng)101以便執(zhí)行在執(zhí)行采用業(yè)務(wù)系統(tǒng)101的組織的業(yè)務(wù)中被完成的活動、任務(wù)、工作流等。
本討論提到了處理器和服務(wù)器。在一個實施例中,處理器和服務(wù)器包括具有相關(guān)聯(lián)的存儲器和時序電路系統(tǒng)(未分別示出)的計算機(jī)處理器。它們是它們所屬的系統(tǒng)或設(shè)備的功能部分,且由這些系統(tǒng)中的其他組件或項的功能來激活并促成這些功能。
還討論了數(shù)個數(shù)據(jù)存儲。將注意,它們可各自被分解成多個數(shù)據(jù)存儲。它們?nèi)靠晌挥谠L問它們的系統(tǒng)的本地,全部可以是遠(yuǎn)程的,或一些可以在本地而其他在遠(yuǎn)程。本文構(gòu)想了所有這些配置。
同樣,附圖示出了具有歸屬于每一框的功能的多個框。將注意,可以使用更少的框,使得功能由更少的組件來執(zhí)行。同樣,可以使用更多框,其中功能被分布在更多組件之間。
圖6是圖5中所示的架構(gòu)100的框圖,不同之處在于其元件被部署在云計算架構(gòu)500中。術(shù)語“云”、“基于云的系統(tǒng)”、“基于云的架構(gòu)”或類似術(shù)語指代設(shè)備(例如,服務(wù)器計算機(jī)、路由器等)的網(wǎng)絡(luò)。云計算提供了不要求終端用戶知曉交付服務(wù)的系統(tǒng)的物理位置或配置的計算、軟件、數(shù)據(jù)訪問和存儲服務(wù)。在各個實施例中,云計算通過諸如因特網(wǎng)之類的廣域網(wǎng)使用合適的協(xié)議來交付服務(wù)。例如,云計算提供者通過廣域網(wǎng)交付應(yīng)用,并且它們可以通過web瀏覽器或任何其他計算組件被訪問。架構(gòu)100的軟件或組件以及相對應(yīng)的數(shù)據(jù)可被存儲在遠(yuǎn)程位置處的服務(wù)器上。云計算環(huán)境中的計算資源可以被整合在遠(yuǎn)程數(shù)據(jù)中心位置處或者它們可以是分散的。云計算基礎(chǔ)結(jié)構(gòu)可以通過共享數(shù)據(jù)中心來交付服務(wù),即使在用戶看來它們是單個訪問點(diǎn)。因此,在此所述的組件和功能可以從使用云計算架構(gòu)的遠(yuǎn)程位置處的服務(wù)提供者來提供。替代地,它們可以從常規(guī)的服務(wù)器中提供,或者它們可以直接地或以其他方式安裝在客戶端設(shè)備上。
本說明書旨在包括公共云計算和私有云計算兩者。云計算(公共和私有兩者)提供了基本無縫的資源聯(lián)營以及對管理和配置底層硬件基礎(chǔ)結(jié)構(gòu)的降低的需求。
公共云由供應(yīng)商管理,并且通常支持使用同一基礎(chǔ)結(jié)構(gòu)的多個消費(fèi)者。此外,與私有云相反,公共云能夠?qū)⒔K端用戶從管理硬件中釋放出來。私有云可由機(jī)構(gòu)本身管理,并且基礎(chǔ)結(jié)構(gòu)通常不與其他機(jī)構(gòu)共享。該機(jī)構(gòu)在某種程度上仍然維護(hù)著硬件,諸如安裝和維修等。
在圖6中所示的實施例中,一些項與圖5中所示的那些是類似的,并且它們被類似地編號。圖6具體地示出系統(tǒng)101可位于云502(可以是公共的、私有的或者其中某些部分是公共的而某些部分是私有的組合)中。因此,用戶使用客戶機(jī)設(shè)備22通過云502來訪問那些系統(tǒng)。
圖6還描繪了云架構(gòu)的另一實施例。圖6示出還構(gòu)想了架構(gòu)100的某些元素被置于云502中而其他元素沒有被置于云502中。作為示例,數(shù)據(jù)存儲104可被置于云502的外部,并且通過云502來被訪問。無論它們位于哪里,它們都可直接由客戶機(jī)設(shè)備22通過網(wǎng)絡(luò)(廣域網(wǎng)或局域網(wǎng))訪問,它們可由服務(wù)主存在遠(yuǎn)程站點(diǎn)處,或者它們可作為通過云來提供或通過駐留在云中的連接服務(wù)來訪問的服務(wù)。本文構(gòu)想了所有這些架構(gòu)。
還將注意,架構(gòu)100或其部分可被采用在各種各樣不同的設(shè)備上。這些設(shè)備中的某些包括:服務(wù)器、臺式計算機(jī)、膝上型計算機(jī)、平板計算機(jī)、或其他移動設(shè)備,諸如掌上計算機(jī)、蜂窩電話、智能電話、多媒體播放器、個人數(shù)字助理等。
圖7是可被用作其中可部署本發(fā)明的系統(tǒng)(或其部分)的用戶或客戶的手持式設(shè)備216的手持式或移動計算設(shè)備的一個實施例的簡化框圖。圖7-10是手持式或移動設(shè)備的示例。
圖7提供了客戶機(jī)設(shè)備216的組件的總體框圖,該客戶機(jī)設(shè)備216可以運(yùn)行架構(gòu)100的組件或與架構(gòu)100交互。在設(shè)備216中,提供了通信鏈路213,該通信鏈路允許手持設(shè)備與其它計算設(shè)備通信,并且在一些實施例中提供用于諸如通過掃描來自動接收信息的信道。通信鏈路213的示例包括:紅外端口、串行/USB端口、諸如以太網(wǎng)端口之類的電纜網(wǎng)絡(luò)端口、以及允許通過一個或多個通信協(xié)議的通信的無線網(wǎng)絡(luò)端口,所述通信協(xié)議包括作為用于提供對網(wǎng)絡(luò)的蜂窩接入的無線服務(wù)的通用分組無線服務(wù)(GPRS)、LTE、HSPA、HSPA+、以及其他3G和4G無線電協(xié)議、1Xrtt和短消息服務(wù),并包括提供對網(wǎng)絡(luò)的本地?zé)o線連接的802.11和802.11b(WiFi)協(xié)議、和藍(lán)牙協(xié)議。
根據(jù)其他實施例,應(yīng)用或系統(tǒng)被容納在連接到可移動安全數(shù)字(SD)卡接口215的SD卡上。SD卡接口215和通信鏈路213沿總線219與處理器217進(jìn)行通信,該總線219還連接到存儲器221和輸入/輸出(I/O)組件223、以及時鐘225和定位系統(tǒng)227。
在一個實施例中,提供了I/O組件223以促成輸入和輸出操作。針對設(shè)備216的各個實施例的I/O組件223可以包括:輸入組件,比如按鈕、觸摸傳感器、多點(diǎn)觸摸傳感器、光學(xué)或視頻傳感器、語音傳感器、觸摸屏、鄰近傳感器、話筒、傾斜傳感器以及重力開關(guān);以及輸出組件,比如顯示設(shè)備、揚(yáng)聲器和或打印機(jī)端口。也可以使用其他I/O組件223。
時鐘225說明性地包括輸出時間和日期的真實時間時鐘組件。時鐘還可以說明性地為處理器217提供時序功能。
定位系統(tǒng)227說明性地包括輸出設(shè)備216的當(dāng)前地理位置的組件。這例如可以包括全球定位系統(tǒng)(GPS)接收機(jī)、LORAN系統(tǒng)、航位推算系統(tǒng)、蜂窩三角測量系統(tǒng)或者其他定位系統(tǒng)。這例如還可以包括生成所期望的地圖、導(dǎo)航線路和其他地理功能的測繪軟件或?qū)Ш杰浖?/p>
存儲器221存儲操作系統(tǒng)229、網(wǎng)絡(luò)設(shè)置231、應(yīng)用233、應(yīng)用配置設(shè)置235、數(shù)據(jù)存儲237、通信驅(qū)動程序239以及通信配置設(shè)置241。存儲器221可以包括所有類型的有形易失性和非易失性計算機(jī)可讀存儲器設(shè)備。其還可以包括計算機(jī)存儲介質(zhì)(下面描述)。存儲器221存儲計算機(jī)可讀指令,所述指令在被處理器217執(zhí)行時致使處理器根據(jù)所述指令執(zhí)行計算機(jī)實現(xiàn)的步驟或功能。處理器217可以也被其他組件激活以促成它們的功能性。
網(wǎng)絡(luò)設(shè)置231的示例包括諸如代理信息、因特網(wǎng)連接信息以及測繪之類的事物。應(yīng)用配置設(shè)置235包括為特定企業(yè)或用戶定制應(yīng)用的設(shè)置。通信配置設(shè)置241提供了用于與其他計算機(jī)進(jìn)行通信的參數(shù),并且包括諸如GPRS參數(shù)、SMS參數(shù)、連接用戶名和口令之類的項目。
應(yīng)用233可以是之前已經(jīng)存儲在設(shè)備216上的應(yīng)用或是在使用期間安裝的應(yīng)用,但是這些應(yīng)用可以是操作系統(tǒng)229的一部分,或者也可以在設(shè)備216之外被托管。
圖8和9提供了可被使用的設(shè)備216的附加示例,但是也可以使用其它設(shè)備。在圖8,提供功能電話或移動電話345作為設(shè)備216。電話345包括:一組小鍵盤347,其用于撥打電話號碼;顯示器349,其能夠顯示包括應(yīng)用圖像在內(nèi)的圖像、圖標(biāo)、網(wǎng)頁、照片和視頻;以及控制按鈕351,其用于選擇在顯示器上示出的項目。電話包括天線353,該天線353用于接收諸如通用分組無線服務(wù)(GPRS)和1Xrtt之類的蜂窩電話信號以及短消息服務(wù)(SMS)信號。在一些實施例中,電話345還包括容納安全數(shù)字(SD)卡357的SD卡槽355。
圖9的移動設(shè)備是個人數(shù)字助理(PDA)459或多媒體播放器或平板計算設(shè)備等等(在此稱為PDA 459)。PDA 459包括電感屏461,所述電感屏感測指示筆463(或其他指示器,諸如用戶的手指)在該指示筆被置于屏幕之上時的位置。這允許用戶在屏幕上選擇、突出顯示和移動項目以及繪圖和書寫。PDA 459還包括多個用戶輸入鍵或按鈕(比如按鈕465),其允許用戶將顯示器461上所顯示的菜單選項或其他顯示選項滾屏,并且允許用戶在沒有接觸顯示器461的情況下改變應(yīng)用或選擇用戶輸入功能。盡管未被示出,但是PDA 459可以包括允許與其他計算機(jī)進(jìn)行無線通信的內(nèi)置天線和紅外發(fā)射機(jī)/接收機(jī)、以及允許與其他計算設(shè)備的硬件連接的連接端口。這樣的硬件連接通常是通過經(jīng)由串行或USB端口連接到其他計算機(jī)的支架來完成的。因此,這些連接是非網(wǎng)絡(luò)連接。在一個實施例中,移動設(shè)備459還包括容納SD卡469的SD卡槽467。
圖10類似于圖8,不同之處在于電話是智能電話571。智能電話571具有顯示圖標(biāo)或磁貼或其他用戶輸入機(jī)制575的觸敏顯示器573。機(jī)制575可由用戶用來運(yùn)行應(yīng)用、進(jìn)行呼叫、執(zhí)行數(shù)據(jù)傳輸操作,等等。一般而言,智能電話571被構(gòu)建在移動操作系統(tǒng)上且提供比功能電話更高級的計算能力和連接性。
圖8到圖10示出在圖11中示出的設(shè)備216的特定形式。應(yīng)當(dāng)理解,除了圖8-10中示出的那些之外,設(shè)備216的其他形式是可能的。
圖11是其中可采用架構(gòu)100或其一部分(作為示例)的計算環(huán)境的一個實施例。參考圖11,用于實現(xiàn)一些實施例的示例性系統(tǒng)包括計算機(jī)810形式的通用計算設(shè)備。計算機(jī)810的組件可以包括,但不限于,處理單元820(可以包括系統(tǒng)200或設(shè)備16中的處理器102或各處理器)、系統(tǒng)存儲器830和將包括系統(tǒng)存儲器在內(nèi)的各種系統(tǒng)組件耦合至處理單元820的系統(tǒng)總線821。系統(tǒng)總線821可以是若干類型的總線結(jié)構(gòu)中的任一種,包括存儲器總線或存儲器控制器、外圍總線和使用各種總線架構(gòu)中的任一種的局部總線。作為示例而非限制,這樣的架構(gòu)包括工業(yè)標(biāo)準(zhǔn)架構(gòu)(ISA)總線、微通道架構(gòu)(MCA)總線、增強(qiáng)型ISA(EISA)總線、視頻電子技術(shù)標(biāo)準(zhǔn)協(xié)會(VESA)局部總線和外圍部件互連(PCI)總線(也稱為夾層(Mezzanine)總線)。參考圖1描述的存儲器和程序可被部署在圖11的對應(yīng)部分中。
計算機(jī)810通常包括各種計算機(jī)可讀介質(zhì)。計算機(jī)可讀介質(zhì)可以是能由計算機(jī)810訪問的任何可用介質(zhì),而且包含易失性和非易失性介質(zhì)、可移動和不可移動介質(zhì)。作為示例而非限制,計算機(jī)可讀介質(zhì)可包括計算機(jī)存儲介質(zhì)和通信介質(zhì)。計算機(jī)存儲介質(zhì)不同于且不包括已調(diào)制數(shù)據(jù)信號或載波。計算機(jī)存儲介質(zhì)包括硬件存儲介質(zhì),該硬件存儲介質(zhì)包括以用于存儲諸如計算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù)的信息的任何方法和技術(shù)實現(xiàn)的易失性和非易失性、可移動和不可移動介質(zhì)。計算機(jī)存儲介質(zhì)包括,但不限于,RAM、ROM、EEPROM、閃存或其他存儲器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD)或其他光盤存儲、磁帶盒、磁帶、磁盤存儲或其他磁性存儲設(shè)備、或能用于存儲所需信息且可以由計算機(jī)810訪問的任何其他介質(zhì)。通信介質(zhì)通常具體化計算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或傳輸機(jī)制中的其他數(shù)據(jù),并包括任何信息遞送介質(zhì)。術(shù)語“已調(diào)制數(shù)據(jù)信號”是指使得以在信號中編碼信息的方式來設(shè)定或改變其一個或多個特征的信號。作為示例而非限制,通信介質(zhì)包括諸如有線網(wǎng)絡(luò)或直接線連接之類的有線介質(zhì),以及諸如聲學(xué)、RF、紅外及其他無線介質(zhì)之類的無線介質(zhì)。上述任何組合也應(yīng)該包括在計算機(jī)可讀的介質(zhì)范圍內(nèi)。
系統(tǒng)存儲器830包括易失性和/或非易失性存儲器形式的計算機(jī)存儲介質(zhì),如只讀存儲器(ROM)831和隨機(jī)存取存儲器(RAM)832。包含諸如在啟動期間幫助在計算機(jī)810內(nèi)的元件之間傳輸信息的基本例程的基本輸入/輸出系統(tǒng)833(BIOS)通常存儲在ROM 831中。RAM 832通常包含處理單元820可立即訪問和/或當(dāng)前正在操作的數(shù)據(jù)和/或程序模塊。作為示例而非限制,圖11例示出了操作系統(tǒng)834、應(yīng)用程序835、其他程序模塊836和程序數(shù)據(jù)837。
計算機(jī)810還可以包括其他可移動/不可移動、易失性/非易失性計算機(jī)存儲介質(zhì)。僅作為示例,圖11示出了從不可移動、非易失性磁介質(zhì)中讀取或向其寫入的硬盤驅(qū)動器841,從可移動、非易失性磁盤852中讀取或向其寫入的磁盤驅(qū)動器851,以及從諸如CD ROM或其他光學(xué)介質(zhì)等可移動、非易失性光盤856中讀取或向其寫入的光盤驅(qū)動器855??稍谑纠圆僮鳝h(huán)境中使用的其他可移動/不可移動、易失性/非易失性計算機(jī)存儲介質(zhì)包括但不限于,磁帶盒、閃存卡、數(shù)字多功能盤、數(shù)字錄像帶、固態(tài)RAM、固態(tài)ROM等。硬盤驅(qū)動器841通常通過諸如接口840之類的不可移動存儲器接口連接到系統(tǒng)總線821,并且磁盤驅(qū)動器851和光盤驅(qū)動器855通常通過諸如接口850之類的可移動存儲器接口連接到系統(tǒng)總線821。
作為替換或補(bǔ)充,本文所述的功能可至少部分地由一個或多個硬件邏輯組件來執(zhí)行。例如、但非限制,可使用的硬件邏輯組件的說明性類型包括現(xiàn)場可編程門陣列(FPGA)、程序?qū)S玫募呻娐?ASIC)、程序?qū)S玫臉?biāo)準(zhǔn)產(chǎn)品(ASSP)、片上系統(tǒng)系統(tǒng)(SOC)、復(fù)雜可編程邏輯器件(CPLD)、等等。
上文討論并在圖11中示出的驅(qū)動器及其相關(guān)聯(lián)的計算機(jī)存儲介質(zhì)為計算機(jī)810提供了對計算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和其他數(shù)據(jù)的存儲。例如,在圖11中,硬盤驅(qū)動器841被示為存儲操作系統(tǒng)844、應(yīng)用程序845、其他程序模塊846和程序數(shù)據(jù)847。注意,這些組件可與操作系統(tǒng)834、應(yīng)用程序835、其他程序模塊836和程序數(shù)據(jù)837相同,也可與它們不同。在此操作系統(tǒng)844、應(yīng)用程序845、其他程序模塊846以及程序數(shù)據(jù)847被給予了不同的編號,以至少說明它們是不同的副本。
用戶可以通過諸如鍵盤862、話筒863以及諸如鼠標(biāo)、跟蹤球或觸摸墊等定點(diǎn)設(shè)備861等輸入設(shè)備來將命令和信息輸入至計算機(jī)810中。其他輸入設(shè)備(未示出)可以包括操縱桿、游戲手柄、圓盤式衛(wèi)星天線、掃描儀等。這些以及其他輸入設(shè)備通常通過耦合到系統(tǒng)總線的用戶輸入接口860連接到處理單元820,但也可通過諸如并行端口、游戲端口或通用串行總線(USB)之類的其他接口和總線結(jié)構(gòu)來連接。視覺顯示器891或其他類型的顯示設(shè)備也經(jīng)由諸如視頻接口890之類的接口連接至系統(tǒng)總線821。除了監(jiān)視器以外,計算機(jī)還可包括諸如揚(yáng)聲器897和打印機(jī)896之類的其他外圍輸出設(shè)備,它們可通過輸出外圍接口895來連接。
計算機(jī)810使用到諸如遠(yuǎn)程計算機(jī)880等一個或多個遠(yuǎn)程計算機(jī)的邏輯連接在網(wǎng)絡(luò)化環(huán)境中操作。遠(yuǎn)程計算機(jī)880可以是個人計算機(jī)、手持設(shè)備、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對等設(shè)備或其他常見的網(wǎng)絡(luò)節(jié)點(diǎn),且一般包括以上關(guān)于計算機(jī)810描述的多個或所有的元件。圖11中所示的邏輯連接包括局域網(wǎng)(LAN)871和廣域網(wǎng)(WAN)873,但也可以包括其他網(wǎng)絡(luò)。此類聯(lián)網(wǎng)環(huán)境在辦公室、企業(yè)范圍的計算機(jī)網(wǎng)絡(luò)、內(nèi)聯(lián)網(wǎng)和因特網(wǎng)中是常見的。
當(dāng)在LAN聯(lián)網(wǎng)環(huán)境中使用時,計算機(jī)810通過網(wǎng)絡(luò)接口或適配器870連接到LAN 871。當(dāng)在WAN聯(lián)網(wǎng)環(huán)境中使用時,計算機(jī)810通常包括調(diào)制解調(diào)器872或用于通過諸如因特網(wǎng)等WAN 873建立通信的其他手段。調(diào)制解調(diào)器872可以是內(nèi)置的或外置的,可經(jīng)由用戶輸入接口860或其他適當(dāng)?shù)臋C(jī)制連接到系統(tǒng)總線821。在聯(lián)網(wǎng)環(huán)境中,相關(guān)于計算機(jī)810所示的程序模塊或其部分可被存儲在遠(yuǎn)程存儲器存儲設(shè)備中。作為示例而非限制,圖11示出了遠(yuǎn)程應(yīng)用程序885駐留在遠(yuǎn)程計算機(jī)880上。應(yīng)當(dāng)理解,所示的網(wǎng)絡(luò)連接是示例性的,并且可使用在計算機(jī)之間建立通信鏈路的其他手段。
還應(yīng)注意,本文描述的不同實施例可以按不同的方式來組合。即,一個或多個實施例的各部分可以與一個或多個其他實施例的各部分組合在一起。本文中構(gòu)想了所有這些。
示例1是一種修改源代碼的編程單元的執(zhí)行行為的計算機(jī)實現(xiàn)的方法。所述方法包括加載源代碼的編程。單元并確定是否針對該編程單元定義了至少一個定制至少一個定制基于所述定制的先決條件是否被滿足而被選擇性地執(zhí)行。
示例2是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中源代碼的編程單元是源代碼的單個行。
示例3是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中源代碼的編程單元包括源代碼的多個行。
示例4是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中源代碼的編程單元是方法。
示例5是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中至少一個定制選擇性地執(zhí)行以取代源代碼的編程單元。
示例6是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中所述至少一個定制在源代碼的編程單元之前選擇性地執(zhí)行。
示例7是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中所述至少一個定制在源代碼的編程單元之后選擇性地執(zhí)行。
示例8是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中所述至少一個定制的選擇性執(zhí)行包括在執(zhí)行期間向所述至少一個定制提供對源代碼的編程單元的變量的訪問。
示例9是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中所述訪問是由所述至少一個定制中的范圍定義來確定的。
示例10是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中所述先決條件包括在源代碼的編程單元中的變量的存在。
示例11是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中所述變量不是在所述至少一個定制上操作的。
示例12是定義與源代碼的編程單元有關(guān)的定制的計算機(jī)實現(xiàn)的方法。所述方法包括標(biāo)識源代碼的編程單元并指定與所標(biāo)識的源代碼的編程單元有關(guān)的定制執(zhí)行。定制執(zhí)行的范圍被定義。所述源代碼的編程單元的標(biāo)識、指定的定制執(zhí)行信息以及范圍信息被存儲并被提供給執(zhí)行平臺。
示例13是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,并進(jìn)一步定義了在所述定制將由執(zhí)行平臺執(zhí)行之前必須存在于源代碼的編程單元中的至少一個先決條件。
示例14是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中所述先決條件包括在所述定制將由執(zhí)行平臺執(zhí)行之前必須存在于源代碼的編程單元中的參數(shù)。
示例15是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中所述參數(shù)沒有在定制中被使用。
示例16是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中指定與所標(biāo)識的源代碼的編程單元有關(guān)的定制執(zhí)行包括定制將取代所標(biāo)識的源代碼的編程單元來執(zhí)行的指示。
示例17是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中所述定制執(zhí)行的范圍被定義使得所述定制將能夠訪問它正在取代的源代碼的編程單元的變量。
示例18是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中指定與所標(biāo)識的源代碼的編程單元有關(guān)的定制執(zhí)行包括定制將在所標(biāo)識的源代碼的編程單元之前絕對最先執(zhí)行的指示。
示例19是如任意或所有先前的示例的計算機(jī)實現(xiàn)的方法,其中指定與所標(biāo)識的源代碼的編程單元有關(guān)的定制執(zhí)行包括定制將在所標(biāo)識的源代碼的編程單元之后絕對最后執(zhí)行的指示。
示例20是一種被配置為執(zhí)行源代碼的編程單元的計算機(jī)系統(tǒng)。所述計算機(jī)系統(tǒng)包括被配置為執(zhí)行源代碼的編程單元的處理器和適用于存儲源代碼的編程單元和關(guān)于所選的源代碼的編程單元所定義的至少一個定制的存儲組件。處理器被配置為加載源代碼的編程單元并確定是否相對于所加載的源代碼的編程單元定義了一個定制并基于所述定制的定義選擇性地執(zhí)行所述定制。
盡管用結(jié)構(gòu)特征和/或方法動作專用的語言描述了本主題,但可以理解,所附權(quán)利要求書中定義的主題不必限于上述具體特征或動作。更確切而言,上述具體特征和動作是作為實現(xiàn)權(quán)利要求的示例形式公開的。