麻豆精品无码国产在线播放,国产亚洲精品成人AA片新蒲金,国模无码大尺度一区二区三区,神马免费午夜福利剧场

用于分布式版本控制的高效注釋系統(tǒng)的制作方法

文檔序號:11236531閱讀:506來源:國知局
用于分布式版本控制的高效注釋系統(tǒng)的制造方法與工藝



背景技術(shù):

在開發(fā)軟件應(yīng)用時,個體軟件工程師通常針對該軟件應(yīng)用的特定特征進(jìn)行工作。一旦該特征被開發(fā)并測試,包含該特征的源代碼就可以被登記并提交至該軟件應(yīng)用的代碼存儲庫,以使得可以與針對該軟件應(yīng)用進(jìn)行工作的其它軟件工程師共享該特征。為了將功能提交至代碼存儲庫,軟件工程師登記使該特征在其它機器上工作所必需的所有文件變化和文件添加。向軟件應(yīng)用代碼存儲庫的提交可以僅包括一個文件,或者可以包括針對軟件工程師的單獨機器上的特定源代碼文件所作出的一組修改,這些修改應(yīng)當(dāng)被添加至該軟件應(yīng)用代碼存儲庫中所保持的代碼庫。每個提交通常被給定標(biāo)識符。由其標(biāo)識符所標(biāo)識的特定提交可以在給定時間提供代碼存儲庫的快照。該提交內(nèi)的每個文件可以接收與該提交相關(guān)聯(lián)的文件修訂編號。軟件工程師可以從代碼存儲庫中拉取并接受更新,以便獲得包含代碼存儲庫中的最新版本文件的最新提交并確保它們正在代碼庫的源代碼文件的當(dāng)前版本上進(jìn)行工作。

在軟件應(yīng)用開發(fā)的過程中,在查看代碼時,與代碼相關(guān)的附加信息對于理解該代碼的目的、功能、或者對于找到修改該代碼或修復(fù)損壞代碼的方式而可能是相關(guān)的。集成開發(fā)環(huán)境(ide)或文本編輯器可以將該附加信息顯示為對源代碼的注釋。例如,可以突出顯示拼寫錯誤的詞,可以在產(chǎn)生錯誤的代碼旁示出編譯器錯誤,并且可以示出對源代碼文件或目錄的最近更改的列表。注釋可能來自多個來源,諸如靜態(tài)代碼分析、生產(chǎn)系統(tǒng)、拼寫檢查器、或協(xié)作工具。提供注釋的工具針對一個特定文件修訂或提交進(jìn)行操作。然而,只要在稍后提交中的后續(xù)代碼修改不會使該注釋過時,所生成的注釋就可以跨文件修訂或存儲庫快照而保持相關(guān)。

只要所生成的注釋對于軟件工程師有用就使它們能夠跨源代碼文件修訂和代碼提交可用將會是有利的。如發(fā)明人所認(rèn)識到的,應(yīng)當(dāng)存在一種在源代碼存儲庫中跨軟件代碼的提交而有效率且正確地生成并顯示注釋的方式。



技術(shù)實現(xiàn)要素:

本說明書大體上描述了涉及顯示源代碼的技術(shù),并且具體涉及用于使源代碼注釋跨軟件代碼存儲庫提交而可用的方法和系統(tǒng)。

大體上,本說明書中所描述主題的一個方面能夠以計算機實現(xiàn)的方法和系統(tǒng)來體現(xiàn)。一種示例系統(tǒng)包括:一個或多個處理設(shè)備和一個或多個存儲指令的存儲設(shè)備,該指令在被該一個或多個處理設(shè)備執(zhí)行時使得該一個或多個處理設(shè)備實現(xiàn)一種示例方法。一種示例方法包括:接收提交,該提交包括至少一個相對于父提交該已經(jīng)有所更新的文件;識別該至少一個文件的父文件修訂;確定該至少一個文件和所識別的父文件修訂之間的差異;基于所確定的差異來追溯該文件中的每一行的起源;響應(yīng)于確定行已經(jīng)被添加或更改而將該行標(biāo)示為起源并且在該文件的增量責(zé)任數(shù)據(jù)結(jié)構(gòu)中將該行鏈接至其自身;以及將該行上的標(biāo)識符以及該行的起源添加至該文件的增量責(zé)任數(shù)據(jù)結(jié)構(gòu)。

另一種用于跨文件的多個修訂顯示相關(guān)注釋的示例方法包括:接收文件的當(dāng)前修訂;查詢責(zé)任結(jié)構(gòu)以獲得與該文件相關(guān)聯(lián)的責(zé)任數(shù)據(jù),以便根據(jù)先前修訂來確定所述當(dāng)前修訂中的可見行;根據(jù)該先前修訂確定與當(dāng)前修訂中的該可見行相關(guān)聯(lián)的注釋;以及顯示所確定的注釋。

這些和其它實施例能夠可選地包括以下特征中的一個或多個特征。追溯行的起源可以包括:將與該行相關(guān)聯(lián)的父文件修訂追溯至一個父文件修訂,并且將起源信息從該父文件修訂復(fù)制到該行。追溯行的起源可以包括:將與該行相關(guān)聯(lián)的父文件修訂追溯至多個父文件修訂,并且在該增量責(zé)任數(shù)據(jù)結(jié)構(gòu)中將起源信息從被確定為最舊的父文件修訂復(fù)制到該行。被確定為最舊的父文件修訂可以基于與父文件修訂相關(guān)聯(lián)的時間戳來被找到。響應(yīng)于確定至少一個文件中的兩行包含相同的起源,這兩行中的后者可以被標(biāo)示為新的起源行。基于所確定的差異,至少一個文件的行可以被標(biāo)示為所添加的行和所去除的行。可以構(gòu)建布爾查詢以檢查行是否在提交中可見。可以存在判斷布爾查詢是否變得過于復(fù)雜(例如,當(dāng)它超過預(yù)定長度時)的確定,并且如果是,則該查詢可以由快捷標(biāo)簽替換以降低查詢大小和復(fù)雜度。替選地,可以使用二元決策圖來替代布爾查詢,并且可以針對每個提交來創(chuàng)建標(biāo)簽。可以沿著邊從下到上對該二元決策圖進(jìn)行評估以確定行在提交中是否可見。

本發(fā)明的一個或多個實施例的細(xì)節(jié)在僅作為說明而給出的附圖和下面的描述中被給出。本發(fā)明的其它特征、方面、和優(yōu)點將根據(jù)說明書、附圖、和權(quán)利要求書而變得顯而易見。各圖中相似的附圖標(biāo)記和名稱指示相似的元素。

附圖說明

圖1是源代碼內(nèi)的注釋的示例。

圖2是源代碼的提交的示例。

圖3是文件的示例責(zé)任數(shù)據(jù)結(jié)構(gòu)。

圖4是圖示對代碼存儲庫的代碼變化的示例登記的框圖。

