專利名稱:軟件開發(fā)工具的制作方法
技術(shù)領(lǐng)域:
本申請涉及軟件開發(fā)工具和方法。
背景技術(shù):
集成開發(fā)環(huán)境(IDE)是幫助程序員開發(fā)軟件的一組工具。IDE可包括源代碼編輯器、編譯器和調(diào)試器。它可包括允許程序員查看類層次結(jié)構(gòu)信息、關(guān)于類、方法或其他程序元素的信息的瀏覽器。IDE或其他編程環(huán)境可包括自動完成特征來在程序員輸入文本時幫助程序員。使用自動完成特征,用戶可鍵入已被定義成屬于一特定類的對象的名稱,后跟一句點。自動完成工具可識別對象的類并提供包括字段、屬性和方法的類成員列表。用戶可從該列表進行選擇,而不是鍵入所希望的類成員的名稱。該工具然后將所選的成員名稱插入源代碼。如果用戶在作出選擇之前鍵入了一個或多個字符,則自動完成工具可過濾該列表使其限于匹配文本。在鍵入了一個或多個字符之后,用戶可從列表選擇一項目。
發(fā)明內(nèi)容
提供本發(fā)明內(nèi)容以便以簡化形式介紹將在以下的具體實施方式
中進一步描述的一些概念。本發(fā)明內(nèi)容并不旨在標(biāo)識出所要求保護的主題的關(guān)鍵特征或必要特征,也不旨在用于限定所要求保護的主題的范圍。簡而言之,一種系統(tǒng)、方法和各組件用于生成與還未被靜態(tài)地聲明具有類型的程序變量對應(yīng)的完成列表。變量的類型可在目標(biāo)程序的執(zhí)行期間被解析。在一個實施方式中, 運行時監(jiān)控程序在目標(biāo)程序代碼的執(zhí)行期間跟蹤事件,以確定程序變量的類型解析。對于每個運行時類型解析,可確定并聚集與該類型相關(guān)聯(lián)的一組類成員以形成完成列表。在一個實施方式中,在編輯會話中時,列表調(diào)用事件使得列表生成器執(zhí)行對目標(biāo)程序的至少一些部分的控制流分析??烧业綄λ鲎兞康囊粋€或多個賦值。每個表達式可被分析以確定變量的候選類型集。與每個候選類型相關(guān)聯(lián)的、或可從該候選類型的對象獲得的類成員被檢索并插入到完成列表中。在一個實施方式中,對變量的使用可被分析來確定一個或多個候選類型。這可基于調(diào)用變量對象的成員的指令、將變量用作對其中相應(yīng)參數(shù)具有聲明的類型的方法的自變量、將變量對象用作表達式中的操作數(shù)、以及對變量的其他使用。在一個實施方式中,控制流分析可導(dǎo)致匯編件(assembly)。編譯時匯編件可被分析來檢索候選類型或相應(yīng)成員。在編輯會話中時,運行時匯編件可被加載,并且指定的類型可被實例化??墒褂梅瓷?Reflection)來確定相應(yīng)成員的列表。在一個實施方式中,完成列表的項目可基于運行時類型解析或靜態(tài)分析來排序。 完成列表可被過濾以呈現(xiàn)具有配置的準(zhǔn)則的完成列表,或呈現(xiàn)完成列表項目的各組。為了實現(xiàn)前述及相關(guān)目的,在這里結(jié)合以下描述及附圖來描述該系統(tǒng)的某些說明性方面。然而,這些方面僅指示了可采用本發(fā)明的原理的各種方法中的少數(shù)幾種,且本發(fā)明旨在包括所有這樣的方面及其等效方面。通過結(jié)合附圖考慮本發(fā)明的以下詳細描述,本發(fā)明的其它優(yōu)點以及新穎的特征將變得顯而易見。
參考以下附圖來描述本發(fā)明的非限制性且非窮盡性實施方式。在各附圖中,除非另外指明,否則在全部附圖中相同的附圖標(biāo)記指代相同的部分。為了幫助理解本發(fā)明,將參考以下與附圖相關(guān)聯(lián)地閱讀的具體實施方式
,附圖中圖1是其中可實現(xiàn)此處所描述的機制的計算機系統(tǒng)的框圖;圖2示出其中可采用此處所描述的某些機制的示例編輯會話的屏幕截圖;圖3示出其中可采用此處所描述的某些機制的另一示例編輯會話的屏幕截圖;圖4示出其中可采用此處所描述的某些機制的另一示例編輯會話的屏幕截圖;圖5A示出其中可采用此處所描述的某些機制的另一示例編輯會話的屏幕截圖;圖5B示出其中可采用此處所描述的某些機制的另一示例編輯會話的屏幕截圖;圖6示出其中可采用此處所描述的某些機制的另一示例編輯會話的屏幕截圖;圖7A-C示出其中可采用此處所描述的某些機制的示例編輯會話的附加屏幕截圖;圖8是示出向用戶提供完成列表的過程的示例實施方式的流程圖;圖9是示出確定程序變量的一個或多個候選類型的過程的示例實施方式的流程圖;圖10是示出確定程序變量的候選類型的過程的示例實施方式的流程圖;圖11是示出基于動態(tài)分析確定程序變量的候選類型的過程的示例實施方式的流程圖;圖12示出了計算設(shè)備的一個實施方式,示出可用于執(zhí)行此處所描述的功能的計算設(shè)備的所選組件。
具體實施例方式下文中將參考附圖來更全面地描述本發(fā)明的各示例實施方式,附圖構(gòu)成實施方式的一部分且在其中作為示例示出了可在其中實踐本發(fā)明的各特定示例實施方式。然而,本發(fā)明可被實現(xiàn)為許多不同的形式并且不應(yīng)被解釋為被限于此處描述的各實施方式;相反, 提供這些實施方式以使得本公開變得透徹和完整,并且將本發(fā)明的范圍完全傳達給本領(lǐng)域技術(shù)人員。特別地,本發(fā)明可被實現(xiàn)為方法或設(shè)備。因此,本發(fā)明可采用完全硬件實施方式、 完全軟件實施方式或者結(jié)合軟件和硬件方面實施方式的形式。因此,以下詳細描述并非是局限性的。貫穿說明書和權(quán)利要求書,下列術(shù)語采用此處顯式相關(guān)聯(lián)的含義,除非該上下文在其他地方另有清楚指示。如此處所使用的,短語“在一個實施方式中”盡管它可以但不一定指前一實施方式。此外,如此處所使用的,短語“在另一個實施方式中”盡管它可以但不一定指一不同的實施方式。因此,可以容易地組合本發(fā)明的各實施方式而不背離本發(fā)明的范圍或精神。類似地,如此處所使用的,短語“在一個實現(xiàn)中”盡管它可以但不一定指相同
5的實現(xiàn),并且可以組合各種實現(xiàn)的技術(shù)。另外,如此處所使用的,術(shù)語“或”是包括性“或”運算符,并且等價于術(shù)語“和/ 或”,除非上下文清楚地另外指明。術(shù)語“基于”并非窮盡性的并且允許基于未描述的其他因素,除非上下文清楚地另外指明。另外,在本說明書全文中,“一”、“一種”和“所述”的含義包括復(fù)數(shù)引用。“在中”的含義包括“在中”和“在上”。如此處所使用的,當(dāng)涉及計算機程序時,術(shù)語“賦值”指的是指定在程序的執(zhí)行期間要被賦予或綁定于指定的變量的值的構(gòu)造。這可采用單個賦值語句的形式,例如“X = new classX ()”,它指定了表達式“new classX () ”要被求值,結(jié)果被賦予變量χ。它也可采用方法參數(shù)聲明和對應(yīng)的方法調(diào)用的形式。例如,在以下程序代碼中void methodA(classY foo);method A (bar);該構(gòu)造指定了對methodA的調(diào)用將自變量bar所代表的對象賦予參數(shù)foo。如此處所使用的,術(shù)語“編輯會話”指的是這樣一種環(huán)境,其中編輯器、查看器或瀏覽器正在向用戶顯示程序源代碼的至少一部分。編輯會話可包括但并不一定要包括修改程序源代碼的動作。盡管編輯會話可與目標(biāo)程序的執(zhí)行交織在一起,或可與目標(biāo)程序的執(zhí)行或運行時同時發(fā)生,但是編輯會話與程序運行時不同且可在對應(yīng)于目標(biāo)程序的可執(zhí)行程序不存在時發(fā)生。對編輯會話中發(fā)生的動作的引用涉及不采用運行時數(shù)據(jù)結(jié)構(gòu)的動作。此處所描述的組件可以從其上具有數(shù)據(jù)結(jié)構(gòu)的各種計算機可讀介質(zhì)來執(zhí)行。組件可通過本地或遠程過程諸如按照具有一或多個數(shù)據(jù)分組(例如,來自一個通過信號與本地系統(tǒng)、分布式系統(tǒng)中的另一組件交互或跨諸如因特網(wǎng)的網(wǎng)絡(luò)與其它系統(tǒng)交互的組件的數(shù)據(jù))的信號來通信。例如,根據(jù)本發(fā)明的各實施方式,軟件組件可被存儲在非瞬態(tài)計算機可讀存儲介質(zhì)上,包括但不限于專用集成電路(ASIC)、緊致盤(⑶)、數(shù)字多功能盤 (DVD)、隨機存取存儲器(RAM)、只讀存儲器(ROM)、軟盤、硬盤、電可擦除可編程只讀存儲器 (EEPROM)、閃存或記憶棒。如此處所用的術(shù)語“計算機可讀介質(zhì)”既包括非瞬態(tài)存儲介質(zhì)又包括通信介質(zhì)。通信介質(zhì)通常以諸如載波或其它傳輸機制等“已調(diào)制數(shù)據(jù)信號”來體現(xiàn)計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù),并包括任何信息傳遞介質(zhì)。作為示例而非限制,通信介質(zhì)包括有線介質(zhì),如有線網(wǎng)絡(luò)或直接線連接,以及諸如聲學(xué)、無線電、紅外線及其他無線介質(zhì)之類的無線介質(zhì)。如此處所使用的,術(shù)語“應(yīng)用,,指計算機程序或其一部分,并且可包括相關(guān)聯(lián)的數(shù)據(jù)。應(yīng)用可以是獨立程序,或者應(yīng)用可被設(shè)計成向另一應(yīng)用提供一個或多個特征?!案郊蛹?和“插件”是與“宿主”應(yīng)用交互并向其提供特征的應(yīng)用的示例。應(yīng)用由應(yīng)用組件的任何組合構(gòu)成,應(yīng)用組件可包括程序指令、數(shù)據(jù)、文本、對象代碼、圖像或其他媒體、安全證書、腳本、或者可被安裝在計算設(shè)備上以使該設(shè)備能夠執(zhí)行所需功能的其他軟件組件。應(yīng)用組件能夠以文件、庫、頁、二進制塊或數(shù)據(jù)流的形式存在。如此處所使用的,除非上下文另外指明,否則術(shù)語“功能”指執(zhí)行特定任務(wù)的較大程序中的一部分代碼,并且能夠相對獨立于該程序的其他部分執(zhí)行。功能可以但不一定返回值。在各種計算機語言中,可使用不同的術(shù)語,諸如子例程、方法、過程或子程序。如此處所使用的,術(shù)語“功能”可以包括所有這些。
如此處所使用的,術(shù)語“靜態(tài)類型化”(static typing)指的是這樣一種編程構(gòu)造, 其中變量類型在編譯時可用。靜態(tài)類型聲明是在程序運行時之前對變量類型的顯式聲明。 "int foo; ”是靜態(tài)類型聲明的示例。術(shù)語“動態(tài)類型化”指的是這樣一種編程構(gòu)造,其中變量的類型在運行時被解析。在C#語言中,可通過使用關(guān)鍵字“dynamic (動態(tài))”來指定動態(tài)類型化。例如,語句“dynamic dl指定了變量dl是被動態(tài)地指定類型的,且該類型將在運行時被解析。其他語言可使用其他構(gòu)造來指定動態(tài)類型化。在某些語言中,動態(tài)類型化是默認的,或僅對變量類型化。如此處所使用的,術(shù)語“控制流分析”指的是對計算機程序代碼的靜態(tài)分析,以確定計算機程序或其一部分的控制流,計算機程序代碼可以是源代碼、中間代碼或本機代碼。 術(shù)語“動態(tài)分析”指的是通過執(zhí)行計算機程序并觀察程序行為(包括所采取的執(zhí)行路徑)來執(zhí)行的分析。圖1是其中可實現(xiàn)此處所描述的機制的計算機系統(tǒng)100的框圖。圖1只是合適的系統(tǒng)配置的一個示例,并且不旨在對本發(fā)明的使用范圍或功能提出任何限制。因此,可采用各種系統(tǒng)配置而不背離本發(fā)明的范圍或精神。如圖所示,系統(tǒng)100包括程序源代碼102,該程序源代碼可以是計算機程序的高級語言表示。高級語言的示例包括C-Siarp (C#)、C++、Visual Basic, F-Sharp (F#)或各種其他高級語言。作為語言和庫擴展的組合的LINQ是程序源代碼102的另一示例。程序源代碼102是可由系統(tǒng)100編輯和執(zhí)行的目標(biāo)程序的表示。程序可包括一個或多個功能。目標(biāo)程序可以駐留在一個或多個文件或其他存儲表示中。目標(biāo)程序可包括一個或多個庫,該一個或多個庫能夠以各種方式集成或分布。因此,程序源代碼102可表示程序庫或其一部分。如所示,系統(tǒng)100包括集成開發(fā)環(huán)境(IDE) 108。IDE 108可包括幫助程序員開發(fā)軟件的各種工具。在所示實施方式中,IDE包括編輯器110、列表生成器114、分析器115以及數(shù)據(jù)庫112。編輯器110可以是使得用戶能夠查看、編寫或修改源代碼的軟件組件。編輯器110 可包括顯示源代碼102并接收來自用戶的輸入文本和命令的用戶接口組件。編輯器110可包括提供與計算機程序或其一部分有關(guān)的信息、便于編輯功能等等的若干特征。在一些實施方式中,編輯器110可包括指示語法或語義錯誤、建議修正或便于輸入正確的程序代碼的特征。在各種配置中,編輯器110的功能可被分布在多個組件上或與系統(tǒng)100的其他組件組合,包括那些未示出的組件。在一個實施方式中,編輯器110在各種時間接收完成列表116并顯示列表。編輯器110可使得用戶能夠查看該列表并從該列表選擇項目。在一個實施方式中,響應(yīng)于用戶對完成列表的項目的選擇以及用戶命令,來自該項目的串或其一部分可被插入到所顯示的程序源代碼部分中。因此,完成列表116可充當(dāng)在記住所希望的文本串以及將該串輸入編輯器中時的輔助手段。在所示的實施方式中,列表生成器114可從編輯器110接收源代碼102的一部分, 并確定完成列表116,完成列表116隨后可被傳遞給編輯器110。列表生成器114可從數(shù)據(jù)庫112接收數(shù)據(jù)并確定來自數(shù)據(jù)庫112的項目的列表,以生成完成列表116。在一個配置中,列表生成器114可包括或采用分析器115來執(zhí)行對源代碼102的分析。在某些配置中, 分析器115也可由編輯器110或編譯器120來使用。
數(shù)據(jù)庫112可存儲包括類定義、成員名稱和數(shù)據(jù)類型、方法參數(shù)等信息。它還可存儲來自源代碼102的標(biāo)識符、結(jié)構(gòu)或其他信息。它還可包括來自文件頭、匯編件、文檔編制或其他源的信息。盡管數(shù)據(jù)庫112被示為單個數(shù)據(jù)庫,但是它可由多個數(shù)據(jù)庫組成。每一部分可被存儲為文件、保持在易失性存儲器中或使用各種機制來存儲。數(shù)據(jù)庫112可以各種方式中的任何方式來實現(xiàn),例如結(jié)構(gòu)化數(shù)據(jù)庫、平面文件、存儲器中的一個或多個數(shù)據(jù)結(jié)構(gòu)、標(biāo)記語言、或它們的任何組合。數(shù)據(jù)庫112可由編輯器110、列表生成器114或圖1中未示出的其他組件更新。在一個實施方式中,數(shù)據(jù)庫112可接收并存儲來自編譯時匯編件104 或運行時匯編件116的信息。匯編件是程序代碼庫,并可包含程序代碼的類定義、功能定義或其他元素。編譯時匯編件104包括作為當(dāng)前程序項目、操作系統(tǒng)或軟件框架的一部分的匯編件,且匯編件的內(nèi)容在編輯會話期間是已知或可用的。例如,在.NET編程環(huán)境中,.NET 匯編件被認為是編譯時匯編件。運行時匯編件106包括在不加載匯編件的情況下其內(nèi)容是未知的匯編件。這些通常是當(dāng)前項目、框架或系統(tǒng)外部的。在所示的實施方式中,系統(tǒng)100包括編譯器120,編譯器將程序源代碼102轉(zhuǎn)換成本機代碼122。盡管編譯器120被示為單個組件,但是在各實施方式中,它可包括一個或多個子組件,且可生成計算機程序的一個或多個中間表示。例如,在一個實施方式中,編譯器 120可包括生成中間語言表示的前端,以及將中間語言表示轉(zhuǎn)換成本機代碼122的代碼生成器。在一個配置中,系統(tǒng)可使用即時(JIT)編譯。一般而言,JIT編譯器采用這樣一種機制,其中程序功能的中間語言表示響應(yīng)于其第一次調(diào)用而被加載并被轉(zhuǎn)換成本機語言表
7J\ O本機代碼122可以是機器語言、虛擬機語言或可由物理或虛擬處理器執(zhí)行的另一表示。處理器1 可接收本機代碼122并執(zhí)行程序指令以產(chǎn)生執(zhí)行結(jié)果126。在一種配置中,處理器1 可包括一個或多個中央處理單元、一個或多個處理器核、ASIC、或其他硬件處理組件和相關(guān)程序邏輯。在一種配置中,處理器1 可包括模擬硬件處理單元的軟件組件。處理器1 執(zhí)行本機代碼122中的指令。如此處所使用的,術(shù)語“運行時”指的是對目標(biāo)程序指令或與目標(biāo)程序交互的庫、匯編件或可執(zhí)行文件的執(zhí)行。執(zhí)行結(jié)果1 是執(zhí)行本機代碼122的結(jié)果的邏輯表示。結(jié)果可包括對計算機存儲或計算機存儲器的修改、與其他過程或計算設(shè)備的通信、音頻或視頻輸出、對各種系統(tǒng)或外部組件的控制中的一個或多個。在一個實施方式中,IDE 108可包括在本機代碼的運行時期間跟蹤特定事件的運行時監(jiān)控程序128。這些事件中的一些可指示出在一個或多個執(zhí)行期間發(fā)生的實際控制流。 這些事件中的一些可指示出在運行時期間綁定到變量、對象或表達式的對象的類型。運行時監(jiān)控程序1 可將該數(shù)據(jù)存儲在運行時數(shù)據(jù)庫130中。在一個實施方式中,完成列表生成器114使用該數(shù)據(jù)來確定目標(biāo)變量或表達式的候選類型,并基于此將項目插入到完成列表116中。根據(jù)此處所描述的機制中的一些機制,系統(tǒng)100的一些部分可如下操作。開發(fā)者可在編輯器110中輸入源代碼102的一部分。事件可調(diào)用列表生成器114。列表生成器114 可使用來自數(shù)據(jù)庫112的信息來分析源代碼102的一部分,生成完成列表116。在一個實施方式中,完成列表116包括可被用于在編輯器110中的當(dāng)前位置處插入文本的上下文敏感的選擇。編輯器110可接收完成列表116并顯示它或其一部分。用戶可從完成列表中選擇一項目,并指導(dǎo)編輯器在指定的位置處將該項目或 對應(yīng)于該項目的串插入到源代碼102 中。在一些實施方式中,調(diào)用列表生成器114的事件可以是若干事件中的任一個或多個。在編輯器110中插入字符或字符序列是一個這樣的事件。例如,在對象標(biāo)識符之后插入句點可表明對象類的一成員要跟在后面。因此,插入句點可導(dǎo)致編譯器110調(diào)用列表生成器114。作為另一示例,在某一位置處放置光標(biāo)可使得編譯器110基于上下文而選擇性地調(diào)用列表生成器114。例如,緊接著跟隨對象標(biāo)識符的句點之后放置光標(biāo)可以是列表調(diào)用事件。作為另一示例,用戶可顯式地輸入命令來調(diào)用列表生成器114。這可通過鍵入某一鍵或鍵組合、選擇菜單項、點擊按鈕、刪除文本、輸入語音命令、或使用計算設(shè)備的輸入機制輸入命令的任何其他方式來執(zhí)行。作為另一示例,在編輯器110中將鼠標(biāo)指針定位在標(biāo)識符或其他串上可使得編輯器110調(diào)用列表生成器114。列表調(diào)用事件可由編輯器110例如響應(yīng)于編譯錯誤來發(fā)起。術(shù)語“列表調(diào)用事件”在這里用于指代調(diào)用列表生成器114的事件,并可包括這些示例中的任何一個或多個,或其他事件。對該特征的使用的一個示例可以是程序員的使用,程序員輸入源代碼以指示出對與某一對象相關(guān)聯(lián)的方法或變量的引用。在輸入了對象標(biāo)識符后跟一句點之后,列表生成器114可創(chuàng)建包含以下內(nèi)容的列表可用于被調(diào)用給標(biāo)識符的方法的名稱、與標(biāo)識符相關(guān)聯(lián)的變量的名稱,或它們的組合。如此處所述,在某些上下文中,列表生成器114可執(zhí)行某些動作以確定對應(yīng)于對象標(biāo)識符的類或可能的類。系統(tǒng)100可以是開發(fā)系統(tǒng)的子系統(tǒng)。開發(fā)系統(tǒng)可包括由程序開發(fā)者或用戶用作為程序開發(fā)、測試或文檔編制過程的一部分的一個或多個計算設(shè)備。系統(tǒng)100的組件可以分布在一個或多個計算設(shè)備間,這些計算設(shè)備中的每一個通過采用諸如IP、TCP/IP、UDP、 HTTP、SSL、TLS, FTP、SMTP、WAP、藍牙、WLAN等各種有線或無線通信協(xié)議中的一種或多種來彼此通信。計算設(shè)備可以是專用或通用計算設(shè)備。示例計算設(shè)備包括大型計算機、服務(wù)器、刀片服務(wù)器、個人計算機、便攜式計算機、通信設(shè)備、消費電子產(chǎn)品等。圖12示出了可被用于實現(xiàn)系統(tǒng)100的計算設(shè)備的示例實施方式。圖2示出其中可采用此處所描述的某些機制的編輯會話的屏幕截圖200。屏幕截圖200包括可以是圖1的程序源代碼102的一部分的源代碼片段202的視圖。源代碼片段可由編輯器110顯示,但在某些配置中,可顯示源代碼片段的子集。某些部分可被保持在隨機存取存儲器中且不被顯示,或者可被保持在一個或多個文件中。源代碼片段202被編輯以示出感興趣的特定行;盡管這里沒有示出,但是可以包括源代碼的各種其他行。如圖2所示,源代碼片段包括類BaseType的類定義,以及作為BaseType的子類的類DerivedType的類定義。BaseType包括成員變量si和s2,以及成員方法baseMethodl 禾口 baseMethod2。 DerivedType 包括成員方法 derivedMethodl 禾口 derivedMethod2。代碼片段202包括變量dl、d2和d3的聲明。變量dl在靜態(tài)類型聲明中被聲明為是類型int。變量d2和d3被聲明為dynamic。在C#變成語言中,聲明為dynamic的變量繞過編譯時的靜態(tài)類型檢查。相反,dynamic變量的類型基于被賦予它的對象的類型而在運行時被確定。例如,在該代碼片段中,變量d2將收到int對象(10)的賦值;變量d3將通過方法調(diào)用收到DerivedType對象的賦值。變量d2和d3的類型被認為是在int對象或DerivedType對象被分別賦值到它們各自時在運行時被解析。在圖2的示例中,光標(biāo)203位于代碼片段202內(nèi)跟隨串“d2. ”之后的位置;光標(biāo) 204位于代碼片段202內(nèi)跟隨串“d3. ”之后的位置。如此處所討論的,放在接著標(biāo)識符和句點之后的位置中的光標(biāo)可以是列表調(diào)用事件,且可使得編輯器110調(diào)用完成列表生成器 114,完成列表生成器可接收源代碼102或其一部分。列表生成器114可分析源代碼的各部分,并執(zhí)行控制流分析以確定表達式或變量在目標(biāo)程序執(zhí)行期間可接收到的類型或候選類型,但是目標(biāo)程序在當(dāng)時可能還未被執(zhí)行。表達式在這里被稱為“目標(biāo)表達式”。變量是特定類型的表達式。當(dāng)目標(biāo)表達式是變量時,變量在這里被稱為“目標(biāo)變量”。在示例代碼片段202中,響應(yīng)于光標(biāo)203的事件而執(zhí)行的控制流分析可分析表達式,并基于對其的整數(shù)賦值確定目標(biāo)變量d2將在執(zhí)行期間接收類型int。響應(yīng)于光標(biāo)204的事件的控制流分析可分析表達式“new DerivedType ()”,并確定它將對類型DerivedType的對象求值。因此,目標(biāo)變量d3將在執(zhí)行期間解析類型DerivedType。在某些實現(xiàn)中,編譯器可轉(zhuǎn)換源代碼以創(chuàng)建一個或多個臨時變量供在運行時對表達式求值時使用。某些實現(xiàn)可在靜態(tài)分析期間確定可由編譯器創(chuàng)建的臨時變量,并執(zhí)行控制流分析來確定臨時變量的候選對象類型,以及將此用作對應(yīng)的目標(biāo)表達式的分析的一部分。盡管在示例代碼片段202中的變量d2和d3被聲明為dynamic,但是在某些實施方式中,這里所描述的機制可應(yīng)用于其聲明不存在或未知的變量。例如,列表生成器114可不具有信息來指示變量是靜態(tài)還是dynamic,并且可以類似于顯式聲明的dynamic變量的方式來應(yīng)用此處所述的過程中的至少一些過程。這適用于其他示例以及這里對dynamic變量的討論。示例屏幕截圖200包括可由編輯器110響應(yīng)于列表調(diào)用事件和完成列表生成而顯示的完成列表208的視圖。完成列表生成器114可生成完成列表208或與之對應(yīng)的數(shù)據(jù)。 編輯器110可接收所生成的完成列表并顯示它。在某些實施方式中,完成列表生成器114 可以第一表示生成完成列表,編輯器110可將此轉(zhuǎn)換成第二表示供顯示。在圖2的所示出的示例中,完成列表生成器114可確定,在光標(biāo)204的點處,目標(biāo)變量d3在執(zhí)行時將為類型DerivedType的變量。結(jié)果,完成列表生成器將 DerivedType類的成員插入到完成列表中。在所示出的示例中,這包括derivedMethodl和 derivedMethod2,它們每一個都是類DerivedType中定義的方法。在一個實施方式中,一旦確定對象的候選類型,完成列表生成器可插入除了對象的類所定義的那些成員之外的可用于對象的成員。例如,可包括可用于對象的父類或任何祖先類的成員。在所示出的示例中,類BaseClass的成員被插入完成列表中。這些是變量 si和s2,以及方法baseMethodl和l3aseMethod2。在一個實施方式中,完成列表的條目被排序,使得最特殊的類出現(xiàn)在父或祖先的成員的類之前,但是各種實施方式可以各種方式來排序它們。在某些實施方式中,可基于編輯器中已經(jīng)輸入的字符來過濾完成列表的條目。例如,如果在句點之后輸入了字母‘b’,則除了以字母‘b’開頭的成員之外的成員可被排除在所產(chǎn)生的完成列表之外。應(yīng)注意,盡管示例代碼片段202示出了對d2和d3的簡單賦值,但是在各種程序
10中,賦值可以更復(fù)雜且可執(zhí)行更復(fù)雜的控制流分析。例如,變量可以是具有中間變量的賦值鏈的一部分,如以下代碼片段中那樣。dynamic d3, d4, d5 ;d3 = new DerivedType ();d4 = d3 ;d5 = d4 ;d5.從而,完成列表生成器的控制流分析可確定在運行時d5將為類型DerivedType的對象,且相應(yīng)地對其生成完成列表。在另一示例中,可將一個或多個級別的功能調(diào)用包括在導(dǎo)致對象類型被賦予動態(tài)變量的鏈中。分析可因此跟隨一功能調(diào)用鏈,以確定對象類型。在另一示例中,變量可被有條件地賦予若干對象類型之一。圖4示出了一個這樣的示例。在一個實施方式中,用戶可從完成列表208選擇項目???06表示一選擇的項目, 它可以各種方式被突出顯示或指出。一個實施方式可顯示信息框210,具有對應(yīng)于所選項目的信息。例如,信息框210可顯示方法的聲明,包括其參數(shù)的指定、方法的文本說明、或該方法可引起的異常列表。各種實現(xiàn)可顯示其他類型的信息。圖3示出其中可采用此處所描述的某些機制的示例編輯會話的屏幕截圖300。在屏幕截圖300中,源代碼片段302包括對變量d的兩個賦值,各自在備選條件子句中。在 “if”子句中,可在運行時將類型ClassA的對象賦給d。在“else”子句中,可在運行時將類型ClassB的對象賦給d。通過響應(yīng)于在“if”子句中光標(biāo)304跟隨在“d. ”之后的列表調(diào)用事件執(zhí)行控制流分析,完成列表生成器114可確定在運行時的這一點,d將是類型ClassA 的對象,且插入諸如完成列表308中所顯示的類成員等對應(yīng)的類成員。類似的,通過響應(yīng)于在“else”子句中光標(biāo)306跟隨在“d. ”之后的事件執(zhí)行控制流分析,完成列表生成器114 可確定在運行時的這一點,d將是類型ClassB的對象,且插入諸如完成列表310中所顯示的類成員等對應(yīng)的類成員。因此,在一個實施方式中,完成列表生成器包括識別對對象的類的確定可基于其在源代碼中的位置、以及相應(yīng)地生成完成列表的邏輯。許多其他代碼配置可存在,其中完成列表生成器114可基于控制流分析和源代碼內(nèi)的當(dāng)前位置來確定對象的類型。如此處所討論的,在一個實施方式中,完成列表生成器114可包括從當(dāng)前位置不可達的指令確定的候選類型;基于控制流分析,可基于相關(guān)聯(lián)的指令是否可達來在完成列表中對成員排序。圖4示出其中可采用此處所描述的某些機制的示例編輯會話的另一屏幕截圖 400。在屏幕截圖400中,源代碼片段402包括將ClassA、ClassB和ClassC聲明為從 BaseType派生的類。源代碼片段402包括具有3個備選返回語句的條件控制流。前兩個返回語句分別返回類型ClassA或ClassB的對象。第三個返回語句返回類型ClassC的對象,它可通過在調(diào)用AnotherMethodO之后分析AnotherMethod ()的代碼并觀察到這返回類型ClassC的對象來被確定。因此,方法SomeMethodO返回三種候選類型之一的對象。對 SomeMethod ()的調(diào)用以及對dynamic對象dl的賦值使得dl在運行時成為這三種類型之一的對象。響應(yīng)于光標(biāo)404跟在“dl. ”之后的列表調(diào)用事件,完成列表生成器114可執(zhí)行對 SomeMethodO和AnotherMethod ()的控制流分析,確定對象dl的三種候選類型。對于這三種類型中的每一種,完成列表生成器114可插入對應(yīng)的類成員,使得完成列表包括所有三種類的成員。完成列表408示出這種示例。盡管未示出,但完成列表408可包括ClassA、 ClassB和ClassC中的每一個的祖先類的成員。如圖4所示,在跟隨方法調(diào)用時,控制流分析可擴展許多級。調(diào)用可形成有向圖。 在某些實施方式中,完成列表生成器114可被配置成對控制流分析期間被檢驗的圖的深度進行限制。在一個實施方式中,完成列表生成器114可被配置成以另一種方式來限制其分析,例如通過插入的指定數(shù)目的候選類、執(zhí)行時間量或另一因素。要注意,圖3和圖4的示例的不同在于,盡管每個代碼片段為dynamic對象提供了不止一個候選類型,但是在光標(biāo)304和306的每一個的位置處,僅一個候選類型被確定。如果列表調(diào)用事件發(fā)生在if-then-else語句外部,則多個類可能是可能的,且完成列表將反映此,如圖4的示例那樣。代碼片段402還示出變量之間的候選類型集的轉(zhuǎn)移。變量d2被聲明為dynamic, 變量dl被賦給它。響應(yīng)于光標(biāo)410跟在“d2. ”之后的列表調(diào)用事件,完成列表生成器114 可確定變量d2可以是可被賦予變量dl的任何對象,且因此在控制流分析期間,變量dl的候選類型可被轉(zhuǎn)移給變量d2。因此,在光標(biāo)410的點處關(guān)于變量d2的控制流分析可在該點處執(zhí)行變量dl的控制流分析,導(dǎo)致諸如完成列表408之類的具有將位于變量dl的完成列表上的成員的完成列表。圖5A示出其中可采用此處所描述的某些機制的另一示例編輯會話的屏幕截圖 500。在屏幕截圖500中,源代碼片段502包括具有dynamic參數(shù)ρ的method5的聲明。該聲明不指示出參數(shù)P的類型;P的類型將在其在運行時被調(diào)用時被解析,且可隨每個調(diào)用而不同。然而,響應(yīng)于光標(biāo)504跟隨在“p. ”之后的列表調(diào)用事件的控制流分析可被執(zhí)行來找到method5的調(diào)用。在該示例中,存在兩個這樣的調(diào)用。在一個調(diào)用中,類型ClassA的對象作為對應(yīng)于參數(shù)P的自變量被傳遞,且因此要被賦給P。在第二個調(diào)用中,類型ClassB的對象作為對應(yīng)于參數(shù)P的自變量被傳遞。可推斷參數(shù)P可成為類型ClassA或ClassB的變量。因此,完成列表生成器114可將ClassA和ClassB添加到變量ρ的候選類型集。源代碼片段502示出了表達式到變量的賦值,但是它們是通過自變量的傳遞而不是通過賦值語句而完成的。如此處所討論的,完成列表生成器114可檢索候選類ClassA和ClassB的類成員名稱。完成列表508示出具有ClassA方法ClassAMethodl、ClassAMethod2和 ClassABMethod以及ClassA變量ClassAvarl的示例完成列表。完成列表還包括ClassB方法 ClassBMethodl、ClassBMethod2 禾口 ClassABMethod 以及 ClassB 變量 ClassBvarl0該示例完成列表508包括具有公共名稱的兩個方法。在該示例中,ClassA包括名為ClassABMethod的方法;ClassB包括名為ClassABMethod的方法。該方法名稱可以是可能想要選擇對于ClassA和ClassB都公共的方法的程序員特別感興趣的。在一個實施方式中,對于多個候選類公共的成員或與多個源代碼指令相關(guān)聯(lián)的成員可在完成列表中排序在其他成員之前。圖5B示出其中可采用此處所描述的某些機制的另一示例編輯會話的屏幕截圖 520。在屏幕截圖520中,源代碼片段522包括method6的兩個聲明,其中一個method6 (稱為method6 (ClassA))具有類型ClassA的參數(shù),并返回類型ClassA的對象,而一個
12method6(稱為method6 (ClassB))具有類型ClassB的參數(shù)并返回類型ClassB的對象。因此,方法被重載,調(diào)用由傳遞給它的自變量來確定。methode的調(diào)用傳遞被聲明為dynamic 的自變量。響應(yīng)于光標(biāo)5M跟隨在methode的調(diào)用之后的列表調(diào)用事件,可執(zhí)行控制流分析來確定要處于完成列表中的可用方法或成員。還要注意,在該示例中,目標(biāo)表達式不是變量,但卻是包括方法調(diào)用的表達式。在該示例中,控制流分析可確定dynamic變量d6被用于調(diào)用作為ClassA的方法的ClassAMethod??赏茢嘣趍ethod6的調(diào)用中傳遞的自變量d6具有類型ClassA,且因此 method6 (ClassA)被調(diào)用,返回ClassA的對象。因此,ClassA可被添加到對應(yīng)于目標(biāo)表達式的完成列表的候選類型集。如此處所討論的,在某些實施方式中,可做出methode (ClassB) 也可被調(diào)用的推斷,且ClassB可被添加到候選類型集。在某些實施方式中,完成列表可被排序,使得基于methode的調(diào)用,與ClassA相關(guān)聯(lián)的成員被列出在ClassB的成員之前。盡管在圖5B中未示出,但是在某些配置中,對除了變量之外的目標(biāo)表達式的完成列表的確定可采用此處所討論的其他技術(shù)中的一個或多個。例如,對在目標(biāo)表達式中使用時變量d6的可能類型的分析可采用此處所述的任何機制,包括應(yīng)用于目標(biāo)變量的靜態(tài)分析或動態(tài)分析。例如,盡管在圖5B中未示出,但是在某些實施方式中,可執(zhí)行動態(tài)分析來確定圖5B的目標(biāo)表達式的完成列表。運行時監(jiān)控程序可確定目標(biāo)表達式中的methode的調(diào)用返回類型ClassA的對象一次或多次,并基于此觀察而將該類添加到候選類型集。圖6示出其中可采用此處所描述的某些機制的另一示例編輯會話的屏幕截圖 600。在屏幕截圖600中,源代碼片段602包括dynamic變量dl的聲明,以及跟在“dl. ”之后的光標(biāo)604。響應(yīng)于光標(biāo)事件的控制流分析可定位包括在運行時使用變量dl的一個或多個語句。在該示例代碼片段中,示出了三個這樣的語句。dl. ClassAMethodl ();dl. Bvarl = 7 ;dl. CDvar = "hello";第一個語句調(diào)用綁定到變量dl的對象的方法(ClassAMethodl)。第二個語句引用變量dl的成員變量(Bvarl)。第三個語句引用變量dl的另一成員變量(CDvar)。例如,假設(shè)ClassAMethodl定義在類ClassA中的,Bvarl定義在類ClassB中,CDvar定義在兩個類 ClassC 和 ClassD 中。在一個實施方式中,完成列表生成器114可從源代碼檢索這些成員名稱中的每一個,并將它們添加到完成列表中,如完成列表606所示。完成列表生成器114可在諸如數(shù)據(jù)庫112之類的數(shù)據(jù)庫中查找每個成員,以檢索附加信息用于在完成列表606或信息框中顯示。在一個實施方式中,完成列表生成器114可從源代碼檢索這些成員名稱中的每一個,并對于每個名稱,確定定義這些名稱的一個或多個類。在該示例中,可確定類ClassA、 ClassB、ClassC和ClassD定義了這三個成員名稱。這些類中的每一個可被添加到候選類型集,且每個類的成員可被插入完成列表。完成列表608示出這種完成列表的示例,具有這四個類的聚集成員列表,包括源代碼中未被引用的成員。盡管與完成列表606和完成列表608相關(guān)聯(lián)的技術(shù)可與備選實施方式相關(guān)聯(lián),但是某些實施方式可組合這些技術(shù)或其部分。例如,在一個實施方式中,類成員可被分組成多個完成列表。在一個實施方式中,可基于每個類成員被確定的機制來排序類成員。這些實施方式在本文中進一步更詳細地討論。代碼片段610示出對目標(biāo)變量的其他使用。在該示例中,代碼片段610包括 dynamic變量d2,它被賦予來自未知方法或返回類型未知的某一方法的對象。響應(yīng)于光標(biāo) 612跟隨在文本“d2. ”之后的列表調(diào)用事件的控制流分析可定位其中使用變量d2的以下示例語句。d2. ClassAMethodl ();ClassB d3 = d2 ;method5(d2); dynamic d4 = d2 ;第一個語句引用ClassA的成員。如上所述,完成列表生成器114可基于該引用將 ClassA添加到候選類型集。第二個語句在表達式中使用變量d2,將綁定到d2的對象賦給變量d3,d3被靜態(tài)地聲明為具有類型ClassB。在一個實施方式中,完成列表生成器114可推斷表達式可以是與它正被賦予的變量相同的類型,以及推斷用作表達式的dynamic變量可以是相同類型。因此,ClassB可被添加到候選類型集。對method5的調(diào)用使用被賦給method5中的參數(shù)p2的變量d2作為自變量。這類似于對d3的賦值,但是這是通過方法調(diào)用而不是通過賦值語句的賦值。參數(shù)p2被聲明為具有類型ClassC。因此,可推斷變量d2可具有類型ClassC。因此,該類可被添加到候選類型集。在第四個示例性使用中,變量d2被用作賦給另一 dynamic變量d4的表達式。在確定變量d2的類型推斷時,完成列表生成器114可遞歸地在賦值的位置處確定變量d4的候選類型。這可導(dǎo)致在語句d4. ClassEMethodl ()中對d4的使用。如此處所討論的,這種對ClassE的方法的引用可允許推斷ClassE是d4的候選類型。因此,ClassE成為變量d2 的候選類型。因此,此處所描述的機制可被鏈在一起,或遞歸地被應(yīng)用,以確定目標(biāo)表達式的候選類型。在所示示例中,完成列表生成器可因此將ClassA、ClassB、ClassC和ClassE的成員插入到完成列表中,如完成列表614中所示。圖7A-C分別示出其中可采用此處所描述的某些機制的示例編輯會話的其他屏幕截圖700、710和720。這些屏幕截圖提供了各配置的示例,其中用于確定候選對象類型的提示駐留在除了源代碼的主匯編件之外的匯編件中。在屏幕截圖700中,源代碼片段702包括賦值,其中Microsoft. Office. Interop. Excell.dll互操作匯編件(interop assembly)創(chuàng)建工作表對象。這被認為是編譯時匯編件104。在一個配置中,從該COM API返回的對象可被當(dāng)作dynamic來處理。響應(yīng)于光標(biāo) 704在所示位置的列表調(diào)用事件,完成列表生成器114可基于對該匯編件的調(diào)用來確定變量dl將成為指定的互操作匯編件中所定義的對象類型。可獲得這些類型的列表,且可將這些類型的成員插入到完成列表中,如完成列表708所示的。在屏幕截圖710中,源代碼片段712包括賦值,其中使用要在運行時被加載的外部匯編件來初始化dynamic變量d2。響應(yīng)于光標(biāo)714位于所示位置的列表調(diào)用事件,完成列表生成器114可檢索傳遞給LoadO調(diào)用的串(在該示例中是“System, dll”),在編輯會話
14中時加載該匯編件,以及基于該匯編件確定候選類型和成員。動作可進一步包括基于傳遞給GetTypeO調(diào)用的串(該示例中的“UnBuilder”)來確定候選類型。在一個實施方式中, 如此確定的候選類型的對象可在編輯會話中時被實例化。反射可被用于獲得指定類型的成員的列表。以此方式獲得的成員可被插入到完成列表中,如完成列表718所示的。在某些實施方式中,一旦加載如上所述的匯編件,則諸如在所加載的匯編件內(nèi)執(zhí)行控制流分析之類的此處所述的其他機制可被用于確定從該匯編件返回的對象的候選類型。因此,盡管匯編件被認為是運行時匯編件,但是這些機制在可在編輯會話期間加載匯編件。在屏幕截圖720中,源代碼片段722包括賦值,其中使用要在運行時被加載的動態(tài)語言的腳本文件來初始化dynamic變量d3。響應(yīng)于光標(biāo)7 在所示位置處的列表調(diào)用事件, 完成列表生成器114可在編輯會話期間加載此腳本文件,以及基于此來確定候選類型和成員。以此方式獲得的成員可被插入到完成列表中,如完成列表7 所示的。在一個實現(xiàn)中,為了對圖7A-C所示的每個機制限制完成列表中的類型數(shù)量或項目數(shù)量,完成列表生成器114可延遲插入來自指定的匯編件或腳本文件的項目,直到在列表調(diào)用事件之后輸入了至少第一個字符。然后可對項目進行過濾以排除不以所輸入的字符開始的那些項目。在一個實現(xiàn)中,可通過使用此處所述的其他技術(shù)來過濾來自指定的匯編件或腳本文件的項目,例如分析從源代碼的其他語句中使用的變量dl、d2或d3引用的成員或使用變量的其他方式。此外,圖7A-C所示的每個機制可用作此處所述的控制流分析的結(jié)果,當(dāng)將項目插入到完成列表中時,可組合不同機制的結(jié)果。簡單的示例可以是將對象賦給dynamic變量d 的一系列條件語句,其中任一條件語句可包括從編譯時匯編件、運行時匯編件、腳本文件或被編輯的文件的源代碼檢索。因此,從這些條件語句中的每一條件語句檢索的類型或成員可被組合以生成完成列表。圖8是示出向用戶提供完成列表的過程800的示例實施方式的流程圖。在一個實施方式中,過程800的某些動作是由圖1的計算機系統(tǒng)100的組件執(zhí)行的。過程800的示出的部分可在框802啟動,在框802可檢測列表調(diào)用事件。在一個實施方式中,編輯器110可檢測列表調(diào)用事件并調(diào)用列表生成器114。過程可流到框804,在框804接收程序源代碼的至少一部分和當(dāng)前編輯上下文。該上下文可包括編輯光標(biāo)的位置、光標(biāo)前的文本串、源代碼文件中的位置、源代碼文件名、或其他此類信息。對表示程序變量的標(biāo)識符的指定可被包括作為上下文的一部分或可從上下文導(dǎo)出。對其生成對應(yīng)的完成列表的變量此處被稱為“當(dāng)前”變量。盡管框804被示為單個框,但是這些動作可分布在過程800的動作中。例如,源代碼的各部分可在過程期間在被請求時接收。過程800可流到框806,在框806可執(zhí)行控制流分析。如此處所討論的,這些動作可包括分析源代碼的各部分、確定程序流或變量初始化的有向圖、或程序分析的其他方面。過程可流到框808,在框808可確定當(dāng)前變量的一個或多個候選類型。這可基于賦值、成員引用、使用、聲明、或與當(dāng)前變量或可直接或間接與當(dāng)前變量相關(guān)的其他變量有關(guān)的其他程序組件。圖9示出框808的進一步細節(jié)的示例動作???08的動作可導(dǎo)致在當(dāng)前上下文中當(dāng)前變量的一組一個或多個候選變量或?qū)ο箢愋汀T摻M被稱為候選類型集。該過程可流到框810,在框810可檢索與候選類型集相關(guān)聯(lián)的成員的名稱。例如,如果類型是類,則成員可包括為該類定義的且可用于由當(dāng)前變量引用的變量或方法。框810 的動作可包括生成包括與候選類型集的類型相關(guān)聯(lián)的成員的聯(lián)合的完成列表。過程可流到框812,在框812可基于光標(biāo)的位置處的前綴來過濾完成列表的成員。 可過濾成員以排除不匹配前綴的那些成員。例如,如果光標(biāo)前的串是“d.na”,則完成列表可被過濾以排除不以子串“na”開頭的成員名稱。在某些實現(xiàn)中,過濾可與框810的動作集成。過程可流到框814,在框814成員可基于配置的準(zhǔn)則被過濾,被形成為一個或多個組,或基于配置的準(zhǔn)則被排序。在某些實施方式中,完成列表生成器可響應(yīng)于調(diào)用而創(chuàng)建多個候選類型集或多個完成列表。多個列表可以按各種方式來分組。在一個實施方式中,列表可基于用于生成每個列表中的項目的技術(shù)來分組。例如,圖6的完成列表606和608示出用于生成完成列表的兩種技術(shù)。一個實施方式可生成這兩個完成列表。用戶界面可提供供用戶選擇和查看列表之一、同時查看兩個列表或合并兩個列表的機制。例如,用戶界面可呈現(xiàn)一有選項卡的窗口,其中每個選項卡對應(yīng)于不同的完成列表。在另一示例中,如此處所討論的,一個完成列表可包括直接被推斷為候選類型的類的成員。另一完成列表可包括屬于對應(yīng)于第一個完成列表的類中的每一個類的父類或祖先類的成員。在另一示例中,第一個完成列表可呈現(xiàn)和在當(dāng)前匯編件中找到的候選類型相對應(yīng)的成員,一個或多個其他完成列表可對應(yīng)于其他匯編件中找到的候選類型。在一個實現(xiàn)中,完成列表的成員可被過濾以限制重復(fù)的標(biāo)識符。這可例如在多個類定義具有公共名稱的多個方法時發(fā)生。因此,在一個實現(xiàn)中,完成列表可包括完成列表中唯一的標(biāo)識符。圖5A的完成列表508示出包含了重復(fù)的成員名稱(classABMethod)的實施方式。然而,在一個實施方式中,可濾除重復(fù)的成員名稱,classABMethod.多個完成列表可以按各種方式來實現(xiàn)。例如,在一個實現(xiàn)中,可維護單個完成列表,且每次接收到對指定分組的請求時對該完成列表應(yīng)用一過濾。在一個實現(xiàn)中,多個結(jié)構(gòu)可維護多個列表,當(dāng)接收到對完成列表的請求時,可組合該多個列表。在一個實施方式中,完成列表中的項目可基于一個或多個配置的因素來排序。字母順序列表是一個此類示例。一些其他示例因素包括用于選擇組的準(zhǔn)則,如上所討論的那樣。因此,與當(dāng)前匯編件相關(guān)聯(lián)的項目可比與系統(tǒng)或外部匯編件相關(guān)聯(lián)的項目的優(yōu)先級高。 諸如完成列表606中所示的被顯式引用的成員可具有比諸如完成列表608中所示的和被引用的成員相對應(yīng)的類的成員的優(yōu)先級高。在一個實施方式中,從與目標(biāo)表達式的位置相同的控制流中可達的指令作出的對候選類型的推斷可排序在從不可達的指令作出的推斷之前。例如,在圖3中,對應(yīng)于光標(biāo)306的完成列表310可包括ClassA的成員,即使ClassA 對象的賦值從光標(biāo)306不可達。一個實施方式可對ClassB的成員劃分優(yōu)先級,并在處于該位置的完成列表中將這些成員排序在ClassA的成員之下。類成員或類可基于它與目標(biāo)表達式的使用相關(guān)聯(lián)的次數(shù)來劃分優(yōu)先級。在一個實施方式中,系統(tǒng)可跟蹤描述用戶選擇列表項目的次數(shù)的數(shù)據(jù),并基于該歷史數(shù)據(jù)來對列表項目劃分優(yōu)先級。在一個或多個先前的運行時期間由監(jiān)控程序維護的數(shù)據(jù)可被用來基于使用頻率、運行時控制流或其他歷史數(shù)據(jù)來排序類或類成員。該過程可流到框816,在框816成員可被插入到一個或多個完成列表中,如此處所討論的。
16
過程可流到框818,在框818可顯示一個或多個生成的完成列表或其一部分。圖 2-7示出所顯示的完成列表的表示。過程可流到完成框520,并退出或返回到作出調(diào)用的程序。在一個配置中,框802和818的動作可由編輯器110執(zhí)行,框804-816的動作可由列表生成器114執(zhí)行。然而,在各種實現(xiàn)中,過程800的動作可在編輯器110、列表生成器 114或系統(tǒng)100的其他組件(包括圖1中可能沒有示出的那些組件)之間不同地分布。盡管過程800的動作是以離散框呈現(xiàn)的,但是在各種實現(xiàn)中,它們可以各種順序被組合或以各種方式被混合,包括一個或多個線程同時執(zhí)行的動作。因此,圖8提供了對示例實施方式的描述,但實現(xiàn)方式可變化。圖9是示出確定程序表達式的一個或多個候選類型的過程900的示例實施方式的流程圖。過程900可用于實現(xiàn)過程800的框808的至少一些動作。過程900可在循環(huán)902 處開始,循環(huán)902對于變量類型的可能的指示進行迭代。在所示出的實施方式中,循環(huán)902 包括框904-920,并終止于框928。在框904,使用控制流分析,可遵循目標(biāo)程序流以找到當(dāng)前變量的可能的初始化, 或變量類型的其他指示。這可包括以正向或反向遍歷目標(biāo)程序、遵循方法調(diào)用、遵循備選流分支,或流控制分析的其他技術(shù)。盡管示為單個框,但是框904的動作可與過程900的任何其他框的動作一起執(zhí)行。該過程可確定控制流分析期間達到的配置。盡管圖9示出了對應(yīng)于可能的配置的若干判定框,但是各實現(xiàn)可關(guān)于過程如何基于源程序配置來確定要采取的動作而變化。在判決框906,作出關(guān)于是否找到當(dāng)前變量的靜態(tài)類型聲明的判定。靜態(tài)類型聲明的示例是int vl = 5 ;該語句既將變量vl聲明為整型,又將其初始化為值5。如果在判決框906判定是肯定的,則過程可流到框908,在框908可將來自該聲明的指定的類型插入候選類型集。在一個實施方式中,父類和其他祖先類的類型可被插入到候選類型集中。過程可流到框928, 在框擬8終止循環(huán)902?;谠闯绦蚺渲谩?dāng)前上下文或過程實現(xiàn),可循環(huán)回到循環(huán)902或退出循環(huán)。在某些實現(xiàn)中,在存在與確定類型有關(guān)且還未被過程900分析的程序部分時,循環(huán)902可繼續(xù)。在某些實現(xiàn)中,一個或多個指定的限制可使得循環(huán)902退出。例如,對候選類型集中類型數(shù)量的限制、對被分析的代碼量的限制、對對應(yīng)于候選類型集的成員數(shù)量的限制、執(zhí)行時間限制或另一指定的限制可使得循環(huán)902退出。在循環(huán)902的最后一次迭代之后,過程可返回到作出調(diào)用的程序,例如過程800。在一個實施方式中,關(guān)于變量不具有靜態(tài)類型聲明的判定意味著變量是dynamic 類型。因此,在該實施方式中,框910-920的動作被應(yīng)用于dynamic類型。在一個實施方式中,框910-920的動作可應(yīng)用于靜態(tài)類型,例如用于確定所聲明的類型的候選子類。在某些配置中,沒有靜態(tài)類型聲明的變量可不具有dynamic類型的聲明。例如,這可發(fā)生在源代碼是不完整的環(huán)境中。在一個實施方式中,沒有類型聲明的變量以類似于被聲明為dynamic 的變量的方式被處理。用于此類變量的過程可從判決框906流到判決框910。如果在判決框906判定是否定的,則過程可流到判決框910,在判決框910作出關(guān)于是否找到對當(dāng)前變量的賦值的判定。如此處所討論的,這可發(fā)生在賦值語句、被傳遞以賦值給功能參數(shù)的自變量或另一程序構(gòu)造的上下文中。如果在判決框910判定找到對當(dāng)前變量的賦值,則過程可流到框912,在框912過程可遞歸地分析表達式以確定要被賦予它的一個或多個類型,以及推斷這些是候選類型。 取決于賦予了什么,這可包括附加的控制流,例如遵循方法調(diào)用,或確定另一變量的一個或多個候選類型。圖2-5的代碼片段202、302、402、502分別包括賦值和表達式的示例。過程隨后可流到框擬8并如上所述地繼續(xù)。如果在判決框910判定沒有找到對當(dāng)前變量的賦值,則過程可流到判決框914,在判決框914作出關(guān)于是否找到對當(dāng)前變量的使用的判定。代碼片段402提供了對變量d的四種示例使用。這些包括調(diào)用成員方法、引用成員變量、將變量賦給賦值語句中的另一變量、以及通過將變量作為自變量傳遞給方法將變量賦給參數(shù)。如果判決框914的判定是肯定的,則過程可流到框916,在框916可從變量的使用情況來推斷一個或多個類型。將目標(biāo)表達式賦給另一變量允許作出另一變量的類型是目標(biāo)表達式的候選類型的推斷。這可采用賦值語句、在功能調(diào)用中傳遞的自變量、或其他類型的賦值的形式。如圖6的代碼片段610 中的d2到d4的示例賦值所示,分析被賦給第二變量的目標(biāo)表達式或變量可包括使用此處所討論的機制遞歸地分析第二變量的候選類型。目標(biāo)表達式的成員引用允許作出顯式地或通過繼承而暴露該成員的類型是目標(biāo)表達式的候選類型的推斷。在某些情況中,這可包括多個類型。過程隨后可流到框9 并如上所述地繼續(xù)。如果在判決框914判定是否定的,則過程可流到判決框920,在判決框920作出關(guān)于程序流是否導(dǎo)向多個備選控制流的判定。圖5A的代碼片段502提供了條件備選控制流的示例。如果在判決框920的判定是肯定的,則過程可流到框922,在框922,過程900或其一部分可對控制流的每個備選分支遞歸地執(zhí)行。在示例代碼片段502中,可發(fā)起三個遞歸過程。盡管這些動作在此是按照遞歸來描述的,但是要理解這是概念性的描述,且各種實現(xiàn)方式可使用除了遞歸之外的技術(shù)來對流的每個分支執(zhí)行過程900或其一部分。作為遞歸地處理每個分支的結(jié)果,可將來自每個分支的零個、一個或更多個候選類型添加到候選類型集,且相關(guān)聯(lián)的成員可被添加到完成列表。過程隨后可流到框9 并如上所述地繼續(xù)。如果在判決框920判定是否定的,則過程可流到判決框924,在判決框擬4作出關(guān)于程序流是否導(dǎo)向另一匯編件或腳本的判定。如果該判定是肯定的,則過程可流到框920, 在框920可分析附加的匯編件或程序腳本。圖10的過程1000示出了這些動作的示例實施方式。過程可流到框9 并如此處所述地繼續(xù)。如果在判決框擬4判定是否定的,則過程可流到框擬8并如此處所述地繼續(xù)。圖10是示出基于程序代碼確定程序變量的一個或多個候選類型的過程1000的示例實施方式的流程圖。過程1000可實現(xiàn)框926的動作或其一部分。過程1000的動作可以各種順序和各種方式執(zhí)行,當(dāng)前的僅用于說明。過程1000可開始于判決框1006,在判決框1006作出關(guān)于程序流是否導(dǎo)向編譯時匯編件中的程序代碼的判定。如果此判定是肯定的,則過程可流到框1008,在框1008可從指定的匯編件檢索候選類型。在一個實現(xiàn)中,這可包括檢索匯編件的對于該匯編件外部的程序代碼可用的類型的完整集合。在一個實現(xiàn)中,這可包括基于對匯編件中的方法的調(diào)用或?qū)R編件中類的引用來檢索一個或多個候選類型。在一個實施方式中,框1008的動作可包括在匯編件內(nèi)遞歸地執(zhí)行過程900的至少一部分。該過程可從框1008流到框1028,并通過退出或返回到諸如過程900之類的作出調(diào)用的過程來繼續(xù)。如果在判決框1006判定是否定的,則過程可流到判決框1012,在判決框1012作出關(guān)于程序流是否導(dǎo)向運行時匯編件中的程序代碼的判定。在某些環(huán)境中,運行時匯編件可由指令指定以使用指定的文件名來加載匯編件。如圖7B中所示,如此做的示例源代碼語句是Type myType = Assembly. Load( "System, dll “ ) · GetType ( "UriBuilder");在一個實施方式中,框1014的動作可包括在編輯會話期間加載LoadO調(diào)用中指定的匯編件。因此沒有必要等到目標(biāo)程序運行時加載匯編件并檢索候選類型。框1014的動作可包括創(chuàng)建匯編件中定義的一個或多個類中的每個類的實例,以及使用反射來確定可用成員。在上述示例中,可創(chuàng)建類型“toiBuilder”的對象。過程隨后可流到框10 并如上所述地繼續(xù)。如果在判決框1012判定是否定的,則過程可流到判決框1016,在判決框1016作出關(guān)于程序流是否導(dǎo)向動態(tài)語言腳本中的程序代碼的判定。在某些環(huán)境中,程序指令可指定對動態(tài)語言腳本的加載,這可作為程序執(zhí)行的一部分來執(zhí)行。如果此判定是肯定的,則過程可流到框1018,在框1018加載指定的腳本。圖7C示出了這樣做的示例源代碼指令。在一個實施方式中,框1018的動作可包括加載指令中指定的腳本以加載腳本,以及搜索指定的匯編件以及本發(fā)明方案的范圍內(nèi)的其他匯編件,以檢索候選類型集和成員。 過程隨后可流到框10 并如上所述地繼續(xù)。如果在判決框1016判定是否定的,則過程可流到框10 并如上所述地繼續(xù)。圖11是示出基于目標(biāo)計算機程序的動態(tài)分析確定程序變量的一個或多個候選類型的過程1100的示例實施方式的流程圖。過程1100可由計算機系統(tǒng)100的組件執(zhí)行。過程1100可開始于框1102,在框1102可改編目標(biāo)程序以便于在運行時期間監(jiān)控該程序。改編可包括在特定位置插入程序指令以引起諸如圖1的運行時監(jiān)控程序1 之類的程序監(jiān)控程序監(jiān)控的事件。在一個實施方式中,改編目標(biāo)程序可基于dynamic程序變量的標(biāo)識。一個這樣的示例可以是在對dynamic程序變量的每個賦值之后引起事件。事件也可指示出在程序執(zhí)行期間采取的分支或調(diào)用的功能。盡管目標(biāo)程序的改編可用運行時監(jiān)控的某些技術(shù)來實現(xiàn),但是某些技術(shù)不使用改編。因此,1102的動作可在某些實現(xiàn)中被忽略, 或者可使用用于設(shè)置運行時監(jiān)控的其他機制。過程可流到框1104,在框1104至少部分地執(zhí)行運行時程序。在框1106,程序執(zhí)行被監(jiān)控以檢測諸如賦值、所采用的執(zhí)行路徑、所調(diào)用的功能等之類的事件。監(jiān)控程序執(zhí)行可包括檢測通過賦值語句、通過在功能調(diào)用中傳遞要被賦予功能參數(shù)的對象、或通過另一類型的賦值來賦予目標(biāo)程序變量的對象。這些運行時類型解析向運行時監(jiān)控程序提供了被綁定到程序變量的特定對象。在某些實施方式中,運行時監(jiān)控程序可檢查運行時棧的狀態(tài)或內(nèi)容。例如,運行時棧上的數(shù)據(jù)對象的類型或值可指示出對象或表達式的類。在某些配置中,運行時棧上的數(shù)據(jù)對象可以和表示在運行時被求值的表達式的臨時變量相對應(yīng)。運行時監(jiān)控程序1 可標(biāo)識被賦值的對象的類。在一個實施方式中,被改編的指令或從被改編的指令調(diào)用的幫助功能可執(zhí)行動作來標(biāo)識對象的類。在一個實施方式中,運行時監(jiān)控程序1 可結(jié)合調(diào)試器一起操作,來標(biāo)識對象和它們的類。例如,調(diào)試器可插入一個或多個跟蹤點,并記錄每個跟蹤點處的信息。運行時監(jiān)控程序1 可使用反射來確定對象的類或類成員。在一個實施方式中, 反射可被用于確定和從運行時匯編件接收的對象相對應(yīng)的類信息。對象可實現(xiàn)使得運行時監(jiān)控程序能夠查詢數(shù)據(jù)對象的接口。查詢可提供對象的類型或便于確定對象的類型的其他信息。在一個實施方式中,可響應(yīng)于檢測到諸如調(diào)用或進入某一功能、退出某一功能、對程序變量賦值、對條件指令的執(zhí)行、或達到斷點等事件來使用反射。該過程可流到框1108。在框1108,在監(jiān)控期間檢索到的數(shù)據(jù)可被存儲,例如存儲在運行時數(shù)據(jù)庫130中???104的動作可發(fā)生一次或多次。更具體的,目標(biāo)程序可被執(zhí)行多次。對于每個執(zhí)行,可檢測并存儲一個或多個賦值或執(zhí)行流。過程可流到框1110,在框1110可從運行時數(shù)據(jù)庫130檢索數(shù)據(jù),可基于運行時賦值或執(zhí)行流將一個或多個類型添加到候選類型列表???110的動作可由完成列表生成器 114執(zhí)行,并可在目標(biāo)程序執(zhí)行之后在編輯會話期間發(fā)生。在一個實施方式中,過程可流向框1112,在框1112基于動態(tài)分析期間檢索到的運行時數(shù)據(jù)來排序候選類型或類成員。如此處所討論的,這可基于賦值的頻率。與運行時綁定相關(guān)聯(lián)的類可被排序在由諸如靜態(tài)分析等其他機制確定的其他類之前。在某些實施方式中,從執(zhí)行過程1110得出的成員可被分組在一起并與通過使用源代碼分析確定的成員分開顯示。在某些實施方式中,對成員的排序可基于目標(biāo)程序的動態(tài)分析和控制流分析的組合。例如,動態(tài)分析所確定的成員可被給予更高的優(yōu)先級,并排序在控制流分析確定的成員
> . 、r -d“過程可流向完成框1114并退出,或返回到作出調(diào)用的程序。過程1100或其部分可與這里所述的諸如過程800、900或1000之類的其他機制組合或集成。圖12示出了計算設(shè)備1200的一個實施方式,示出可用于實現(xiàn)系統(tǒng)100或執(zhí)行此處所描述的功能(包括過程800、900、1000或1100)的計算設(shè)備的所選組件。計算設(shè)備1200 可包括比所示多得多的組件,或可包括比所示全部組件要少的組件。計算設(shè)備1200可以是獨立計算設(shè)備或諸如具有一個或多個刀片的機箱中的某一刀片之類的集成系統(tǒng)的一部分。如所示,計算設(shè)備1200包括一個或多個處理器1202,處理器執(zhí)行動作以執(zhí)行各種計算機程序的指令。在一個配置中,每個處理器1202可包括一個或多個中央處理單元、一個或多個處理器核、一個或多個ASIC、高速緩存存儲器或其他硬件處理組件和相關(guān)程序邏輯。如所示,計算設(shè)備1200包括操作系統(tǒng)1204。操作系統(tǒng)1204可以是通用或?qū)S貌僮飨到y(tǒng)。華盛頓州雷蒙德市的微軟公司的Windows 系列操作系統(tǒng)是可在計算設(shè)備1200上執(zhí)行的操作系統(tǒng)的示例。存儲器和存儲1206可包括各種類型的非瞬態(tài)計算機存儲介質(zhì)中的一個或多個, 包括易失性或非易失性存儲器、RAM、ROM、固態(tài)存儲器、盤驅(qū)動器、光學(xué)存儲、或可用于存儲數(shù)字信息的任何其他介質(zhì)。存儲器和存儲1206可存儲此處所述的一個或多個組件或其他組件。在一個實施方式中,存儲器和存儲1206存儲系統(tǒng)100的軟件組件或其一部分。所示的示例組件是編譯時匯編件104、運行時匯編件106、程序源代碼102、列表生成器114、運行時監(jiān)控程序128以及完成列表116,但是更多或更少的組件可存儲在存儲器和存儲1206中。這些組件中的任何一個或多個可通過操作系統(tǒng)1204或其他組件被移動到RAM、非易失性存儲器中的不同位置,或在RAM和非易失性存儲器之間移動。計算設(shè)備1200可包括便于將程序代碼或其他信息顯示給用戶的視頻顯示適配器 1212。盡管在圖12中未示出,但是計算設(shè)備1200可包括基本輸入/輸出系統(tǒng)(BIOS),以及相關(guān)聯(lián)的組件。計算設(shè)備1200還可包括用于與網(wǎng)絡(luò)通信的網(wǎng)絡(luò)接口單元1210。系統(tǒng)100 的軟件組件可經(jīng)瞬態(tài)介質(zhì)和網(wǎng)絡(luò)接口單元1210被接收。計算設(shè)備1200的實施方式可包括顯示監(jiān)視器1214、鍵盤、定點設(shè)備、音頻組件、話筒、語音識別組件、或其他輸入/輸出機制中的一個或多個。將理解圖8-10的流程圖的每個框以及流程圖中的框的組合可由軟件指令來實現(xiàn)。這些程序指令可被提供給處理器以生成機器,使得在處理器上執(zhí)行的指令創(chuàng)建用于實現(xiàn)某一流程框或多個框中指定的動作的手段。這些軟件指令可由處理器執(zhí)行來提供用于實現(xiàn)某一流程框或多個框中指定的動作的步驟。此外,流程圖中的一個或多個框或框的組合也可與其他框或框的組合同時執(zhí)行,或甚至以與所示不同的順序執(zhí)行,而不背離本發(fā)明的范圍和精神。以上說明、示例和數(shù)據(jù)提供了對本發(fā)明的組成部分的制造和使用的全面描述。因為可以在不背離本發(fā)明的精神和范圍的情況下做出本發(fā)明的許多實施例,所以本發(fā)明落在所附權(quán)利要求的范圍內(nèi)。
權(quán)利要求
1.一種生成和目標(biāo)程序中的目標(biāo)表達式相對應(yīng)的完成列表(116)的基于計算機的方法(1100),所述目標(biāo)程序具有源代碼表示(10 和可執(zhí)行代碼表示(122),所述方法包括a)執(zhí)行(1104)所述目標(biāo)程序的可執(zhí)行代碼表示;b)監(jiān)控(1106)所述程序代碼的執(zhí)行以確定(1108)所述目標(biāo)程序變量的一個或多個運行時類型解析;c)對于運行時類型解析,確定(810)與該類型相關(guān)聯(lián)的一組類成員;以及d)聚集(816)—組或多組類成員。
2.如權(quán)利要求1所述的基于計算機的方法,其特征在于,所述目標(biāo)表達式是程序變量, 監(jiān)控所述程序代碼的執(zhí)行包括檢測指示出對象到所述程序變量的運行時賦值的一個或多個事件。
3.如權(quán)利要求1所述的基于計算機的方法,其特征在于,監(jiān)控所述程序代碼的執(zhí)行包括使用反射來確定所述目標(biāo)表達式的所述一個或多個運行時類型解析。
4.如權(quán)利要求1所述的基于計算機的方法,其特征在于,還包括基于對應(yīng)的一個或多個類型解析對所述一組或多組類成員進行排序。
5.如權(quán)利要求1所述的基于計算機的方法,其特征在于,還包括a)執(zhí)行對所述源代碼表示的靜態(tài)控制流分析;b)基于所述靜態(tài)控制流分析確定對應(yīng)于所述目標(biāo)表達式的一個或多個候選類型;以及c)聚集對應(yīng)于所述一個或多個候選類型的類成員以及所述一組或多組類成員。
6.如權(quán)利要求1所述的基于計算機的方法,其特征在于,還包括a)執(zhí)行對所述源代碼表示的靜態(tài)控制流分析;b)基于所述靜態(tài)控制流分析確定對應(yīng)于程序變量的一個或多個候選類型;以及c)聚集對應(yīng)于所述一個或多個候選類型的類成員以及所述一組或多組類成員;d)基于運行時類型解析對完成列表排序。
7.如權(quán)利要求1所述的基于計算機的方法,其特征在于,還包括通過插入便于監(jiān)控所述程序代碼的執(zhí)行的指令來改編所述目標(biāo)程序。
8.如權(quán)利要求1所述的基于計算機的方法,其特征在于,監(jiān)控所述程序代碼的執(zhí)行包括從運行時匯編件接收的至少一個對象,所述方法還包括確定至少一個對象的至少一個類型,以及將所述至少一個類型與所述目標(biāo)表達式的運行時類型解析包含在一起。
9.如權(quán)利要求1所述的基于計算機的方法,其特征在于,所述目標(biāo)表達式是程序變量, 所述源代碼包括將所述程序變量聲明為dynamic (動態(tài))類型。
10.一種用于生成和具有對應(yīng)的目標(biāo)程序源代碼(10 的目標(biāo)程序O02)中的目標(biāo)程序變量相對應(yīng)的完成列表(116)的基于計算機的系統(tǒng)(100),所述系統(tǒng)包括a)分析器(115),被配置成執(zhí)行對目標(biāo)程序源代碼執(zhí)的語法分析;b)運行時監(jiān)控程序(1 ),所述運行時監(jiān)控程序檢測事件,執(zhí)行分析來確定(1108)對應(yīng)于所述目標(biāo)程序變量的至少一個運行時類型解析,基于所述至少一個運行時類型解析來確定(1110) —個或多個候選類型,以及存儲(1110)所述一個或多個候選類型;以及c)完成列表生成器(114),所述完成列表生成器檢索所述一個或多個候選類型,確定 (810)與所述一個或多個候選類型相關(guān)聯(lián)的一個或多個類成員,以及將所述一個或多個類成員插入(816)完成列表。
11.如權(quán)利要求10所述的基于計算機的系統(tǒng),其特征在于,所述完成列表生成器被配置成執(zhí)行動作,所述動作包括對所述目標(biāo)程序源代碼執(zhí)行靜態(tài)分析以及基于所述靜態(tài)分析確定至少一個附加候選類型。
12.如權(quán)利要求10所述的基于計算機的系統(tǒng),其特征在于,所述目標(biāo)程序變量是程序功能的程序功能參數(shù),所述運行時監(jiān)控程序被配置成通過確定傳遞給程序功能的對象的類型來確定所述目標(biāo)程序變量的一個或多個候選類型。
13.如權(quán)利要求10所述的基于計算機的系統(tǒng),其特征在于,所述運行時監(jiān)控程序被配置成執(zhí)行動作,所述動作包括使用反射來確定在運行時被綁定到目標(biāo)程序變量的對象的類型。
14.如權(quán)利要求10所述的基于計算機的系統(tǒng),其特征在于,所述完成列表生成器被配置成執(zhí)行動作,所述動作包括對所述目標(biāo)程序源代碼執(zhí)行靜態(tài)分析,基于所述靜態(tài)分析確定至少一個附加候選類型,確定與所述至少一個附加候選類型相關(guān)聯(lián)的一個或多個附加類成員,以及基于每個項目是否由運行時監(jiān)控程序確定來對完成列表排序。
15.如權(quán)利要求15所述的基于計算機的系統(tǒng),其特征在于,所述目標(biāo)程序變量是功能的參數(shù),所述運行時監(jiān)控程序檢測對所述功能的調(diào)用,以及通過確定通過所述調(diào)用傳遞給所述參數(shù)的對象的類型來確定所述一個或多個候選類型。
全文摘要
提供了軟件開發(fā)工具。一種用于提供與計算機程序源代碼和動態(tài)表達式相關(guān)聯(lián)的完成列表的系統(tǒng)和方法。執(zhí)行動態(tài)分析以找到并聚集表達式的一個或多個候選類型。在目標(biāo)程序的執(zhí)行期間,運行時監(jiān)控程序跟蹤指示出程序變量的類型的事件。分析可包括若干靜態(tài)分析技術(shù)中的一個或多個,包括分析被賦予程序變量的表達式、遵循方法調(diào)用、檢驗系統(tǒng)或其他指定的匯編件、加載運行時匯編件、或基于對變量的其他使用作出推斷。完成列表可基于配置的準(zhǔn)則被過濾或排序。
文檔編號G06F9/44GK102236550SQ201110117310
公開日2011年11月9日 申請日期2011年4月29日 優(yōu)先權(quán)日2010年4月30日
發(fā)明者D·J·帕克, H·常, T·揚 申請人:微軟公司