常規(guī)地,遺留平臺傾向于是功能的單體(monolithic)分組。也就是說,平臺通常經(jīng)由其單體平臺API來展現(xiàn)其全部功能。應(yīng)用利用該API在平臺上進(jìn)行操作檢驗。
這樣的遺留平臺傾向于當(dāng)它隨時間推移而發(fā)生變化時作為整體被進(jìn)行版本控制。較新版本的平臺可以是或不是較舊版本的超集。也就是說,較新版本可以支持或不支持所有與較舊版本相同的功能,并且如果它們支持,它們可能并非以相同的方式支持該功能。因此,為了保證正確的操作,常規(guī)應(yīng)用必須被明確開發(fā)為在平臺的某些版本上工作。在這種情況下,對于應(yīng)用將支持哪些平臺的決定必須在開發(fā)時間(應(yīng)用正被創(chuàng)建的時候)而不是運行時間(應(yīng)用正在執(zhí)行的時候)被做出。因此,針對遺留平臺設(shè)計和實現(xiàn)的應(yīng)用與那些平臺聯(lián)系起來,并且將可能無法在其它平臺或平臺版本上正確操作。
技術(shù)實現(xiàn)要素:
此部分所提供的發(fā)明內(nèi)容概括了本發(fā)明的一個或多個部分或完整的示例實施例,以便為讀者提供基本的高水平的理解。該發(fā)明內(nèi)容并非是本發(fā)明的擴(kuò)展性描述,并且其可能并未標(biāo)識出本發(fā)明的關(guān)鍵元素或方面或者對本發(fā)明的范圍加以界定。其僅有的目的是以簡化形式呈現(xiàn)本發(fā)明的各個方面來作為以下所提供的詳細(xì)描述的引言。因此,本發(fā)明作為整體不應(yīng)局限于本文提供的任何特定的(多個)實施例或(多個)示例或(多種)組合。
本發(fā)明包含用于根據(jù)所提供的API合約的集合而被進(jìn)行版本控制的合約平臺的技術(shù)。API合約既是開發(fā)時間的可執(zhí)行組件又是運行時間的可執(zhí)行組件。每個這樣的合約定義了在運行時間被對應(yīng)的實施模塊完全支持的API的特定集合。與遺留平臺的單體API不同,合約應(yīng)用被寫入API合約。這樣的應(yīng)用是“與平臺無關(guān)的”。本文使用的術(shù)語“合約應(yīng)用”或類似術(shù)語指代以編程方式訪問或利用由一個或多個API合約定義的特征的任意實體,包括軟件。
許多所附特征將被更容易地領(lǐng)會,因為同樣的特征通過參考以下結(jié)合附圖所提供的詳細(xì)描述而變得更好理解。
附圖說明
以下提供的詳細(xì)描述將在結(jié)合附圖進(jìn)行考慮時被更好地理解,在附圖中:
圖1是示出本文描述的其中可以實施本發(fā)明的示例計算環(huán)境的框圖。
圖2是示出被配置為提供遺留平臺的示例系統(tǒng)的框圖。
圖3是示出被配置為提供合約平臺的示例系統(tǒng)的框圖。
圖4是示出API合約的示例圖示的框圖。
圖5是示出用于確定API合約在運行時間的可用性的示例方法的框圖。
圖6是示出用于由API合約對可用性查詢等做出響應(yīng)的示例方法的框圖。
圖7是示出用于由合約平臺對合約可用性查詢等做出響應(yīng)的示例方法的框圖。
圖8是示出類似于圖3的示例系統(tǒng)的被配置為提供填充(shimmed)合約平臺的示例系統(tǒng)的框圖。
不同圖中被同樣編號的標(biāo)記被用來在附圖中標(biāo)示相似或相同的元素或步驟。
具體實施方式
此部分中結(jié)合附圖所提供的詳細(xì)描述描述了本發(fā)明的一個或多個部分或完整的示例實施例,但是其并非意在描述本發(fā)明的所有可能的實施例。該詳細(xì)描述給出了技術(shù)、系統(tǒng)和/或方法發(fā)明中的至少一些的各種示例。然而,也可以根據(jù)示例實現(xiàn)相同或等同的技術(shù)、系統(tǒng)和/或方法。
計算環(huán)境
雖然本文提供的示例被描述和圖示為能夠在計算環(huán)境中實施,但是所描述的環(huán)境僅作為示例而不是限制來被提供。如本領(lǐng)域技術(shù)人員將意識到的,所公開的示例適合于在廣泛多樣的不同計算環(huán)境中實施。
圖1是示出本文描述的其中可以實施本發(fā)明的示例計算環(huán)境100的框圖??梢允褂帽姸嗤ㄓ没?qū)S迷O(shè)備和/或系統(tǒng)中的任何設(shè)備和/或系統(tǒng)來實施適當(dāng)?shù)挠嬎悱h(huán)境。公知設(shè)備/系統(tǒng)的示例包括但不限于個人數(shù)字助理(PDA)、個人計算機(jī)(PC)、手持式或膝上型設(shè)備、基于微處理器的系統(tǒng)、多處理器系統(tǒng)、片上系統(tǒng)(SOC)、服務(wù)器、互聯(lián)網(wǎng)服務(wù)、工作站、消費電子設(shè)備、蜂窩電話、機(jī)頂盒等。在所有情況下,這樣的系統(tǒng)被嚴(yán)格局限于制品及類似物。
計算環(huán)境100通常包括形式為計算設(shè)備101的通用計算系統(tǒng),其耦合到諸如外圍設(shè)備102、103、101等的各種組件。這些可以包括諸如輸入設(shè)備103的、可以經(jīng)由一個或多個輸入/輸出(“I/O”)接口112進(jìn)行操作的組件,輸入設(shè)備103諸如語音識別技術(shù)、觸摸板、按鈕、鍵盤和/或諸如鼠標(biāo)或軌跡球的指向(pointing)設(shè)備。計算設(shè)備101的組件可以包括一個或多個處理器(其包括中央處理單元(“CPU”)、圖形處理單元(“GPU”)、微處理器(“μP”)等)107、系統(tǒng)存儲器109以及通常耦合各種組件的系統(tǒng)總線108。(多個)處理器107通常處理或執(zhí)行各種計算機(jī)可執(zhí)行指令,并且基于那些指令來控制計算設(shè)備101的操作。這可以包括計算設(shè)備101經(jīng)由諸如網(wǎng)絡(luò)連接114等的各種通信技術(shù),與其它電子和/或計算設(shè)備、系統(tǒng)或環(huán)境(未示出)進(jìn)行通信。系統(tǒng)總線108表示任意數(shù)量的總線結(jié)構(gòu),包括使用各種總線架構(gòu)中的任意一種的存儲器總線或存儲器控制器、外圍總線、串行總線、加速圖形端口、處理器或局部總線等。除非之前具有詞語“虛擬”,否則本文使用的術(shù)語“計算設(shè)備”嚴(yán)格地指代(多個)制品及類似物。術(shù)語“虛擬計算設(shè)備”和“虛擬機(jī)”通常是指特定計算系統(tǒng)的仿真,并且一般性地被稱為虛擬機(jī)(VM)。這種正常運作的VM總是托管在(多個)非虛擬計算設(shè)備上。
系統(tǒng)存儲器109可以包括形式為諸如隨機(jī)存取存儲器(“RAM”)的易失性存儲器和/或諸如只讀存儲器(“ROM”)或閃速存儲器(“FLASH”)的非易失性存儲器的計算機(jī)可讀介質(zhì)?;据斎?輸出系統(tǒng)(“BIOS”)可以以非易失性方式或類似方式儲存。系統(tǒng)存儲器109通常儲存數(shù)據(jù)、計算機(jī)可執(zhí)行指令和/或程序模塊,包括一個或多個處理器107立即可訪問和/或當(dāng)前正在一個或多個處理器107上操作的計算機(jī)可執(zhí)行指令。本文使用的術(shù)語“系統(tǒng)存儲器”嚴(yán)格地指代(多個)制品及類似物。
大型儲存器設(shè)備104和110可以經(jīng)由耦合到系統(tǒng)總線而耦合到計算設(shè)備101或者整合到計算設(shè)備101中。這樣的大型儲存器設(shè)備104和110可以包括非易失性RAM、從可移除的非易失性磁盤(例如“軟盤”)105讀取和/或?qū)ζ鋵懭氲拇疟P驅(qū)動器、和/或從非易失性光盤(諸如CD ROM、DVD ROM)106讀取和/或?qū)ζ鋵懭氲墓獗P驅(qū)動器。可替換地,諸如硬盤的大型儲存器設(shè)備110可以包括不可移除儲存器介質(zhì)。其它大型儲存器設(shè)備可以包括存儲卡、存儲棒、磁帶儲存器設(shè)備等。本文使用的術(shù)語“大型儲存器設(shè)備”嚴(yán)格地指代(多個)制品及類似物。
任何數(shù)量的計算機(jī)程序、文件、數(shù)據(jù)結(jié)構(gòu)等可以儲存在大型儲存器110、其它儲存器設(shè)備104、105、106和系統(tǒng)存儲器109(通常受可用空間的限制)中,作為示例而非限制,它們包括操作系統(tǒng)、應(yīng)用程序、數(shù)據(jù)文件、目錄結(jié)構(gòu)、計算機(jī)可執(zhí)行指令等。
諸如顯示設(shè)備102的輸出組件或設(shè)備通常經(jīng)由諸如顯示適配器111之類的接口可被耦合到計算設(shè)備101。輸出設(shè)備102可以是液晶顯示器(LCD)。其它示例輸出設(shè)備可以包括打印機(jī)、音頻輸出部、語音輸出部、陰極射線管(CRT)顯示器、觸覺設(shè)備或者其它感官輸出機(jī)構(gòu)(mechanism)等。輸出設(shè)備可以使得計算設(shè)備101能夠與人類操作員或其它機(jī)器、系統(tǒng)、計算環(huán)境等進(jìn)行交互。用戶可以經(jīng)由任意數(shù)量的諸如觸摸板、按鈕、鍵盤、鼠標(biāo)、操縱桿、游戲板、數(shù)據(jù)端口等的不同I/O設(shè)備103與計算環(huán)境100相互作用。這些和其它I/O設(shè)備可以經(jīng)由I/O接口112耦合到(多個)處理器107,I/O接口112可以耦合到系統(tǒng)總線108,和/或可以被其它接口和總線結(jié)構(gòu)耦合,諸如并行端口、游戲端口、通用串行總線(“USB”)、火線、紅外(“IR”)端口等。
計算設(shè)備101可以經(jīng)由通過一個或多個蜂窩網(wǎng)絡(luò)、無線網(wǎng)絡(luò)、局域網(wǎng)(“LAN”)、廣域網(wǎng)(“WAN”)、儲存區(qū)域網(wǎng)絡(luò)(“SAN”)、互聯(lián)網(wǎng)、無線電鏈路、光學(xué)鏈路等而去往一個或多個遠(yuǎn)程計算設(shè)備的通信連接,在聯(lián)網(wǎng)環(huán)境中進(jìn)行操作。計算設(shè)備101可以經(jīng)由網(wǎng)絡(luò)適配器113或類似物,或者替代地經(jīng)由調(diào)制解調(diào)器、數(shù)字用戶線(“DSL”)鏈路、綜合業(yè)務(wù)數(shù)字網(wǎng)絡(luò)(“ISDN”)鏈路、互聯(lián)網(wǎng)鏈路、無線鏈路等耦合到網(wǎng)絡(luò)。
諸如網(wǎng)絡(luò)連接的通信連接114通常提供到諸如網(wǎng)絡(luò)的通信介質(zhì)的耦合。通信介質(zhì)通常使用經(jīng)調(diào)制的數(shù)據(jù)信號(諸如載波或其它傳輸機(jī)制)來提供計算機(jī)可讀和計算機(jī)可執(zhí)行指令、數(shù)據(jù)結(jié)構(gòu)、文件、程序模塊和其它數(shù)據(jù)。術(shù)語“經(jīng)調(diào)制的數(shù)據(jù)信號”通常意味著其一個或多個特性以在信號中對信息進(jìn)行編碼的方式被設(shè)置或改變的信號。作為示例而非限制,通信介質(zhì)可以包括諸如有線網(wǎng)絡(luò)或直接有線連接等的有線介質(zhì),以及諸如聲音、射頻、紅外或其它無線通信機(jī)制的無線介質(zhì)。
諸如電池或電源的電力源190通常為計算環(huán)境100的部分或全部提供電力。在計算環(huán)境100是移動設(shè)備或便攜式設(shè)備或類似物的情況下,電力源190可以是電池??商鎿Q地,在計算環(huán)境100是臺式計算機(jī)或服務(wù)器或類似物的情況下,電力源190可以是被設(shè)計為諸如經(jīng)由墻壁插座而連接到交流電(AC)源的電源。
一些移動設(shè)備可以僅包括結(jié)合圖1所描述的幾個組件。例如,電子徽章可以由導(dǎo)線的線圈或類似物連同簡單的處理單元107或類似物一起組成,該線圈被配置為在靠近讀卡器設(shè)備或類似物時充當(dāng)電力源190。這種線圈還可以被配置為充當(dāng)耦合到處理單元107或類似物的天線,該線圈天線能夠在電子徽章和諸如讀卡器設(shè)備的另一設(shè)備之間發(fā)射/接收通信。這樣的通信可以不涉及聯(lián)網(wǎng),但是替代地可以是經(jīng)由遙測、點對點、RF、IR、音頻或其它手段進(jìn)行的通用或?qū)S猛ㄐ?。電子卡可以不包括顯示器102、I/O設(shè)備103或者結(jié)合圖1所描述的許多其它組件。作為示例而非限制,可以不包括結(jié)合圖1所描述的許多組件的其它移動設(shè)備包括電子手鐲、電子標(biāo)簽、可植入設(shè)備等。
本領(lǐng)域技術(shù)人員將認(rèn)識到,被用來提供計算機(jī)可讀和計算機(jī)可執(zhí)行指令和數(shù)據(jù)的儲存器設(shè)備可以在網(wǎng)絡(luò)上進(jìn)行分布。例如,遠(yuǎn)程計算機(jī)或儲存器設(shè)備可以儲存形式為軟件應(yīng)用和數(shù)據(jù)的計算機(jī)可讀和計算機(jī)可執(zhí)行指令。本地計算機(jī)可以經(jīng)由網(wǎng)絡(luò)訪問遠(yuǎn)程計算機(jī)或儲存器設(shè)備,并且下載軟件應(yīng)用或數(shù)據(jù)的部分或全部,并且可以執(zhí)行任何計算機(jī)可執(zhí)行指令??商鎿Q地,本地計算機(jī)可以根據(jù)需要下載數(shù)件軟件或數(shù)據(jù),或者通過在本地計算機(jī)處執(zhí)行一些指令并且在遠(yuǎn)程計算機(jī)和/或設(shè)備處執(zhí)行一些指令而分布式地處理軟件。
本領(lǐng)域技術(shù)人員還將認(rèn)識到,通過利用常規(guī)技術(shù),軟件的計算機(jī)可執(zhí)行指令的全部或部分可以由專用電子電路來執(zhí)行,該專用電子電路諸如數(shù)字信號處理器(“DSP”)、可編程邏輯陣列(“PLA”)、離散電路等。術(shù)語“電子裝置”可以包含包括任何軟件、固件等的計算設(shè)備或消費電子設(shè)備,或者不包括軟件、固件等的電子設(shè)備或電路。
術(shù)語“固件”通常是指在諸如ROM的電子設(shè)備中維護(hù)的可執(zhí)行指令、代碼、數(shù)據(jù)、應(yīng)用、程序、程序模塊等。術(shù)語“軟件”一般是指在任何形式或類型的計算機(jī)可讀介質(zhì)之中或之上維護(hù)的計算機(jī)可執(zhí)行指令、代碼、數(shù)據(jù)、應(yīng)用、程序、程序模塊等,該計算機(jī)可讀介質(zhì)被配置為以可被計算設(shè)備訪問的方式儲存計算機(jī)可執(zhí)行指令等。本文使用的術(shù)語“計算機(jī)可讀介質(zhì)”及類似術(shù)語被限制為嚴(yán)格地指代并非信號或載波本身的一個或多個符合法規(guī)的裝置、制品等。權(quán)利要求中使用的術(shù)語“計算設(shè)備”被限制為嚴(yán)格地指代并非信號或載波本身的一個或多個符合法規(guī)的裝置、制品等,諸如涵蓋客戶端設(shè)備、移動設(shè)備、一個或多個服務(wù)器的計算設(shè)備101,諸如基于一個或多個計算機(jī)的互聯(lián)網(wǎng)服務(wù)或公司網(wǎng)絡(luò)服務(wù)的網(wǎng)絡(luò)服務(wù)等等,和/或它們的任何組合。
遺留平臺
圖2是示出被配置為提供遺留平臺(諸如遺留平臺220)的示例系統(tǒng)200的框圖,該遺留平臺包括單體應(yīng)用編程接口(“API”)(諸如示例平臺API 224)以及它的底層可執(zhí)行模塊(諸如示例平臺可執(zhí)行模塊1-n 222),該遺留平臺作為諸如示例應(yīng)用230的一個或多個應(yīng)用的資源。
常規(guī)地,遺留平臺傾向于是功能的單體分組。也就是說,平臺通常經(jīng)由其單體平臺API來展現(xiàn)其全部功能。應(yīng)用利用該API在平臺上操作。遺留平臺的一個示例是常規(guī)操作系統(tǒng)。遺留平臺的另一示例是代碼庫或類似物。
這樣的遺留平臺傾向于當(dāng)它隨時間的推移發(fā)生變化時作為整體被進(jìn)行版本控制。較新版本的平臺可以是或不是較舊版本的超集。也就是說,較新版本可以支持或不支持所有與較舊版本相同的功能,并且如果它們支持,可能并非以相同的方式支持該功能。因此,為了保證正確的操作,常規(guī)應(yīng)用必須被明確開發(fā)為在平臺的某些版本上工作。在這種情況下,對于應(yīng)用將支持哪些平臺的決定必須在開發(fā)時間(應(yīng)用正被創(chuàng)建的時候)而不是運行時間(應(yīng)用正在執(zhí)行的時候)被做出。因此,針對遺留平臺所設(shè)計和實施的應(yīng)用與那些平臺聯(lián)系起來,并且將可能無法在其它平臺或平臺版本上正確操作。
關(guān)于單體平臺API 224,一些遺留平臺可以提供(多個)運行時間機(jī)制以確定特定接口是否可用于諸如從文件讀取或?qū)ξ募懭?。但是由API合約定義的“特征”對于遺留平臺而言是未知的。因此,遺留平臺并未提供用于檢驗特定特征(諸如由API合約定義的特征)的存在性的機(jī)制。即使要定義遺留特征并識別構(gòu)成該遺留特征的API的合集,仍然要單獨對那些API中的每一個在運行時間的存在性進(jìn)行檢驗,因為并沒有用于將遺留特征作為一個整體來檢驗的機(jī)制。
圖2圖示了示例主機(jī)210,其可以是任意類型的(多個)計算設(shè)備。主機(jī)210通常包括足以使得諸如示例應(yīng)用230的應(yīng)用能夠在主機(jī)210上操作的遺留平臺220。平臺的一個示例是操作系統(tǒng),諸如Apple iOS、Microsoft Windows、Microsoft Windows Phone、Xbox、Android、Linux等。每個這樣的平臺通常展現(xiàn)諸如平臺API 224的API。對于任何特定的平臺而言,此API可以隨著平臺版本的變化而有所改變。較新版本的API可能并且經(jīng)常與較舊版本不兼容。主機(jī)210的示例包括計算設(shè)備(諸如服務(wù)器、臺式計算機(jī)、膝上型計算機(jī)、平板計算機(jī)、蜂窩電話以及任何其它計算設(shè)備)、包括計算設(shè)備的實體和/或這樣的計算設(shè)備的合集。
平臺的實際功能通常由該平臺的一個或多個可執(zhí)行模塊提供,該模塊諸如平臺可執(zhí)行模塊1-n 222。例如,當(dāng)應(yīng)用230調(diào)用特定平臺API時,該調(diào)用由對應(yīng)的可執(zhí)行模塊來處理。
常規(guī)地,平臺展現(xiàn)它的整個平臺API,這使得應(yīng)用開發(fā)人員能夠獲得該平臺的全部功能。從本質(zhì)上來講,從應(yīng)用開發(fā)的角度來看,平臺及其API完全由平臺的具體版本定義。這給應(yīng)用開發(fā)人員造成具有挑戰(zhàn)性的問題。也就是說,應(yīng)用開發(fā)人員必須在開發(fā)時間決定他的應(yīng)用將支持特定平臺的版本x,并且通過這樣做而假設(shè)平臺的版本x的所有平臺API(和對應(yīng)的功能)對他的應(yīng)用而言都將是可用的。通過做出支持平臺的版本x的決定,開發(fā)人員得知其應(yīng)用可能無法在該平臺的版本y(無論版本y大于或小于版本x)上正確操作,除非平臺提供方作為一項政策決定來保證版本y將與版本x完全兼容。
由于應(yīng)用開發(fā)是昂貴的,這方面的當(dāng)前技術(shù)水平經(jīng)常迫使應(yīng)用開發(fā)人員在兩個重要的市場之間進(jìn)行選擇:(1)為具有更多用戶但具有更舊且更少的特征的較舊平臺創(chuàng)建應(yīng)用,或者(2)為具有更多且更新的特征但具有更少的用戶的較新平臺創(chuàng)建應(yīng)用。
此外,平臺提供方可以為不同的設(shè)備類別提供相同平臺的不同變型。例如,微軟公司為通用計算設(shè)備提供了Microsoft Windows,為蜂窩電話等提供了Microsoft Windows Phone,以及為Xbox提供了相應(yīng)的平臺變型。這些變型中的每一種都展現(xiàn)了相似但不同的API,并且各自彼此獨立地被進(jìn)行版本控制。平臺的這種變型使得開發(fā)人員必須做出的決定進(jìn)一步復(fù)雜化,因為他現(xiàn)在必須不僅要決定要支持平臺的哪些版本,而且還要決定支持平臺的哪些變型的哪些版本,因此對于開發(fā)人員而言倍增了問題。
相對于圖2使用的術(shù)語“平臺”和“遺留平臺”指代常規(guī)或遺留的平臺。相對于其余的圖所使用的術(shù)語“平臺”和“合約平臺”指代本發(fā)明的新穎且獨特的平臺,其并不是遺留平臺,而是合約平臺。
合約平臺
圖3是示出被配置成提供合約平臺(諸如示例合約平臺320)的示例系統(tǒng)300的框圖,該合約平臺包括API合約的特定集合(諸如示例合約集合321中的示例合約1-n 323)、這些合約定義的API(諸如合約API 1-n 324)、以及它們的底層可執(zhí)行模塊(諸如示例合約可執(zhí)行模塊1-n 322)。示例主機(jī)310可以是任何類型的(多個)計算設(shè)備,但是在該示例中,提供了合約平臺320,其沒有提供一個單體平臺API,而是托管合約集合321,其中每個合約展現(xiàn)其自己的API(諸如合約1的API 324)并且與其相對應(yīng)的可執(zhí)行模塊(諸如合約1的合約執(zhí)行模塊1)相關(guān)聯(lián)。合約平臺的一個示例是基于API合約的一個或多個集合的合集的操作系統(tǒng)。
被設(shè)計為在合約平臺上操作的應(yīng)用(諸如示例應(yīng)用330)通常包括它們操作所需的合約的集合的指示(諸如指示331)。因此,這樣的應(yīng)用并不依賴于任何(多個)特定平臺,取而代之,而是需要合約的特定集合。因此,應(yīng)用是“與平臺無關(guān)的”,并且能夠在提供所需合約的任何平臺上操作,該合約通常表示比單體平臺API小得多的功能集合。
合約的使用大大減少了以上所討論的開發(fā)人員的問題。例如,通過開發(fā)需要具體合約的應(yīng)用而不是針對特定平臺開發(fā)該應(yīng)用,該應(yīng)用能夠無論現(xiàn)在還是在未來,在提供所需合約的任何平臺、特定平臺的任何變型以及特定平臺的任何版本上進(jìn)行操作。這包括現(xiàn)在未知的平臺(諸如未來平臺),以及為新設(shè)備轉(zhuǎn)換或開發(fā)的平臺。
本文使用的術(shù)語“所提供的合約集合”或類似術(shù)語指代由特定平臺所提供的合約的集合。本文使用的術(shù)語“所需合約集合”或類似術(shù)語指代特定應(yīng)用所需要的合約的集合。一般來說,對于在特定合約平臺上進(jìn)行操作的特定應(yīng)用而言,所提供的合約的集合必須包括所需要的合約的集合。
API合約
圖4是示出API合約410的示例圖示的框圖。API合約既是開發(fā)時間的可執(zhí)行組件,又是運行時間的可執(zhí)行組件,其定義了在運行時間由對應(yīng)的(多個)合約實施模塊完全支持的API的特定集合。合約通常展現(xiàn)使得應(yīng)用等能夠訪問和利用該合約所提供的功能的API 411。在一個示例中,API合約可以驗證其(多個)實施模塊的存在性和版本。在另一示例中,API合約的聲明利用其(多個)可執(zhí)行模塊進(jìn)行構(gòu)建。
合約通常還包括標(biāo)識信息412。這樣的標(biāo)識信息可以是標(biāo)識符的形式,其在特定命名空間中的API合約間是唯一的。在一個示例中,該標(biāo)識信息被實施為唯一名稱。可替代地,該標(biāo)識符可以以其它形式來實施,諸如唯一的標(biāo)識編號等。在一個示例中,標(biāo)識信息412是合約410的(多個)屬性。該(多個)屬性可以是經(jīng)由API 411和/或可執(zhí)行代碼416可訪問的。唯一標(biāo)識符可以是通用唯一標(biāo)識符(“UUID”)。
合約通常還包括版本信息413。這樣的版本信息在值上可以是數(shù)字的,從而暗示順序。在一個示例中,該版本信息包括合約本身的當(dāng)前版本。版本信息413可以是合約410的(多個)屬性。該(多個)屬性可以是經(jīng)由API 411和/或可執(zhí)行代碼416可訪問的。關(guān)于版本控制信息413的附加細(xì)節(jié)在以下的“API合約的版本控制”部分中提供。
合約通常還包括依賴性信息414。在一個示例中,這樣的依賴性信息指示合約410所具有的任何合約依賴性。也就是說,合約410中對另一合約的任何引用都構(gòu)成合約依賴性。在一個示例中,這樣的引用是從合約410中的一個類型到另一合約中的一個類型。所有這樣的合約依賴性通常都包括在依賴性信息414中。這樣的信息可以用于確定合約410所具有的任何合約依賴性,使得在加載合約410時,所依賴的合約也可以被加載。在一個示例中,依賴性信息414是合約410的(多個)屬性。該(多個)屬性可以是經(jīng)由API 411和/或可執(zhí)行代碼416可訪問的。
合約通常還包括定義信息415。在一個示例中,這樣的定義信息415以類型(即運行時間類、方法、結(jié)構(gòu)、接口、枚舉等)的形式定義合約410的(多個)特征,其中該(多個)特征一般由與合約相關(guān)聯(lián)的可執(zhí)行模塊實施。在一個示例中,定義信息415是合約410的(多個)屬性。該(多個)屬性可以是經(jīng)由API 411和/或可執(zhí)行代碼416可訪問的。
合約通常還包括可執(zhí)行代碼416。在一個示例中,這是使得合約410能夠?qū)Σ樵兗邦愃莆镒龀鲰憫?yīng)的可執(zhí)行代碼。合約的各種屬性可以是經(jīng)由它的可執(zhí)行代碼416(諸如經(jīng)由API 411)可訪問的。
每個API合約一般顯現(xiàn)出以下特性:
合約定義特定特征。每個合約一般針對特定的(多個)特征而定義API集合,并且因此定義該特征。本文使用的術(shù)語“特征”一般指代由合約以編程方式提供給應(yīng)用程序或類似物的能力,作為示例,諸如文件操作、聯(lián)網(wǎng)、打印、顯示、語音識別、地理定位等。(多個)特征可以作為諸如API、對象、類型、結(jié)構(gòu)、枚舉、類、方法、過程、協(xié)議等的編程構(gòu)造的某種組合而被提供。例如,文件操作特征可以作為用于打開、關(guān)閉、讀取和寫入文件的API而被提供。
合約被完整實施或者根本不實施。為了確保所需功能是可用的,針對特定特征的合約被完整實施。也就是說,針對特定特征的API集合由合約所定義,并且該API集合的功能由對應(yīng)的合約實施模塊完全實施。以這種方式,需要特定合約的任何應(yīng)用可以確定地預(yù)見到其特征將如預(yù)期地操作。
合約以增加的方式(additively)被進(jìn)行版本控制。特定合約的每個較新版本能夠添加到該合約的先前版本,但是該較新版本繼續(xù)定義先前版本中所定義的所有內(nèi)容。以這種方式,需要特定合約的特定版本的任何應(yīng)用都可以確定地預(yù)見到其特征將利用該版本或任何較新版本如所預(yù)期地操作。另外,例如,如果合約的版本5存在于平臺上,則版本1至4(所有先前版本)及其(多個)可執(zhí)行模塊(一個或多個)由于該增加的版本控制特性而也是存在的。
合約在運行時間可被發(fā)現(xiàn)。應(yīng)用可以查詢以確定是否能夠獲得其所需的(多個)合約。因為合約是運行時間的組件,所以它能夠在運行時間被發(fā)現(xiàn)并且提供有關(guān)其自身的信息,諸如其版本、其所定義的API集合等。因此,應(yīng)用可以被開發(fā)為在開發(fā)時至少需要合約的版本1,而且還要在運行時確定版本3是否可用,如果版本3可用,則在其可用時,對其以及任何附加特征加以利用。
合約在開發(fā)時間可被發(fā)現(xiàn)。諸如編譯器、開發(fā)環(huán)境等的開發(fā)工具能夠查詢以確定源代碼中所暗示和/或指示的(多個)合約是否可用。在一個示例中,基于在源代碼中引用的類型、結(jié)構(gòu)、API和/或其它構(gòu)造來指示(多個)合約。因為合約是開發(fā)時間的組件,所以它能夠被開發(fā)工具發(fā)現(xiàn)并提供有關(guān)其自身的信息,諸如其版本、其所定義的API集合等。因此,開發(fā)工具能夠?qū)崟r地驗證所需的(多個)合約是否包括在正被開發(fā)的源代碼中所引用的那個API。
合約可以依賴于另一合約。合約可以可選地對另一個(或多個)合約具有依賴性。在一個示例中,由于第一合約中的類型引用第二合約中的類型,這種依賴性可以存在。因此,合約的集合形成有向依賴性圖。在一個示例中,可能需要這樣的有向依賴性圖以避免循環(huán)。在另一示例中,可以允許合約“A”依賴于合約“B”,并且同時允許合約“B”依賴于合約“A”。
合約由其所提供的功能來定義。例如,給定FileManipContract v2,此合約由其提供給應(yīng)用的API、類型、對象等所定義。因此,無論FileManipContract v2合約的實施所針對的平臺/設(shè)備組合如何,從應(yīng)用的角度來看,每個FileManipContract v2合約都提供了相同的功能。以這種方式,應(yīng)用能夠依賴于特定合約,并且因此變?yōu)榕c平臺無關(guān)。也就是說,根據(jù)定義,需要FileManipContract v2的應(yīng)用將在提供FileManipContract v2合約的任何平臺/設(shè)備組合上正確操作。特定的平臺和設(shè)備是不相關(guān)的,只要它們提供FileManipContract v2即可。因此,應(yīng)用將在所有服務(wù)器、服務(wù)、臺式機(jī)、大型機(jī)、蜂窩電話、平板計算機(jī)、板式計算機(jī)、烤面包機(jī)、咖啡機(jī)、汽車、超級計算機(jī)上以及在任何其它平臺/設(shè)備組合上正確操作,只要該組合提供FileManipContract v2合約即可。此概念由本文使用的術(shù)語“與平臺無關(guān)”來體現(xiàn),并且指示合約應(yīng)用和合約之間的操作依賴性,而不是如常規(guī)應(yīng)用情形的應(yīng)用和平臺/設(shè)備組合之間的。
本文使用的術(shù)語“API合約”和“合約”一般指代同一事物。本文使用的術(shù)語“開發(fā)時間”指代代碼及類似物在代碼開發(fā)期間被匯編、編譯、鏈接等以便產(chǎn)生此類應(yīng)用的時間。本文使用的術(shù)語“運行時間”是指應(yīng)用諸如在平臺上運行(執(zhí)行)的時間。
API合約的應(yīng)用運行時間的使用
合約應(yīng)用能夠指示平臺為了使應(yīng)用以最低限度正確運行所必須提供的最低功能。在一個示例中,這通過應(yīng)用指示其所需的合約集合而并非需要特定平臺或平臺版本來完成。例如,合約應(yīng)用可以在任何平臺或平臺版本上操作,只要其包括所需的合約集合而與特定設(shè)備或設(shè)備類型無關(guān),其中應(yīng)用和平臺在該特定設(shè)備或設(shè)備類型上進(jìn)行操作。以這種方式,合約應(yīng)用指定在運行時間確定的所需合約集合,并且通過這樣做,這樣的應(yīng)用基本上變?yōu)椤芭c平臺無關(guān)”。也就是說,合約應(yīng)用可以在任何平臺和該平臺的任何版本上運行,只要其包括該應(yīng)用所需的合約集合。
另外,除了以最低限度操作之外,合約應(yīng)用也還能夠在運行時間發(fā)現(xiàn)可選合約。并且因為合約一般定義了特定特征,所以這意味著合約應(yīng)用可以在運行時間輕易地檢驗特定特征在其當(dāng)前運行的任何平臺上的存在性。這種在運行時間查詢可選合約或特征的能力使得應(yīng)用能夠輕易地確定要在運行時間提供什么功能,而不是像常規(guī)應(yīng)用那樣在開發(fā)時間就固定了它們的功能范圍。因此,特定平臺經(jīng)由可用合約而使得可用的功能越多,合約應(yīng)用在運行時間所能夠發(fā)現(xiàn)、利用和展現(xiàn)的功能就越多。
圖5是示出用于在運行時間確定API合約的可用性的示例方法500的框圖。一般地,可以在運行時間以編程方式確定合約及其對應(yīng)的可執(zhí)行模塊的可用性。任何應(yīng)用、平臺或其它實體都能夠執(zhí)行運行時間的查詢以確定給定環(huán)境中的合約的可用性。在一個示例中,可以依下述內(nèi)容執(zhí)行這樣的查詢。
框510通常指示合約應(yīng)用(或者平臺或其它實體)諸如以任何常規(guī)的方式開始執(zhí)行。在一個示例中,應(yīng)用在特定平臺和設(shè)備上(諸如在運行特定的基于合約的操作系統(tǒng)(平臺)的特定計算機(jī)(設(shè)備)上)開始執(zhí)行。一旦執(zhí)行,方法500通常在框520處繼續(xù)。
框520通常指示正在執(zhí)行的應(yīng)用查詢其所需合約集合。這種所需合約集合通常包括至少一個所需API合約。該查詢可以針對平臺進(jìn)行,或者針對能夠?qū)﹃P(guān)于特定平臺上可用的合約的查詢做出響應(yīng)的任何其它實體來進(jìn)行。查詢可以以API調(diào)用、發(fā)現(xiàn)協(xié)議的形式或者任何其它被支持的形式來進(jìn)行??梢詫φ麄€合約集合(即,集合中的所有合約)進(jìn)行單個查詢,或者可以進(jìn)行多個查詢,每個查詢針對該集合的子集。這樣的查詢通常包括所需合約集合中的(多個)合約的名稱、標(biāo)識符等。另外,查詢可以包括(多個)合約的版本號。在一個示例中,這樣的版本號是最低的可接受的版本號。一旦應(yīng)用已被查詢,方法500通常在框530處繼續(xù)。
框530通常指示所查詢實體確定所指示的(多個)合約或合約集合是否可用。在一個示例中,這樣的確定包括驗證可用合約的名稱/標(biāo)識符和版本與查詢中所指定的名稱/標(biāo)識符和版本相匹配。在一個示例中,匹配版本意味著可用版本與查詢中所指定的版本相同。在另一示例中,匹配版本意味著可用版本與查詢中所指定的版本相同或比查詢中所指定的版本更新。在又一示例中,查詢還指示所需要的是精確匹配還是“相同或更新”的匹配。如果確定與查詢中所指定的(那些)合約匹配的(多個)合約可用,則通常向查詢實體(未示出)提供肯定的指示,并且方法500通常在框550處繼續(xù)。否則,通常向查詢實體(未示出)提供否定的指示,并且方法500通常在框540處繼續(xù)。
在提供肯定的指示時,還可以提供在查詢中指定的每個合約的(多個)可用版本。在提供否定的指示時,還可以提供在查詢中指定的每個合約的(多個)可用版本(如果有的話),并且還可以指示在任何版本中都不可用的任何所指定的合約。
框540通常指示應(yīng)用響應(yīng)于否定的指示而結(jié)束執(zhí)行,該否定的指示意味著所需合約集合中的至少一個合約是不可用的。一般來說,當(dāng)應(yīng)用的所需合約中的任何一個都不可用時,則該應(yīng)用不能正確操作并因此被終止。不可用的指定合約通常意味著沒有可用版本與所指定合約的版本相匹配,或者所指定合約在任何版本中都可用。
框550通常指示應(yīng)用查詢(多個)可選合約。在一個示例中,應(yīng)用在沒有可選合約的情況下通常如所預(yù)期的那樣操作,但是如果可選合約可用,則可能能夠提供增強(qiáng)或附加的功能。例如,可選合約可以是所需合約的較新版本,其提供較新功能或者可以提供可選的附加功能。針對可選合約的查詢可以在應(yīng)用的執(zhí)行期間的任何時點發(fā)生,例如包括在接近步驟520時發(fā)生。一旦應(yīng)用已經(jīng)查詢,則方法500通常在框560處繼續(xù)。
框560通常指示所查詢的實體確定所指示的(多個)合約是否可用。在一個示例中,這樣的確定包括如在步驟530中那樣,驗證可用合約的版本與查詢中所指定的版本相匹配。如果確定與查詢中所指定的那個(那些)合約相匹配的(多個)合約可用,則如步驟530中那樣,通常向查詢實體提供肯定的指示,并且方法500通常在框570處繼續(xù)。否則,如步驟530中那樣,通常向查詢實體提供否定的指示,并且方法500通常在框580處繼續(xù)。
框570通常指示應(yīng)用能夠響應(yīng)于意味著可選合約可用的肯定的指示,使用由可用的可選合約所提供的功能。一般來說,當(dāng)可選合約可用時,則應(yīng)用能夠利用該合約提供的任何功能。
框580通常指示應(yīng)用響應(yīng)于意味著可選合約不可用的否定的指示,不嘗試使用由不可用的可選合約所提供的功能。一般來說,當(dāng)可選合約不可用時,則應(yīng)用不能夠利用該合約提供的任何功能。
API合約的開發(fā)時間的使用
API合約的開發(fā)時間的使用可以提供改進(jìn)的開發(fā)人員體驗。這是因為開發(fā)環(huán)境能夠以與諸如上面描述的任何其它應(yīng)用相同的方式來查詢API合約。目前的開發(fā)環(huán)境通常將源代碼編輯器、編譯器、調(diào)試器等組合到單個集成開發(fā)環(huán)境之中(此處獨立且統(tǒng)一地稱為“工具”)。這樣的工具可以被增強(qiáng)以獲知API合約,因此使得能夠顯著增強(qiáng)常規(guī)的開發(fā)人員體驗。特別地,這樣的工具通常能夠編譯合約應(yīng)用,只要所需API合約在開發(fā)環(huán)境中可用(其中編譯不需要對應(yīng)的可執(zhí)行模塊),而所編譯的合約應(yīng)用的調(diào)試和執(zhí)行通常需要API合約和對應(yīng)的可執(zhí)行模塊兩者都存在于目標(biāo)環(huán)境(所編譯的合約應(yīng)用意在被調(diào)試和/或執(zhí)行的環(huán)境)之中。
在一些情境中,工具由開發(fā)人員在與合約應(yīng)用正被開發(fā)所針對的(多個)目標(biāo)平臺不同的平臺上使用。在這種情況下,開發(fā)平臺可以提供與合約應(yīng)用在目標(biāo)平臺上將最終需要的那些有所不同的API合約。
一般地,合約應(yīng)用的源代碼包括暗示和/或指示應(yīng)用所需的每個合約及其最低版本的(多個)引用,其中這些所需合約中的每一個的合集包括該應(yīng)用的所需合約集合。在一個示例中,這樣的引用不過是源代碼中針對諸如類型、結(jié)構(gòu)、方法、API等的一些構(gòu)造的引用。在此示例中,工具推斷提供每個所引用的構(gòu)造的具體合約。在另一示例中,在源代碼中明確指示所需合約。在又一示例中,支持合約推斷和指示的任何組合。這些引用使得開發(fā)環(huán)境能夠在源代碼編輯環(huán)境中指示哪些所需合約存在于開發(fā)環(huán)境中而哪些不存在。此外,還可以為源代碼中的API引用(諸如靜態(tài)API引用)提供指示,從而指示所引用的API是否被所需合約集合所支持,被集合中的哪個合約所支持,被該合約的什么版本所支持等等。以這種方式,開發(fā)人員可以在編輯源代碼時快速地看到正在使用的API是否被所需合約集合所支持。
一般地,每個API合約包括使得其它實體能夠以編程方式發(fā)現(xiàn)其存在、查詢其屬性、以及枚舉其定義的API、類型、對象等的可執(zhí)行代碼。這是其中API合約與常規(guī)頭文件及類似物有所不同的一種方式,該頭文件及類似物不過是不包括可執(zhí)行代碼的被動文本文件。此外,合約平臺(及其軟件開發(fā)工具包(“SDK”))通常包括描述作為平臺的部分而被包括的每個API合約的元數(shù)據(jù)。還可以提供發(fā)現(xiàn)合約,其響應(yīng)于發(fā)現(xiàn)查詢,經(jīng)由其API,通過合約應(yīng)用等來訪問元數(shù)據(jù)。因此,API合約的可用性通常(經(jīng)由其API和/或經(jīng)由包括API合約的平臺所提供的發(fā)現(xiàn)合約和元數(shù)據(jù))直接可被發(fā)現(xiàn)。
圖6是示出用于由API合約對可用性查詢等做出響應(yīng)的示例方法600的框圖???10通常指示合約以編程方式接收可用性查詢。任何開發(fā)環(huán)境、應(yīng)用、平臺或其它實體都可以執(zhí)行運行時間查詢以確定給定環(huán)境中的合約的可用性,該給定環(huán)境或者是當(dāng)前執(zhí)行的環(huán)境或所期望的目標(biāo)執(zhí)行環(huán)境。該查詢可以以API調(diào)用的形式、經(jīng)由發(fā)現(xiàn)協(xié)議、或者以任何其它所支持的形式被接收。一旦接收到這樣的查詢或類似物,方法600通常在框620處繼續(xù)。
框620通常指示接收合約對該可用性查詢做出響應(yīng)。在一個示例中,這樣的響應(yīng)是肯定的指示。在另一示例中,這樣的響應(yīng)包括合約的信息和/或?qū)傩?,諸如其標(biāo)識符、名稱、版本等。另外,根據(jù)該可用性查詢的確切性質(zhì),或者響應(yīng)于不同查詢,響應(yīng)可以包括關(guān)于該合約的信息,諸如其屬性、API、類型以及其定義的對象的任何組合,以及有關(guān)它的可執(zhí)行模塊的信息,諸如其標(biāo)識符、名稱、版本、位置等。
API合約的平臺使用
合約平臺一般由其提供的合約集合定義。例如,與具有其單體API的常規(guī)操作系統(tǒng)不同,基于合約的操作系統(tǒng)經(jīng)由被提供的合約集合展現(xiàn)其提供的功能。常規(guī)地,平臺的具體版本定義其單體API。但是利用合約平臺,所提供的特定版本的合約的集合(所提供的合約集合)一般定義該平臺的特定版本。
此外,與不同設(shè)備兼容的多個不同平臺可以各自提供特定合約的特定版本。例如,不同的平臺/設(shè)備組合中的每一個可以提供文件操作合約的v2。雖然對應(yīng)于這些合約的實施模塊可以針對與它們相應(yīng)的平臺/設(shè)備組合的兼容性來定制,但是這些v2文件操作合約中的每一個從應(yīng)用的角度提供相同的文件操作功能。因此,合約平臺及其所提供的合約集合使得應(yīng)用能夠成為“與平臺無關(guān)的”。
圖7是示出用于由合約平臺對合約可用性查詢等做出響應(yīng)的示例方法700的框圖。在一個示例中,特定平臺包括其提供的合約的枚舉。這樣的枚舉可以以足以指示所提供的合約集合的任何適當(dāng)形式來提供,并且可以包括諸如列表的被動形式和/或諸如發(fā)現(xiàn)協(xié)議和/或可調(diào)用API的主動形式。方法700是主動形式的示例。
框710通常指示合約平臺諸如以任意的常規(guī)方式開始執(zhí)行。在一個示例中,合約平臺可以是在計算設(shè)備上引導(dǎo)的基于合約的操作系統(tǒng)。一旦平臺正在執(zhí)行,并且在該平臺執(zhí)行期間的一些時點處,方法700通常在框720或760處繼續(xù)。
框720通常指示平臺接收針對特定合約集合的查詢或類似物。該查詢可以源自于應(yīng)用、平臺本身,或者任何其它實體??梢砸訟PI調(diào)用的形式、發(fā)現(xiàn)協(xié)議、或者任意其它所支持的形式進(jìn)行查詢??梢越邮蔗槍φ麄€合約集合(即該集合中的所有合約)的單個查詢,或者可以接收各自針對集合的子集的多個查詢。這樣的查詢通常包括合約集合中的(多個)合約的名稱、標(biāo)識符等。此外,查詢可以包括每個合約的版本號。在一個示例中,這樣的版本號是最低可接受的版本號。一旦接收到該查詢,方法700通常在框720處繼續(xù)。
框730通常指示平臺確定特定合約集合是否可用。在一個示例中,這樣的確定包括驗證可用合約的名稱/標(biāo)識符和版本與查詢中所指定的名稱/標(biāo)識符和版本相匹配。在一個示例中,匹配版本意味著可用版本與查詢中指定的版本相同。在另一示例中,匹配版本意味著可用版本與查詢中指定的版本相同或比查詢中指定的版本更新。在又一示例中,該查詢還指示所需要的是精確匹配還是"相同或更新"的匹配。如果確定與查詢中指定的那個(那些)匹配的(多個)合約可用,則通常向查詢實體提供肯定的指示,如框750所指示的。否則,通常向查詢實體提供否定的指示,如框740所指示的。
框760通常指示平臺接收針對特定合約的查詢或類似物。該查詢可以源自于應(yīng)用、平臺本身、或者任何其它實體。可以以API調(diào)用的形式、發(fā)現(xiàn)協(xié)議、或者任何其它所支持的形式進(jìn)行查詢。這樣的查詢通常包括合約的名稱、標(biāo)識符等。此外,查詢可以包括合約的版本號。在一個示例中,這樣的版本號是最低可接受的版本號。一旦接收到查詢,方法700通常在框770處繼續(xù)。
框770通常指示平臺確定特定合約是否可用。在一個示例中,這樣的確定包括驗證可用合約的名稱/標(biāo)識符和版本與查詢中所指定的名稱/標(biāo)識符和版本相匹配。在一個示例中,匹配版本意味著可用版本與查詢中指定的版本相同。在另一示例中,匹配版本意味著可用版本與查詢中指定的版本相同或比查詢中指定的版本更新。在又一示例中,該查詢還指示所需要的是精確匹配還是“相同或更新”的匹配。如果確定與查詢中所指定的相匹配的合約可用,則通常向查詢實體提供肯定的指示,如框790所指示的。否則,通常向查詢實體提供否定的指示,如框780所指示的。
在提供肯定的指示時,如框750和790所指示的,還可以提供在查詢中所指定的每個合約的(多個)可用版本。在提供否定的指示時,如框740和780所指示的,還可以提供在查詢中所指定的每個合約的(多個)可用版本(如果有的話),并且還可以指示在任何版本中都不可用的任何指定的合約。
填充合約平臺
圖8是示出類似于圖3的示例系統(tǒng)300的示例系統(tǒng)800的框圖,示例系統(tǒng)800被配置成提供諸如示例填充合約平臺820的填充合約平臺,其包括API合約的特定集合(諸如示例合約集合321中的示例合約1-n 323),這些合約定義的API(諸如合約API 1-n 324),以及它們的底層可執(zhí)行模塊(諸如示例合約可執(zhí)行模塊1-n 822)。示例主機(jī)810可以是任何類型的(多個)計算設(shè)備,但是在此示例中,除了提供一個單體平臺API(諸如API 224)之外,提供了填充合約平臺820,其包括合約集合321,其中每個合約展現(xiàn)其自己的API(諸如針對合約1的API 324),并且與它的對應(yīng)的可執(zhí)行模塊(諸如針對合約1的合約執(zhí)行模塊1)相關(guān)聯(lián)。
一般來說,從合約應(yīng)用330等的角度來看,示例平臺820提供了與圖3的示例平臺320相同的合約集合,并且因此提供了與其相同的功能。另一方面,平臺800包括具有其單體API 224的遺留平臺220,諸如常規(guī)操作系統(tǒng),其被可執(zhí)行模塊822填充到合約集合321。以這種方式,遺留平臺可以被“升級”以支持合約應(yīng)用。
特別地,待被填充平臺820提供的每個合約(諸如合約l-n 323)包括諸如實施模塊1-n 822的實施模塊,其將遺留平臺的單體API 224的多個部分可執(zhí)行地映射到被提供的合約323的合約API 324。例如,給定FileManipContract v2,該合約被定義了其提供給應(yīng)用的某些API、類型、對象等。因此,無論FileManipContract v2合約被實施以支持的平臺/設(shè)備組合如何,每個FileManipContract v2合約從應(yīng)用的角度都提供相同的功能。在另一示例中,實施模塊1-n 822被配置為利用遺留平臺220的各種遺留可執(zhí)行模塊222來執(zhí)行遺留平臺功能。這樣的遺留可執(zhí)行模塊可以包括形式為動態(tài)鏈接庫(“DLL”)、驅(qū)動程序和其它遺留程序模塊等的可執(zhí)行代碼。在這樣的示例中,在填充可執(zhí)行模塊722和遺留可執(zhí)行模塊222之間幾乎不可能具有一一對應(yīng)關(guān)系。
但是在此示例中,F(xiàn)ileManipContract v2的可執(zhí)行模塊簡單地將合約所定義的功能映射到遺留平臺的單體API 224所提供的功能。因此,示例應(yīng)用330能夠經(jīng)由對應(yīng)的可執(zhí)行模塊來利用由所提供的FileManipContract v2合約定義的文件操作功能。這是因為這樣的填充可執(zhí)行模塊將合約定義的文件操作功能可執(zhí)行地映射到或映射自遺留平臺的單體AP 224所提供的功能。因此,遺留平臺最終提供該功能,因為填充可執(zhí)行模塊將該功能可執(zhí)行地映射到或映射自合約定義的功能。以這種方式,合約和填充可執(zhí)行模塊可以使得遺留平臺能夠支持合約應(yīng)用。
API合約的版本控制
一般來說,API合約被版本控制(versioned)。在一個示例中,頂級合約類型定義API合約并且具有相關(guān)聯(lián)的合約和當(dāng)前版本屬性。在一個示例中,合約屬性標(biāo)識出合約類型相關(guān)聯(lián)的API合約,并且當(dāng)前版本屬性標(biāo)識出API合約的當(dāng)前版本。在該示例中,并且一般地,當(dāng)前版本大于或等于與合約相關(guān)聯(lián)的所有類型的版本。
除了API合約本身的版本控制之外,合約所定義的每個元素通常指示其被添加到該合約的哪個版本。例如:
示例API合約Windows.FooContract的以上偽代碼定義了運行時間類Xyz(其被添加到版本3的合約),并進(jìn)一步定義了IXyz2接口(其被添加到合約的版本5處的Xyz)。在該示例中,合約的當(dāng)前版本將至少為版本5。在類似的示例中:
以上偽代碼說明了被添加至版本5的Windows.FooContract的示例枚舉InterestingOddNumbers,Seven字段在該合約的版本9處被添加。在該示例中,合約的當(dāng)前版本將至少為版本9。
以下規(guī)則一般地應(yīng)用于API合約的版本控制:
API合約以增加的方式進(jìn)行版本管理。隨著時間的推移,新類型可以被添加到API合約中,合約中的類型可以被版本控制,并且類型可以從一個合約移動到另一個合約。但是沒有類型或者類型的方面能夠另外從合約中被移除。在類型從一個合約移動到另一個合約的情況下,它在邏輯上駐留在源合約(該類型從該合約移動)中。在該示例中,原始(源)合約包含指向移動的類型在目的合約中的當(dāng)前位置的移動的類型的轉(zhuǎn)發(fā)聲明。這允許這樣的移動類型僅被定義一次從而避免由于該類型的多個聲明所導(dǎo)致的不一致。短語合約中的“在邏輯上駐留”通常指示轉(zhuǎn)發(fā)聲明駐留在合約中。注意,第一合約中的轉(zhuǎn)發(fā)聲明可以指示第二合約,后者包括對第三合約的另一轉(zhuǎn)發(fā)聲明等等,直到定義特定的移動類型等的合約被指示。
API合約被完整實施或者根本不實施。一般地,平臺必須完整地實施合約或者根本不實施該合約。這保證了找到特定合約的應(yīng)用能夠成功地假設(shè)該合約(及其對應(yīng)的(多個)可執(zhí)行模塊)被完全實施并且提供所預(yù)期的完整功能。
在不同API合約的多個版本之間沒有數(shù)字關(guān)系。給定兩個合約A和B,并不能基于這兩個合約的相對版本號做出有關(guān)該合約的假設(shè)。
對于API合約的改變要求增加其版本。一般地,當(dāng)合約中的類型等被增加或改變時,合約的當(dāng)前版本被增加。
合約中的類型包括版本。合約中的每個類型包括類型版本屬性,其指示合約的版本,其中在該版本處該類型被添加至該合約。
除了運行時間類和枚舉之外,合約中的所有類型是不可變的。一旦被定義,合約中的類型(除了運行時間類和枚舉)就被固定并且始終不能改變。
合約中的運行時間類和枚舉類型是不可變的或者以增加的方式進(jìn)行版本管理。也就是說,合約中的運行時間類和/或枚舉類型能夠添加(多個)新的方面,但是并不能從該類型去除或者以其它方式改變現(xiàn)有的方面。
結(jié)論
在第一示例中,一種方法在包括至少一個處理器和存儲器的計算設(shè)備上執(zhí)行,該方法用于經(jīng)由應(yīng)用編程接口(“API”)合約以編程方式向合約應(yīng)用提供特征,該方法包括:由該計算設(shè)備托管該API合約,該API合約被配置成以編程方式向該應(yīng)用提供該特征,其中該API合約包括該API合約的標(biāo)識信息、該API合約的版本信息和該特征、定義該特征的多個方面的定義信息、以及被配置成對有關(guān)該API合約的查詢做出響應(yīng)的可執(zhí)行代碼。
在第二示例中,一種包括計算設(shè)備和至少一個程序模塊的系統(tǒng),該計算設(shè)備和該至少一個程序模塊被共同配置成執(zhí)行動作,該動作用于經(jīng)由應(yīng)用編程接口(“API”)合約以編程方式向合約應(yīng)用提供特征,該計算設(shè)備包括至少一個處理器和存儲器,該動作包括:由該計算設(shè)備托管該API合約,該API合約被配置成以編程方式向該合約應(yīng)用提供該特征,其中該API合約包括該API合約的標(biāo)識信息、該API合約的版本信息和該特征、定義該特征的多個方面的定義信息、以及被配置成對有關(guān)該API合約的查詢做出響應(yīng)的可執(zhí)行代碼。
在第三示例中,至少一個計算機(jī)可讀介質(zhì)儲存計算機(jī)可執(zhí)行指令,該計算機(jī)可執(zhí)行指令在由計算設(shè)備的至少一個處理器執(zhí)行時使得該計算設(shè)備執(zhí)行動作,該動作經(jīng)由應(yīng)用編程接口(“API”)合約以編程方式向合約應(yīng)用提供特征,該計算設(shè)備包括至少一個存儲器,該動作包括:由該計算設(shè)備托管該API合約,該API合約被配置成以編程方式向該應(yīng)用提供該特征,其中該API合約包括該API合約的標(biāo)識信息、該API合約的版本信息和該特征、定義該特征的多個方面的定義信息、以及被配置成對有關(guān)該API合約的查詢做出響應(yīng)的可執(zhí)行代碼。
在第一、第二和第三示例中,該API合約在運行時間可被發(fā)現(xiàn);和/或該API合約與實施該特征的至少一部分的對應(yīng)可執(zhí)行模塊相關(guān)聯(lián);和/或該API合約所定義的類型包括類型版本屬性,其指示該合約的版本,其中在該版本處,該類型被添加至該合約;和/或版本信息包括該API合約的當(dāng)前版本;和/或該當(dāng)前版本等于或大于由被包括在定義信息中的任何類型版本屬性所指示的所有版本;和/或在該定義信息中定義的任何類型是不可變的或者以增加的方式被版本控制。
在第四示例中,一種方法在包括至少一個處理器和存儲器的計算設(shè)備上執(zhí)行,該方法用于經(jīng)由應(yīng)用編程接口(“API”)合約的至少一個集合,以編程方式向合約應(yīng)用提供合約平臺的特征,該方法包括:由該計算設(shè)備托管該API合約的至少一個集合,該API合約各自被配置成以編程方式向該合約應(yīng)用提供該特征之一,其中每一個API合約包括該每一個API合約的標(biāo)識信息、該每一個API合約的版本信息和它的所提供的特征、定義它的所提供的特征的多個方面的定義信息、以及被配置成對有關(guān)該每一個API合約的查詢做出響應(yīng)的可執(zhí)行代碼。
在第四示例中,一種包括計算設(shè)備和至少一個程序模塊的系統(tǒng)該計算設(shè)備和該至少一個程序模塊共同配置成執(zhí)行動作,該計算設(shè)備包括至少一個處理器和存儲器,該動作與該方法的步驟一致;和/或至少一個計算機(jī)可讀介質(zhì)儲存計算機(jī)可執(zhí)行指令,該計算機(jī)可執(zhí)行指令在由計算設(shè)備的處理器執(zhí)行時使得該計算設(shè)備執(zhí)行動作,該計算設(shè)備包括至少一個存儲器,該動作與該方法的步驟一致。
在第五示例中,一種方法在包括至少一個處理器和存儲器的計算設(shè)備上執(zhí)行,該方法用于由合約應(yīng)用經(jīng)由應(yīng)用編程接口(“API”)合約以編程方式訪問所提供的特征,該方法包括:由該計算設(shè)備執(zhí)行該合約應(yīng)用,該合約應(yīng)用被配置成經(jīng)由該API合約以編程方式訪問該特征、該API合約的標(biāo)識信息、該API合約的版本信息和該特征、定義該特征的多個方面的定義信息、以及被配置成對有關(guān)該API合約的查詢做出響應(yīng)的可執(zhí)行代碼。
在第五示例中,一種包括計算設(shè)備和至少一個程序模塊的系統(tǒng),該計算設(shè)備和該至少一個程序模塊共同配置成執(zhí)行動作,該計算設(shè)備包括至少一個處理器和存儲器,該動作與該方法的步驟一致;和/或至少一個計算機(jī)可讀介質(zhì)儲存計算機(jī)可執(zhí)行指令,該計算機(jī)可執(zhí)行指令在由計算設(shè)備的處理器執(zhí)行時使得該計算設(shè)備執(zhí)行動作,該計算設(shè)備包括至少一個存儲器,該動作與該方法的步驟一致。
在第六示例中,一種方法在包括至少一個處理器和存儲器的計算設(shè)備上執(zhí)行,該方法用于由開發(fā)環(huán)境的工具經(jīng)由應(yīng)用編程接口(“API”)合約,以編程方式訪問所提供的特征,該方法包括:由該計算設(shè)備執(zhí)行該工具,其被配置成經(jīng)由該API合約以編程方式訪問該特征、該API合約的標(biāo)識信息、該API合約的版本信息和該特征、定義該特征的多個方面的定義信息、以及被配置成對有關(guān)該API合約的查詢做出響應(yīng)的可執(zhí)行代碼。
在第六示例中,一種包括計算設(shè)備和至少一個程序模塊的系統(tǒng),該計算設(shè)備和該至少一個程序模塊共同配置成執(zhí)行動作,該計算設(shè)備包括至少一個處理器和存儲器,該動作與該方法的步驟一致;和/或至少一個計算機(jī)可讀介質(zhì)儲存計算機(jī)可執(zhí)行指令,該計算機(jī)可執(zhí)行指令在由計算設(shè)備的處理器執(zhí)行時,使得該計算設(shè)備執(zhí)行動作,該計算設(shè)備包括至少一個存儲器,該動作與該方法的步驟一致。
考慮到本發(fā)明和前述示例可被應(yīng)用到的許多可能實施例,應(yīng)當(dāng)認(rèn)知,本文描述的示例意在僅是說明性的并且不應(yīng)該被認(rèn)為對本發(fā)明的范圍進(jìn)行限制。因此,本文描述的本發(fā)明預(yù)見到可以落入權(quán)利要求的范圍之內(nèi)的所有這樣的實施例及其任何等同體。