圖5a是用于跨文件的多個修訂顯示注釋的示例方法的流程圖。

圖5b是用于創(chuàng)建增量責(zé)任數(shù)據(jù)結(jié)構(gòu)的示例方法的流程圖。

圖6a是文件的父提交的示例。

圖6b是要針對圖5a中所表示的文件提交的當(dāng)前代碼的示例。

圖6c是標(biāo)記確定如圖5b所表示的文件的當(dāng)前狀態(tài)與如圖5a所表示的父提交之間的差異之后的提交的示例。

圖7a是對于圖2的提交#1的標(biāo)記的示例。

圖7b是對于圖2的提交#2的標(biāo)記的示例。

圖7c是對于圖2的提交#3的標(biāo)記的示例。

圖7d是對于圖2的提交#4的標(biāo)記的示例。

圖8a是示例提交圖。

圖8b是提交#1的示例二元描述圖。

圖8c是提交#2的示例二元描述圖。

圖8d是提交#3的示例二元描述圖。

圖8e是提交#4的示例二元描述圖。

圖8f是提交#5的示例二元描述圖。

圖8g是主壓縮的示例。

圖8h是提交#6的示例二元描述圖。

圖8i是提交#7的示例二元描述圖。

圖9a是具有注釋的示例提交圖。

圖9b是圖9a中所示的注釋的標(biāo)簽的示例。

圖9c是圖9a中所示的提交圖的示例倒排索引;

圖9d圖示了具有圖9a所示的注釋的與其相對應(yīng)的文檔的正標(biāo)記。

圖10圖示了示例迭代器類。

圖11圖示了用于找出所有匹配文檔的示例二元描述示圖的實施方式。

圖12是用于跨源代碼文件修訂顯示注釋的示例方法的流程圖。

圖13是圖示示例計算設(shè)備的框圖。

具體實施方式

如以上所討論的,注釋提供關(guān)于源代碼的有用信息,并且只要它們適用于它們所附加的文件行的當(dāng)前版本就應(yīng)當(dāng)可以能夠跨提交使用。注釋能夠視情況而從特定代碼行進(jìn)行添加(或去除)。如圖1所圖示,注釋(103)可以向用戶警示在代碼中仍然存在todo的情況。然而通常而言,當(dāng)代碼行或文件被修改時,難以確定注釋是否仍然能夠適用于該行代碼。因此,常規(guī)系統(tǒng)并不保留跨文件版本的注釋。示例系統(tǒng)可以通過提供在責(zé)任層(blamelayer)存儲注釋的特殊數(shù)據(jù)結(jié)構(gòu)來允許注釋跨提交可用。另外,可以在示例遞增責(zé)任數(shù)據(jù)結(jié)構(gòu)之上實現(xiàn)標(biāo)記方案以使得能夠?qū)μ囟ㄌ峤坏淖⑨屵M(jìn)行搜索和匯總。

在創(chuàng)建源代碼時,軟件開發(fā)者可以對代碼存儲庫執(zhí)行若干提交。例如,如圖2所圖示,根提交可以包括兩個文件:文件#1和文件#2。來自根提交的文件#1的內(nèi)容可以包括行1上的“aaa”,行2上的“bbb”,以及行3上的“ccc”。來自根提交的文件#2的內(nèi)容可以包括在行1上的“aaa”和行2上的“aaa”。第二提交可以從提交#1得出,并通過刪除“aaa”、更改“ccc”、和添加“ddd”來更改文件#1。則文件#1的內(nèi)容可以是:在行1上的“bbb”(來自提交#1),行2上的“cccc”(來自提交#2),以及行3上的“ddd”(來自提交#2)。文件#2可以被更改已包括行1上的“aaa”(來自提交#1),行2上的“aaa”(來自提交#2),行3上的“aaa”(來自提交#1),以及行4上的“bbb”(來自提交#1)。

第三提交可以從提交#1得出,并通過刪除“aaa”、更改“ccc”、添加“ddd”、并添加“eee”來更改文件#1。文件#1的內(nèi)容可以是:行1上的“bbb”(來自提交#1),行2上的“ccccc”(來自提交#3),行3上的“ddd”(來自提交#3),以及行4上的“eee”(來自提交#3)。文件#2可以被更改以包括行1上的“aaa”(來自提交#1),行2上的“aaa”(來自提交#1),在行3上的“aaa”(來自提交#3),以及行4上的“bbb”(來自提交#3)。

第四提交可以是來自提交#2和提交#3二者的子提交(childcommit)。文件#1可以由用戶或版本控制系統(tǒng)融合。文件#1可以包括:行1上的“bbb”(來自提交#1),“cccc”(來自提交#2,用戶可以通過挑選“cccc”而不是“ccccc”來解決沖突的行數(shù)據(jù)),行3上的“ddd”(來自提交#2)——其由于該數(shù)據(jù)可能來自提交#2或提交#3而導(dǎo)致了責(zé)任沖突,以及行4上的“eee”(來自提交#3)。文件#2可以包括:行1上的“aaa”(來自提交#1的行1),行2上的“aaa”(來自提交#1的行2),行3上的“aaa”(來自提交#3的行3),以及行4上的“bbb”(來自提交#2的行3)。

一行源代碼的責(zé)任數(shù)據(jù)包括標(biāo)識該行被引入或被最后修改的提交的信息。例如,在圖2所圖示以及上文所討論的示例中,在提交#4中,文件#1具有行1上的內(nèi)容“bbb”。該內(nèi)容在提交#1中被引入文件#1,因此文件#1的行1的責(zé)任數(shù)據(jù)包括對來自提交#1的文件#1的行2的引用。圖3示出了示例責(zé)任數(shù)據(jù)結(jié)構(gòu),其包括作為行1的代表行(301)的對修訂1(提交#1),行2的引用。

可以在特定提交的一行或多行處創(chuàng)建注釋。關(guān)于特定注釋的任何信息—包括注釋的附件—可以被存儲在該注釋的示例數(shù)據(jù)結(jié)構(gòu)中的責(zé)任層。責(zé)任層將來自一個文件修訂的行映射至其首次被引入的祖先修訂處的行。如果新添加了行,則責(zé)任層將該行映射至其自身。該起源行(或多個起源行)可以對應(yīng)于代碼的后續(xù)修訂中不同的實際行。因此,注釋可以被存儲在最初引入該行的地方。在應(yīng)當(dāng)檢索文件的注釋時,示例系統(tǒng)可以查找存儲在由當(dāng)前文件修訂所引用的行處的所有注釋。

為了針對源代碼中的行的注釋創(chuàng)建快速查找,應(yīng)當(dāng)獲取預(yù)先計算的責(zé)任數(shù)據(jù)并將其存儲在示例責(zé)任數(shù)據(jù)結(jié)構(gòu)中。如上文所提到的,該責(zé)任數(shù)據(jù)結(jié)構(gòu)是從實際行到代表行的映射。使用責(zé)任數(shù)據(jù)結(jié)構(gòu),示例系統(tǒng)可以確定對于其應(yīng)當(dāng)示出注釋的文件的所有代表行。然后,可以找到存儲在這些代表行處的注釋。換言之,可以基于當(dāng)前文件的代表行來確定是否在代碼的特定版本中顯示注釋。責(zé)任數(shù)據(jù)可以包括示出負(fù)責(zé)對文件中的行的特定改變或修訂的提交的數(shù)據(jù)。該增量責(zé)任數(shù)據(jù)結(jié)構(gòu)可以提供快速的代表行查找以快速地確定文件的每一行的負(fù)責(zé)提交(responsiblecommit)。關(guān)于注釋的任何信息—包括該注釋的附件—可以被存儲在責(zé)任層處。

如用于跨文件的多個修訂來顯示相關(guān)注釋的示例方法可以從圖5a所圖示(520)的接收文件的當(dāng)前修訂開始。可以查詢與該文件相關(guān)聯(lián)的責(zé)任結(jié)構(gòu)以獲得當(dāng)前文件中的每行的行引用(522)。然后,該方法可以查找存儲在所引用行處的注釋(524),并且顯示所確定的注釋(526)。

為了找到所有的責(zé)任數(shù)據(jù),直接的方案可以是對于特定提交處可見的所有文件計算責(zé)任信息。如圖4所圖示,可以使用示例提交爬取器(407)來逐個處理提交以便對于應(yīng)用的代碼存儲庫內(nèi)的每個文件確定責(zé)任。示例爬取器(407)可以使用接收后(post-receive)鉤子或類似的通知機制與代碼存儲庫(405)進(jìn)行連接。當(dāng)在代碼存儲庫(405)中發(fā)生提交時,可以經(jīng)由該接收后鉤子或通知機制來通知提交爬取器(407)。然后,該提交的內(nèi)容可以由該提交爬取器從代碼存儲庫進(jìn)行提取。提交的內(nèi)容可以包括對文件的更改。例如,在圖4中,最初在圖1中圖示的文件(100)已經(jīng)被更改為在行15上包括注釋(401)。雖然注釋可以通過靜態(tài)代碼分析得出和/或直接來自于存儲庫變化,但是注釋可以來自其它子系統(tǒng)或者其來源可以被存儲在存儲庫之中的經(jīng)部署且在執(zhí)行的程序。

提交(100)中的文件可以在軟件工程師的本地機器(403)上被改變并且然后被提交至代碼存儲庫(405)。當(dāng)文件(100)被提交至代碼存儲庫(405)時,提交爬取器可以運行以確定需要被創(chuàng)建的責(zé)任數(shù)據(jù)。提交爬取器(407)可以以拓?fù)漤樞蛱幚硖峤唬允沟酶柑峤?parentcommit)先于子提交以便創(chuàng)建示例遞增責(zé)任數(shù)據(jù)結(jié)構(gòu)。

示例提交爬取器(407)可以創(chuàng)建代碼文件的責(zé)任數(shù)據(jù)。所添加的文件僅由新的行組成,其中的每一行都可以標(biāo)示為起源行。例如,如果來自圖1的文件(100)被新提交至代碼存儲庫(405),則所有的行都將在修訂1中被標(biāo)示為起源行。

,用于創(chuàng)建文件的責(zé)任數(shù)據(jù)結(jié)構(gòu)的示例方法從如圖5(501)所圖示的接收至少一個文件開始。一個示例方法可以確定文件是否已經(jīng)被修改(503)。對于被修改的文件,提交爬取器(407)可以識別所有父文件修訂(505),并且找出當(dāng)前文件內(nèi)容和該文件的先前修訂之間的差異以追溯該文件中的每一行的起源(507)。例如,在圖2所圖示以及上文所討論的示例中,在提交#4中,文件#1具有在行3上的內(nèi)容“ddd”。該內(nèi)容在提交#2中被引入至文件#1的行3上,因此文件#1的行3的責(zé)任數(shù)據(jù)包括對來自提交#2的文件#3的行3的引用。圖3示出了包括作為行3的代表行的對修訂2(提交#2),行3的引用的示例責(zé)任數(shù)據(jù)結(jié)構(gòu)。

在示例責(zé)任結(jié)構(gòu)中,被改變和/或添加的行可以被標(biāo)示為起源并鏈接至它們自身。示例責(zé)任數(shù)據(jù)結(jié)構(gòu)從當(dāng)前的實際行映射至其起源行。起源行鏈接至自身。對起源行的引用可以是所引用修訂處的文件修訂編號和行編號的元組。因此,在如圖3所圖示的責(zé)任數(shù)據(jù)結(jié)構(gòu)中,行3將被標(biāo)示為修訂2(提交#2)中的行3的起源行。

如圖5所圖示,未修改的行的起源可以通過追溯與該行相關(guān)聯(lián)的父文件修訂來確定(517)。行標(biāo)識符以及該行的所確定的起源可以從父修訂之一進(jìn)行復(fù)制(519)。然后,該行標(biāo)識符和該行的起源可以被添加至該文件的增量責(zé)任數(shù)據(jù)結(jié)構(gòu)(521)。

追溯與文件行相關(guān)聯(lián)的父文件修訂以確定起源在一定程度上可能被涉及。如果行能夠被追溯至僅一個父文件修訂,則來自父文件修訂的起源信息就被復(fù)制到該行。如果行可以被追溯到多個父文件修訂,則可能存在責(zé)任沖突。

在存在行能夠?qū)ζ溥M(jìn)行回引的兩個或更多潛在的源行時,可能發(fā)生責(zé)任沖突。這些潛在源行可以來自不同的文件修訂,并且在文件移動的情況下甚至可以具有不同的名稱。當(dāng)發(fā)生責(zé)任沖突時,可以基于時間戳選取最早提交來解決該沖突,因為該解決方案會導(dǎo)致分支之間的大連通。解決沖突的另一方式是使用基于提交時間戳來確定的最新近提交。此方法是版本控制系統(tǒng)中的缺省方法。替選地,在通過使用父標(biāo)識符來解決沖突時,可以選擇在該父提交列表中首先(或最后)出現(xiàn)的提交。每個提交(除了存儲庫中的最先的提交之外)至少具有一個父提交。在提交具有多個父提交時,用戶可以指定父提交在提交的列表中(顯式地或隱式地)的順序。該順序一旦被確立就不可以更改。

在圖2中可以看到責(zé)任沖突的示例。文件#1的提交#4,行3。內(nèi)容“ddd”可以來自提交#2或提交#3。然而,如果在沖突的情況下使用較早的提交來解決責(zé)任數(shù)據(jù)沖突,則提交#2的內(nèi)容會被選擇。

在一些實施例中,與父提交相比,文件的內(nèi)容可能不改變,但是相關(guān)聯(lián)的責(zé)任信息可能在提交之間相互不同。例如,在如圖2所圖示的文件#2的提交#4中,文件內(nèi)容與提交#3和提交#2相比并無改變。然而,針對該提交所創(chuàng)建的責(zé)任層不僅僅是父提交commit#2或commit#3的副本。提交#4的行#3上的內(nèi)容是“aaa”,其可能來自提交#1或提交#3。給定上文的一般規(guī)則,當(dāng)發(fā)生責(zé)任沖突時,可以選取較早的提交來解決沖突,應(yīng)當(dāng)選擇提交#1。

示例責(zé)任數(shù)據(jù)結(jié)構(gòu)還可以(或者替選地)具有在責(zé)任數(shù)據(jù)結(jié)構(gòu)內(nèi)相同的行不可以被選擇兩次的規(guī)則。在這個示例中,提交#1已經(jīng)被用作行1的責(zé)任起源,并且因此不應(yīng)當(dāng)針對行3而被選擇。在責(zé)任數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)內(nèi)不兩次選擇擇相同的行作為責(zé)任起源的對責(zé)任層級數(shù)據(jù)結(jié)構(gòu)的限制可以防止注釋被顯示兩次。如果相同的行在文件中被追責(zé)(引用)兩次,則該行的關(guān)聯(lián)注釋只可以被計入(count)一次,但被示出兩次。

還可能存在不同文件中的行引用相同的代表行的問題(這可能在文件被復(fù)制時發(fā)生)。例如,文件f可以從第一目錄a/b被復(fù)制到第二目錄a/c,從而創(chuàng)建第二文件g。這兩個文件共享相同的代表行(源自文件f)。這兩個文件可能具有完全相同的責(zé)任數(shù)據(jù)結(jié)構(gòu)。如果諸如日志消息的信息被添加到文件f中,則該信息被存儲在與文件g共享的責(zé)任層。該責(zé)任層行可以通過文件g可見。此外,如果任何信息被添加到文件g,則該信息將在文件f中可見。假設(shè)文件f和g是目錄中的唯一文件,并且文件f中存在單個注釋,則示例系統(tǒng)將計入目錄a/的一個注釋、目錄a/b/的一個注釋、以及目錄a/c/的一個注釋。在諸如a/的父目錄上,根據(jù)匯總實施方式注釋僅可以被示出一次,但是從一致性的角度則將預(yù)期有兩個注釋。

為了找到最早的起源,示例提交爬取器使用每個提交的時間戳(例如,當(dāng)在分布式版本控制系統(tǒng)中創(chuàng)建提交時的時間戳)來確定在時間上最早的提交。如果相同文件修訂中的兩行包含相同的起源(這在融合后可能發(fā)生),則后一行將被標(biāo)示為新的起源行。來自一個提交但是不同文件的兩行在復(fù)制或移動之后可能指代相同的起源。在這種情況下,為了防止兩個行具有相同的起源,可以采取多種方法之一。例如,文件移動可以全部被忽略。另一個示例是查找父提交之間的差異從而以了解該差異是否會向索引中帶入不一致,并且維護(hù)所使用起源的集合以避免重復(fù)。一個提交的多個文件的所有被引用的行可以存儲在一個集合中,以便創(chuàng)建所使用起源的集合。然后,可以完成簡單查找以確定行是否已經(jīng)被另一個文件引用。為了確定大量文件的起源行,應(yīng)當(dāng)創(chuàng)建在提交之間共享公共數(shù)據(jù)的集合實現(xiàn)。持久樹是一個方案。然后,行以及它們的起源可以被添加到文件的責(zé)任數(shù)據(jù)結(jié)構(gòu)。

雖然可以針對在提交處可見的所有文件計算責(zé)任信息,但是可能存在節(jié)省時間和存儲器的可用捷徑。例如,對于每個提交,可以存儲從文件名到對應(yīng)責(zé)任信息的指紋的映射。然后,僅對于在父提交中具有不同指紋的那些文件重新計算責(zé)任信息就足夠了。此外,可以排除僅在兩個分支中的一個上所接觸到的文件。具有相同內(nèi)容的兩個文件可以具有不同的責(zé)任信息并且因此責(zé)任信息上的指紋與文件內(nèi)容上的指紋相比更為不同。通過使用責(zé)任信息上的指紋,可以快速識別具有未修改內(nèi)容但是具有改變的責(zé)任信息的文件。

在一個示例實施例中,可以使用標(biāo)記方案來快速示出對于特定提交可見的所有行。識別文件的特定修訂中的可見行的一個方式是利用所有提交散列(其標(biāo)識該提交)來標(biāo)示所有行,其中這些行是可見的。然后,對可見行集合的查詢可以是通過該提交散列值來進(jìn)行的簡單過濾。然而,這種方法存在問題,特別是在存儲器消耗和爬取時間的方面。每次對提交進(jìn)行爬取時,都需要枚舉來自該提交的所有行。該枚舉可能包括未修改的行和文件。作為替代,可以創(chuàng)建使用較少的存儲器和時間來識別特定提交中的可見行的示例標(biāo)簽方案。

在通過時間戳解決沖突的示例標(biāo)簽方案中,每個提交可以得到兩個唯一標(biāo)簽:一個用于被添加行(+l),并且另一個用于被去除行(-l)。可以與文件的父提交之一相比來創(chuàng)建標(biāo)簽。出于標(biāo)記的目的,已改變的行可以被視為被去除的行及被添加的行。例如,如圖6a-6c所圖示,圖6a可以表示文件的父提交。可以使用圖6b的代碼來對于文件錄入后續(xù)提交。比較圖6a和6b的行4,打印語句從打印“helloworld”改變?yōu)榇蛴 癶elloyou”。如圖6c所圖示,此提交會導(dǎo)致提交文件的行4的兩個標(biāo)簽,用于去除“helloworld”打印的被去除行(-l)標(biāo)簽和用于添加“helloyou”打印的被添加行標(biāo)簽(+l)。標(biāo)簽可以被附加到起源行。能夠看出,每個起源行包含在該起源行被引入處的提交的一個正標(biāo)簽以及在該起源行被刪除處的后續(xù)提交的一組負(fù)標(biāo)簽。

對于每個提交,可以構(gòu)建布爾查詢表達(dá)式,其檢查特定起源行是否屬于該提交。遞歸公式可以是:isvisible(line,commit)=(isvisible(line,first_parent(commit))ornot-l(line,commit))or+l(line,commit)。此公式選取對于父提交可見的所有行,排除了當(dāng)前文件修訂中的所有被去除的行,并且包括在當(dāng)前文件修訂中新添加的行。此公式隨著父提交的深度線性增長。如果提交沒有使用標(biāo)簽(例如,沒有添加行—不需要+l標(biāo)簽),則可以從查詢中將其忽略。查詢可以作為提交的元數(shù)據(jù)的一部分進(jìn)行存儲。

在通過時間戳解決沖突時,遞歸公式隨著融合數(shù)目而指數(shù)增長。例如,遞歸公式可以是:isvisible(line,commit)=((isvisible(line,parent#1)orisvisible(line,parent#2)or...orisvisible(line,parent#n))&&not-l(line,commit))or+l(line,commit),其中n是提交的父的數(shù)目。該公式可以被表示為僅一次具有公共部分的布爾圖。此圖形可以隨著祖先提交的數(shù)目而線性增長。

圖7a-7d圖示了對于圖2的四個提交的示例標(biāo)記。可以使用示例爬取器利用每個新的提交來對標(biāo)簽進(jìn)行更新。如圖7a所示,提交#1可以得到正標(biāo)簽a和負(fù)標(biāo)簽a。在該示例中,標(biāo)簽在行內(nèi)容后面的圓括號中進(jìn)行枚舉。大寫字母代表正標(biāo)簽,小寫字母代表負(fù)標(biāo)簽。如果行在提交中可見,則可以使用正標(biāo)簽。如果行被刪除,則可以使用負(fù)標(biāo)簽。修改可以被表示為刪除以及然后的添加。滿足以下布爾查詢的經(jīng)標(biāo)記數(shù)據(jù)可以在提交#1:a處可見。

在文件#1中,所有行都可以利用標(biāo)簽(a)進(jìn)行標(biāo)記,這是因為所有行都被添加并且在根提交中是可見的。文件#2的所有行也可以利用(a)進(jìn)行標(biāo)記。提交#2可以具有正標(biāo)簽b和負(fù)標(biāo)簽b。由于提交#2的父是提交#1,因此對于提交#2的查詢可以擴(kuò)展提交#1的查詢:(aand(notb))orb。提交#1的標(biāo)簽可以基于如圖7b所圖示的提交#2中的修訂來變化。由于文件#1的行1在提交#2中被刪除,所以行1被標(biāo)記以a(在提交#1中可見)和b(在提交#2中不可見)。行2未改變,因此該行繼承文件#1的行2的起源行標(biāo)簽。僅有起源行才得到標(biāo)簽。出于說明的目的,非起源行可以僅示出起源行的標(biāo)簽。這些標(biāo)簽可以被示出為加下劃線。因為提交#2的行2并非起源行,所以該行從文件#1的提交#1的行2繼承其標(biāo)簽。行3有所修改。修改可以被視為刪除和添加。因此,行3的新標(biāo)簽可以是a、b(在提交#1中可見,但在提交#2中不可見)。新的內(nèi)容可以被標(biāo)記如下:行1可以利用a來標(biāo)記,因為該行來自提交#1;行2可以利用b來標(biāo)記,因為該行在提交#2中被添加;行3也可以利用b來標(biāo)記,因為該行也在提交#2中被添加。

對于提交#2,文件#2的標(biāo)簽在提交#1處可能并未改變。在提交#2處的文件#2的標(biāo)簽可以是:行1,對于文件#2從提交#1的行1繼承的a,因為該行來自提交#1;行2,b,因為該行來自提交#2;行3可以是從提交#1的行3繼承的a,因為該起源行來自提交#1;并且行4可以被標(biāo)記以b,因為該行在提交#2中被添加。

提交#3可以具有正標(biāo)簽c和負(fù)標(biāo)簽c。由于父提交是提交#1,因此對于提交#3的查詢可以擴(kuò)展對于提交#1的查詢。(aand(notc))orc。如圖7c所圖示,提交#1處的文件#1的內(nèi)容的標(biāo)簽變?yōu)椋盒?,(a,b,c),因為該行在提交#3以及提交#2中被刪除;行2,a,其從提交#1的第2行所繼承;以及行3,(a,b,c),因為該行在提交#3中有所改變并且修改可以被視為刪除和添加。

提交#3處的文件#1的內(nèi)容的標(biāo)簽可以是:行1,從提交#1的行1所繼承的a;行2,c;行3,c;以及行4,c。提交#1處的文件#2標(biāo)記可以不改變。然而,提交#3處的文件#2的標(biāo)簽可以是:行1,a,其從提交#1的行#1繼承;行2,a,其從提交#1的行2所繼承;行3,c;以及行4,c。

提交#4可以具有如圖7d所示的正標(biāo)簽d和負(fù)標(biāo)簽d。提交#4可以具有兩個父提交(提交#2和提交#3)。由于存在兩個父提交,所以父提交查詢可以被擴(kuò)展如下:

1.(((aand(notb))orb)and(notd))ord

2.(((aand(notc))orc)and(notd))ord

可以根據(jù)責(zé)任策略而使用不同的查詢。在大多數(shù)情況下,這兩個查詢應(yīng)當(dāng)是or(或)關(guān)系。例如,在簡化之后:(((aand(notb))or(aand(notc))orborc)and(notd))ord。使用有向無環(huán)圖來表達(dá)該查詢,來自提交#1的公共部分可以更容易地被重復(fù)使用。針對提交#1處的文件#1的內(nèi)容的標(biāo)簽可以不改變。提交#3處的文件#1的內(nèi)容的標(biāo)簽可以是:行1,a,其從提交#1的行1繼承;行2,c,d;行3,c,d;行4,c,其從提交#3的行4繼承,如圖7d所示(先前修訂(提交#3)文件#1)。針對提交#2處的文件#1的內(nèi)容的標(biāo)簽可以不發(fā)生改變。提交#4處的文件#1的當(dāng)前內(nèi)容的標(biāo)簽可以是:行1,a,其從提交#1的行1繼承;行2,b,其從提交#2的行2繼承;行3,b,其從提交#2的行3繼承;以及行4,c,其從提交#3的行4繼承。提交#1處的文件#2的標(biāo)簽不變。然而,提交#2處的文件#2的標(biāo)簽則變?yōu)椋盒?,a,其從提交#1的行1繼承;行2,b,d;行3,a,其從提交#1的行2繼承;以及行4,b,其從提交#2的行4繼承。提交#3處的文件2的標(biāo)簽變?yōu)椋盒?,a,其從提交#1的行1繼承;行2,a,其從提交#1的行2繼承;行3,c,其從提交#3的行3繼承;以及行4,c,d。最后,提交#4處的文件#2的標(biāo)簽為:行1,a,其從提交#1的行1繼承;行2,a,其從提交#1的行2繼承;行3,c,其從提交#3的行3繼承;以及行4,b,其從提交#1的行4繼承。提交#4的所有行都來自其它提交,并且因此標(biāo)簽并不被存儲在提交#4中。

為了使查詢更為有效率,示例標(biāo)記方案可以偶爾執(zhí)行主要壓縮,其創(chuàng)建快捷標(biāo)簽。主要壓縮可以在查詢長度達(dá)到指定大小或滿足某些其它準(zhǔn)則時發(fā)生。可以在爬取期間對這些準(zhǔn)則進(jìn)行評估。在滿足準(zhǔn)則時,可以為查詢存儲快捷標(biāo)簽以使得該快捷標(biāo)簽可以在隨后的提交中使用。滿足原始查詢的文件可以利用相對應(yīng)的快捷標(biāo)簽進(jìn)行更新。

這種重標(biāo)記可能影響到來自各個提交的許多文件。因此,重標(biāo)記可以與爬取異步進(jìn)行。使用快捷標(biāo)簽的新的提交在異步的重標(biāo)記完成之前可能無法工作。因此,長查詢和短查詢二者都可以被傳播至提交。短的查詢版本可以被保留,并且所調(diào)度查詢的元組可以被跟蹤。如果查詢應(yīng)當(dāng)被評估并且其使用尚未完成的替換標(biāo)簽之一,則可以通過利用相對應(yīng)的查詢對該替換標(biāo)簽進(jìn)行替換來擴(kuò)展查詢。

主要壓縮可以包括找出所有長于預(yù)定義長度的查詢并且構(gòu)建應(yīng)當(dāng)利用新標(biāo)簽進(jìn)行替換的查詢集合的過程。對于集合的每個查詢,枚舉匹配的起源行并且將替換標(biāo)簽附加至它們。當(dāng)壓縮過程被觸發(fā)并且在后續(xù)查詢構(gòu)造中被使用時可以引入替換標(biāo)簽。當(dāng)爬取器遇到具有長查詢的提交時,可以由提交爬取器來調(diào)度該壓縮過程。該流程的優(yōu)勢在于壓縮是確定性的并且重爬取將會創(chuàng)建相同的捷徑。

除此之外或替選地,示例標(biāo)記方案可以在使用快捷標(biāo)簽減少查詢長度之前對它們進(jìn)行預(yù)留。快捷標(biāo)簽可以被給予子提交。僅一個子提交能夠從同一父提交繼承所預(yù)留的快捷標(biāo)簽。這樣的標(biāo)簽可以沿它們的傳播路徑對改變進(jìn)行匯總,并且可以被用于縮短查詢。這種方法可以將查詢增長的階從線性階減少至對數(shù)階。

圖8中圖示了標(biāo)記的示例。在圖8a中,顯示了將提交1作為根提交的提交圖。還有作為提交1的子和后代的若干其它提交。每個提交從其自己的標(biāo)簽以及其自己的二元決策圖開始。圖8b圖示了提交1的二元決策圖(bdd)。該bdd可以被用于查詢與提交1相匹配的注釋。可以沿著邊從下至上對該bdd進(jìn)行評估。在存在標(biāo)簽時,可以遵循實線箭頭。在沒有標(biāo)簽時,則可以沿虛線標(biāo)簽。示例方法可能僅對匹配(即1)感興趣,因此可以跳過0標(biāo)簽。圖8c-8e圖示了提交2-4的二元決策圖。對于提交5(如圖8f所圖示),可以通過簡單地重用已經(jīng)存在的節(jié)點來融合來自提交4和提交3的bdd。每個標(biāo)簽在圖中最多存在一次,并且因此融合bdd是微不足道的。在該bdd中,可能存在非確定性,即沿兩個邊。當(dāng)存在到達(dá)1的路徑時bdd匹配。該圖上存在從“-label5”到“+label3”的虛線。然而,通過沿該路徑可以到達(dá)1。提交的bdd可能變得過大,如通過查詢長度所確定。在發(fā)生這種情況時,可以引入能夠替代提交5的當(dāng)前標(biāo)簽使用的唯一標(biāo)簽,諸如“x”。該唯一標(biāo)簽在圖8g中圖示。圖8h圖示了提交6的標(biāo)記。圖8i圖示了提交7的標(biāo)記。在提交7中,可以使用快捷標(biāo)簽x而不是提交5的原始bdd。

圖9a圖示了與圖8a相同的示例a,但其帶有注釋(在本示例中為docs)。每個提交都示出在該提交處可見的一組注釋。在每個提交旁已經(jīng)添加至該提交的注釋被標(biāo)記(僅出于示例目的)。例如,在提交2處,添加了對于doc2的注釋。在每個邊的旁邊,對所連接提交之間已經(jīng)被去除的注釋進(jìn)行標(biāo)記(僅出于示例的目的)。例如,在提交2和提交3之間,已經(jīng)去除了doc1的注釋。在該示例中,注釋可以如圖9b所示進(jìn)行標(biāo)記。圖9c圖示了可以針對圖9a中所示的注釋進(jìn)行創(chuàng)建的示例倒排索引。搜索索引可以創(chuàng)建倒排索引,其針對每個標(biāo)簽存儲與該標(biāo)簽匹配的文檔的有序列表。示例搜索可以檢索具有查詢的+標(biāo)簽的所有文檔。可以針對這些文檔評估二元決策圖。例如,使用圖8i的提交7,具有其相對應(yīng)文檔的正標(biāo)簽可以是圖9d中所圖示的標(biāo)簽。這些集合的并集可以是{1,2,3,4,5,6,7},并且可以對每個文檔的二元決策圖進(jìn)行評估。

對于每個標(biāo)簽,搜索后端可以提供迭代器,其按順序而遍歷匹配每個標(biāo)簽的文檔進(jìn)行迭代。該搜索后端可以存儲該迭代器當(dāng)前正指向的文檔標(biāo)識符,并且可以提供前行功能(advancefunction),該前行功能將文檔標(biāo)識符作為輸入并且將該迭代器移動至集合中不小于所提供文檔標(biāo)識符的下一個文檔。如果下一個文檔標(biāo)識符小于或等于當(dāng)前文檔標(biāo)識符,則該搜索后端可以不執(zhí)行任何操作。圖10中圖示了迭代器類的簡單示例實施方式。圖11圖示了用于基于迭代器來找出所有匹配文檔的示例二元決策圖的實施方式。

示例標(biāo)簽方案可以具有以下屬性:標(biāo)簽改變的數(shù)目可以處于當(dāng)前文件與其先前修訂之間的差異數(shù)目的量級;任何行處的標(biāo)簽的數(shù)目可以處于接觸特定行的提交以及與該行相關(guān)聯(lián)的快捷標(biāo)簽的數(shù)目的量級;并且進(jìn)行查詢以確定行在提交處是否可見在每次主要壓縮之后可以是恒定的,但是可以根據(jù)自從上一次主要壓縮以來的提交圖結(jié)構(gòu)而隨即將到來提交的數(shù)目而以線性或?qū)?shù)的方式增長。

示例的增量責(zé)任數(shù)據(jù)結(jié)構(gòu)和標(biāo)記方案在確定對于給定文件修訂在給定時間應(yīng)當(dāng)在集成開發(fā)環(huán)境(ide)中顯示哪些注釋時是有用的工具。如上文所討論的,注釋可能來自多個來源,諸如靜態(tài)代碼分析、生產(chǎn)系統(tǒng)、拼寫檢查器、或協(xié)作工具,并且可以提供與代碼相關(guān)的附加信息,后者對于理解代碼的目的、功能、或者對于找出修改代碼或修復(fù)損壞代碼的方法而言可能是相關(guān)的。

在應(yīng)當(dāng)為特定文件版本的行創(chuàng)建注釋時,可以在示例責(zé)任結(jié)構(gòu)中找到行起源,并且該注釋可以與該行起源相關(guān)聯(lián),如圖12(1201-1205)所示。該注釋還可以接收允許對該注釋進(jìn)行快速更新的唯一標(biāo)識符。示例標(biāo)識符可以是任何種類的指紋以便達(dá)到注釋在整數(shù)空間中的隨機分布。標(biāo)識符可以在匯總期間被用于對解空間進(jìn)行采樣。

為了使注釋可搜索,可以將注釋置于在諸如數(shù)據(jù)庫、散列表、或其它存儲機制的搜索后端之中。每個注釋可以從與其相關(guān)聯(lián)的起源行繼承所有提交標(biāo)簽(1205)。當(dāng)ide或一些其它顯示機制需要確定何時顯示注釋時,可以構(gòu)造標(biāo)簽查詢以經(jīng)由提交標(biāo)簽找出與特定提交相關(guān)聯(lián)的所有注釋(1207)。可以向查詢中添加其它過濾器。例如,搜索可以被限于特定類型的注釋。可以構(gòu)造標(biāo)簽查詢以顯示關(guān)于注釋的匯總或概要,即在給定提交處存在多少一定類型的注釋。可以通過使用標(biāo)簽查詢找出具有與該標(biāo)簽查詢匹配的提交標(biāo)簽的注釋,來識別與某個提交相關(guān)聯(lián)的所有注釋(1209)。可以僅顯示具有與標(biāo)簽查詢準(zhǔn)則匹配的提交標(biāo)簽的注釋(1211)。當(dāng)起源行的標(biāo)簽發(fā)生改變時,相關(guān)聯(lián)的注釋可能需要利用新的標(biāo)簽信息進(jìn)行更新。

可以通過使用注釋空間中的隨機指紋進(jìn)行采樣來實現(xiàn)注釋的快速聚合,直至已經(jīng)找到足夠的結(jié)果以向用戶示出所要求的結(jié)果精度。例如,如果所有數(shù)據(jù)都在單個機器上,則文檔可以以散列順序進(jìn)行迭代直至已經(jīng)找到特定數(shù)目的結(jié)果,諸如1000個結(jié)果。然后,可以通過將所找到結(jié)果的數(shù)目—在該示例中為1000—除以散列空間的被搜索部分來估計結(jié)果的總數(shù)目。

數(shù)據(jù)可以在多個機器上分布,并且每個機器可以負(fù)責(zé)散列空間的閉區(qū)間。可以應(yīng)用簡單的流程。例如,如果存在100臺機器,則每臺機器可以尋找10個結(jié)果。每臺機器可以返回所找到結(jié)果的數(shù)目以及所搜索的散列空間的大小。來自每臺機器的結(jié)果可以被加總在一起并且可以計算出估計。如果結(jié)果的總數(shù)目明顯小于指定數(shù)目,例如,如果應(yīng)當(dāng)找到1000個結(jié)果,但是只找到100個結(jié)果,則估計就可能不精確。為了實現(xiàn)更為精確的估計,可以再次開始該流程,其中每機器請求更多的結(jié)果。根據(jù)搜索后端,可以返回經(jīng)匯總數(shù)值而不是搜索后端每個層處的個體注釋。

該匯總還允許對來自針對任意版本運行的特定工具的注釋進(jìn)行追蹤。不同于簡單地創(chuàng)建新注釋,示例方法可以確定注釋是否自起源行處先前運行就已經(jīng)存在。如果注釋確實存在,則現(xiàn)有注釋將簡單地被重用,并且可能附加以來自新運行的附加數(shù)據(jù)。

如果工具產(chǎn)生許多注釋,則可以為每個注釋提供另一組標(biāo)簽—工具標(biāo)簽,并且示例方法可以確定該工具是否被執(zhí)行。然后,該工具可以僅報告新的執(zhí)行與先前執(zhí)行之間的差異。并非新執(zhí)行的一部分的每個注釋可以利用對應(yīng)的執(zhí)行(或者在每提交只存在一個執(zhí)行的情況下的提交)的(-l)標(biāo)簽進(jìn)行標(biāo)示,并且每個新的注釋可以用(+l)標(biāo)簽進(jìn)行標(biāo)示。按照與針對提交的(label,query)配對的構(gòu)造相同的方式(基于一個父提交),可以從之前的執(zhí)行來構(gòu)建新執(zhí)行的(tool_label,tool_query)配對。對于執(zhí)行的注釋進(jìn)行搜索可以包括簡單地搜索注釋的新標(biāo)簽集合上的特定(tool_label,tool_query)配對。針對另一個提交處的特定執(zhí)行的注釋的搜索可以簡單地利用對應(yīng)執(zhí)行的(tool_label,tool_query)配對以及在該處應(yīng)當(dāng)對注釋進(jìn)行搜索的提交的(label,query)配對而對搜索加以限制。這種類型的搜索是有用的,因為工具可以覆蓋一些提交,但并非全部的提交,并且示例實施例可能想要顯示與未覆蓋提交最為接近的結(jié)果。第二(tool_label,tool_query)配對可以來自定義在結(jié)構(gòu)上類似于該提交圖的線性圖或有向無環(huán)圖的執(zhí)行。

所構(gòu)思的索引可以使得對提交和/或執(zhí)行之間的注釋的交集、差集、和并集進(jìn)行有效率的計算。在軟件開發(fā)的情況下,這些種類的計算可能在分析生產(chǎn)問題時有所幫助。例如,可以為部署期間所發(fā)生的每個日志輸出添加注釋。這些注釋可以自動示出在軟件工程師嘗試修復(fù)問題的開發(fā)分支上。此外,可以獲得關(guān)于項目的日志語句數(shù)目或者兩次部署之間出現(xiàn)的差異的統(tǒng)計數(shù)據(jù)。

另一個用例可能是代碼評論,其中針對某些快照工具識別出潛在的編程錯誤。利用示例系統(tǒng),在工具尚未運行的情況下,可以在稍后的快照處有效率地使注釋可見。此外,可以有效率地針對整個存儲庫而隨時間對這些注釋進(jìn)行追蹤,以便給出關(guān)于代碼健康的一些指示。注釋可以僅針對稍后的提交而不是先前版本可見。注釋可以會被標(biāo)記為已解決以用于后續(xù)提交。即使行已經(jīng)被修改或刪除也可以對注釋進(jìn)行跟蹤。例如,用戶評論不應(yīng)當(dāng)在沒有用戶交互的情況下消失。

圖13是被配置用于跨源代碼文件修訂來顯示注釋的示例性計算機(1300)的高級框圖。在非常基本的配置(1301)中,計算設(shè)備(1300)通常包括一個或多個處理器(1310)和系統(tǒng)存儲器(1320)。存儲器總線(1330)可以被用于在處理器(1310)和系統(tǒng)存儲器(1320)之間通信。

根據(jù)所期望的配置,處理器(1310)可以為任何類型,包括但不局限于微處理器(μp)、微控制器(μc)、數(shù)字信號處理器(dsp)或者它們的任意組合。處理器(1310)可以包括諸如一級高速緩存(1311)和二級高速緩存(1312)、處理器核心(1313)和寄存器(1314)的一個或多個級別的高速緩存。處理器核心(1313)可以包括算術(shù)邏輯單元(alu)、浮點單元(fpu)、數(shù)字信號處理核心(dsp核心)、或者它們的任何組合。存儲器控制器(1316)也可以與處理器(1310)一起使用,或者在一些實施方式中,存儲器控制器(1315)可以是處理器(1310)的內(nèi)部部分。

根據(jù)所期望的配置,系統(tǒng)存儲器(1320)可以是任何類型,包括但不局限于易失性存儲器(諸如ram)、非易失性存儲器(諸如rom、閃存等)、或者它們的任何組合。系統(tǒng)存儲器(1320)通常包括操作系統(tǒng)(1321)、一個或多個應(yīng)用(1322)、和程序數(shù)據(jù)(1324)。應(yīng)用(1322)可以包括用于跨源代碼文件修訂顯示注釋的系統(tǒng)。程序數(shù)據(jù)(1324)包括存儲指令,其在被一個或多個處理設(shè)備執(zhí)行時實現(xiàn)用于創(chuàng)建增量責(zé)任數(shù)據(jù)結(jié)構(gòu)和/或標(biāo)記方案的系統(tǒng)和方法(1323)。在一些實施例中,應(yīng)用(1322)可以被布置來與操作系統(tǒng)(1321)上的程序數(shù)據(jù)(1324)一起操作。

計算設(shè)備(1300)可以具有附加的特征或功能、以及附加的接口,以促進(jìn)基本配置(1301)與任何所需設(shè)備和接口之間的通信。

系統(tǒng)存儲器(1320)是計算機存儲介質(zhì)的示例。計算機存儲介質(zhì)包括但不局限于:ram、rom、eeprom、閃存或其它存儲器技術(shù),cd-rom、數(shù)字多功能盤(dvd)、或其它光學(xué)存儲器,磁帶盒、磁帶、磁盤存儲器或其它磁存儲設(shè)備,或者可以被用于存儲所期望信息并且可以由計算設(shè)備1300進(jìn)行訪問的任何其它介質(zhì)。任何這樣的計算機存儲介質(zhì)都可以是設(shè)備(1300)的一部分。

計算設(shè)備(1300)可以被實現(xiàn)為小封裝技術(shù)(small-formfactor)便攜式(或移動)電子設(shè)備的一部分,諸如蜂窩電話、智能電話、個人數(shù)字助理(pda)、個人媒體播放器設(shè)備、平板計算機(平板)、無線網(wǎng)絡(luò)手表設(shè)備、個人頭戴式送受話器設(shè)備、專用設(shè)備,或者包括上述功能中的任何一個的混合設(shè)備。計算設(shè)備(1300)還可以被實現(xiàn)為包括膝上型計算機和非膝上型計算機配置二者的個人計算機。

以上詳細(xì)描述已經(jīng)通過使用框圖、流程圖、和/或示例闡述了設(shè)備和/或過程的各種實施例。在這樣的框圖、流程圖、和/或示例包含一個或多個功能和/或操作的情況下,本領(lǐng)域技術(shù)人員將理解,能夠單獨地和/或共同地通過廣泛多種硬件、軟件、固件、或幾乎它們的任何組合來實現(xiàn)這樣的框圖、流程圖、或示例中的每個功能和/或操作。在一個實施例中,本文所描述主題的若干部分可以經(jīng)由專用集成電路(asic)、現(xiàn)場可編程門陣列(fpga)、數(shù)字信號處理器(dsp)、或者其它整合的格式來實現(xiàn)。然而,本領(lǐng)域技術(shù)人員將認(rèn)識到,這里所公開的實施例的一些方面可以全部或部分等效地以集成電路被實現(xiàn)為在一個或多個計算機上運行的一個或多個計算機程序、在一個或多個處理器上運行的一個或多個計算機程序、固件、或者實幾乎它們的任何組合,并且根據(jù)本公開,設(shè)計和/或編寫該軟件和/或固件的代碼將完全在本領(lǐng)域技術(shù)人員的技能范圍之內(nèi)。此外,本領(lǐng)域技術(shù)人員將理解的是,本文所描述主題的機制能夠作為程序產(chǎn)品以各種形式進(jìn)行分發(fā),并且無論被用來實際執(zhí)行該分發(fā)的非瞬態(tài)信號承載介質(zhì)的特定類型如何,本文所描述主題的說明性實施例都適用。非瞬時信號承載介質(zhì)的示例包括但并不局限于以下:可記錄型介質(zhì),諸如軟盤、硬盤驅(qū)動器、壓縮盤(cd)、數(shù)字視頻盤(dvd)、數(shù)字磁帶、計算機存儲器等;以及諸如數(shù)字和/或模擬通信介質(zhì)(例如,光纖電纜、波導(dǎo)、有線通信鏈路、無線通信鏈路等)的傳輸介質(zhì)。

關(guān)于本文對基本上任何復(fù)數(shù)和/或單數(shù)術(shù)語的使用,只要適于場境(context)和/或應(yīng)用,本領(lǐng)域技術(shù)人員就能夠?qū)?fù)數(shù)轉(zhuǎn)化為單數(shù)和/或?qū)螖?shù)轉(zhuǎn)化為復(fù)數(shù)。為了清楚起見,這里可以明確闡述各種單數(shù)/復(fù)數(shù)的排列組合。

因此,已經(jīng)描述了主題的特定實施例。其它實施例處于所附權(quán)利要求書的范圍之內(nèi)。在一些情況下,權(quán)利要求中所記載的動作可以以不同的順序執(zhí)行而仍然達(dá)到所需的結(jié)果。此外,附圖中所描繪的過程不一定要求所示出的特定順次序或連續(xù)順序來達(dá)到所期望的結(jié)果。在某些實施方式中,多任務(wù)和并行處理可能是有利的。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
主站蜘蛛池模板: 榆树市| 锡林浩特市| 上犹县| 怀化市| 商丘市| 博客| 沈丘县| 离岛区| 赣榆县| 西乡县| 桦甸市| 石台县| 南安市| 密山市| 文昌市| 成安县| 海口市| 天台县| 阳西县| 林芝县| 磐安县| 永兴县| 江川县| 措勤县| 西吉县| 尚义县| 永泰县| 垦利县| 新丰县| 彭山县| 永仁县| 丁青县| 昭通市| 云梦县| 老河口市| 长寿区| 新兴县| 溧阳市| 安阳县| 余干县| 乐陵市|