專利名稱:從代碼使用中創建所推斷的符號的制作方法
從代碼使用中創建所推斷的符號背景動態編程語言在運行時執行其他(動態編程)語言如果執行的話通常在編譯期間執行的行為。在運行時由動態語言執行的行為包括通過在程序執行期間添加新代碼、創建對象和定義、修改類型系統等等來對程序進行擴展。動態編程語言通常是動態地類型化的,這意味著,類型檢查是在運行時執行的。在動態類型化時,類型與從程序的執行中得到的值相關聯。動態類型化語言包括Clojure、Groovy> JavaScript、Lisp、Objective-C、PHP> Prolog、Python> Ruby、Smalltalk、VisualBasic中的后期綁定、IronPython和IronRuby。動態類型化沒有靜態類型化那么嚴格,但可以導致較大可能性的執行錯誤(例如由于變量的值具有不允許的類型而引起的出錯結果)。動態類型化的語言系統通常使得對源代碼的編譯時檢查較少。運行時檢查可能是更復雜的,因為除了在編譯期間存在過并且在運行時仍可用的信息之外,它們還可以使用動態(運 行時)信息。運行時檢查斷言條件在程序的特定執行中成立并且對程序的每次執行重復。綁定選擇在源代碼中時應用句法操作時使用哪個實際操作。綁定可以要么發生在編譯時(在該情況下被稱為“靜態綁定”)、要么動態地發生在運行時(這被稱為“動態綁定”)。動態綁定推遲對未定義的變量的解析直到程序運行。動態綁定與靜態綁定是不同的,因為其結果——例如被分配給操作的含義——取決于其所操作的實際值的運行時類型,而不是源代碼中的變量的編譯時類型。通常,靜態類型化的編程語言執行靜態綁定,而動態類型化的編程語言執行動態綁定。然而,當靜態語言包含動態綁定(比如具有動態語言特性的C#4. 0)或者相反時,可能具有二者的混合。測試驅動的開發是指一種迭代軟件開發技術,其中開發者首先編寫確認所期望的改進或新功能的測試情況,然后開發者產生致使測試通過的代碼,然后是重構代碼庫以考慮到任何新的系統要求。例如,包括操縱對象的邏輯的代碼可以在編寫定義所述對象的代碼以前編寫。換言之消費(消費性)代碼是在編寫被消費對象以前編寫的。概述動態編程技術和測試驅動的開發具有至少一個相互挑戰。在兩種情況下,由于底層被消費代碼還未被創建,因此依靠可用底層代碼的工具不能例如通過在用戶將代碼鍵入到源代碼編輯器中時為了自動完成而顯示可能的選擇來輔助開發過程。根據在此公開的主題的各方面,基于符號在整個代碼內的使用(或可能的使用)來創建諸如包括所推斷的節點的句法樹或語義樹和/或包括所推斷的符號的符號表之類的數據結構。所推斷的節點和/或所推斷的符號可以通過學習算法來生成。工具可以使用這樣創建的句法樹等等來提供關于還未被創建或還未被綁定的符號的信息以供用在動態編程和測試驅動的開發中。表示源代碼的數據結構可以由后臺編譯器在交互式程序開發期間生成。可以基于輸入到源代碼編輯器中的源代碼將一個或多個符號添加到數據結構,其中所述符號是在沒有所述符號的在先定義的情況下基于所述符號的使用從源代碼中推斷出的。可以基于將一組規則應用到未定義的符號來創建所推斷的符號。響應于從用戶接收到這樣做的指示,可以將所推斷的符號轉換成實符號。所推斷的符號到實符號的轉換可以由開發者的動作觸發以基于所推斷的符號自動生成源代碼。自動添加的源代碼將包括未定義的符號的定義。與所推斷的符號相關聯的信息可以響應于編程環境中的進入“建議模式”的選項的激活而顯示在軟件開發工具中。提供本概述以便以簡化的形式介紹將在以下詳細描述中進一步描述的一些概念。本概述并不旨在標識所要求保護的主題的關鍵特征或必要特征,也不旨在用于限制所要求保護的主題的范圍。附圖
簡述在附圖中圖Ia示出了根據在此公開的主題的各方面的用于從代碼使用中創建所推斷的符號的系統100的不例;圖Ib示出了現有技術中已知的樹10的示例; 圖Ic示出了根據此處所公開的主題的各方面的樹12的示例;圖2是根據此處所公開的主題的各方面的用于從代碼使用中創建所推斷的符號的方法200的示例的流程圖;圖3是示出了其中可以實現此處所公開的主題的各方面的計算環境的示例的框圖;以及圖4是根據此處所公開的主題的各方面的集成開發環境的示例的框圖。詳細描述概覽測試驅動的開發實踐的流行度日益增加。編程語言中的動態語言影響變得更加突出。因此,可能有利的是,當代碼模型還不存在或者還未已知但是仍然被消費時,軟件開發工具能夠提供關于可能的代碼的信息。在此所述的主題使得為首先消費(consume-first)編程風格創建在符號存在或符號被綁定以前提供相關信息的工具成為可能。在此公開的主題尤其是適用于編寫具有首先消費或首先測試(test-first)開發風格的代碼、以及編寫動態(后期綁定)代碼,但是能夠理解,所公開的主題適用于任何風格的計算機程序開發。在編寫代碼時,可以創建表示源代碼、基于源代碼或者與源代碼相關聯的句法樹、語義樹或符號表。對于在全局符號表中還未綁定或定義的符號,可以創建可能的或“所推斷的”節點或符號并可將其添加到由編譯器創建的句法樹、語義樹或符號表。符號類型的多個候選對于所推斷的符號而言可能都是可能的(例如該符號可以表示類或者可以表示結構體,該符號可以表示方法或者可以表示屬性)。所有候選都可以在樹/表中被表示成可能的符號,或者可替代地,可以提供服務或軟件模塊來檢索候選組。隨著用戶繼續編寫代碼,代碼模型可以基于學習模型(例如使用現有技術中已知的機器學習技術)被更新以表示附加的信息。例如,如果關于特定的所推斷的符號表示什么存在不清楚,則隨著開發者繼續編寫代碼,該不清楚可以解決或者在選擇集合中的特定選擇可以變為更加可能。在這種情況下,句法樹、語義樹或符號表中的所推斷的符號可以被更新以表示當前的知識狀態。所推斷的符號可以由包括、但不限于下列各項的軟件開發工具來使用完成列表、調用分層結構、引用列表(reference list)、對象瀏覽器、類視圖、尋找引用、導航工具等等以為還未創建或還未綁定的符號提供開發者工具。根據所公開主題的一些方面,可以通過諸如顏色、突出顯示之類的區別、通過伴隨特定圖標等等來在視覺上區分所推斷的符號。所推斷的符號可以通過激活特定的模式(例如通過激活“建議模式”選項)而被包括在傳統集成開發環境內或者在該環境內變為可見。基于所推斷的符號,由編譯器發現的錯誤條件可以觸發附加源代碼的自動生成以校正該錯誤條件。所推斷的符號可以例如通過激活“使其成真(make it real)”或“從使用生成(generate from usage)”選項被轉換成實際符號。例如,所推斷的節點可以通過激活這樣的選項被轉換成句法樹或語義樹中的具體節點。類似地,符號表中的所推斷的符號可以通過為符號表激活這樣的選項被轉換成具體符號。從代碼使用中創建所推斷的符號圖Ia示出了根據在此公開的主題的各方面的用于從代碼使用中創建所推斷的符號的系統100的示例。系統100的全部或某些部分可以駐留在諸如下面參考圖3所描述的計算機之類的一臺或多臺計算機上。系統100的全部或某些部分可以駐留在諸如下面參考圖4所描述的計算機之類的一臺或多臺軟件開發計算機(例如,計算機102)上。系統100或其一些部分可以包括諸如下面參考圖4所描述的和所示出的那些集成開發環境(例如,IDE 104)的一部分。替代地,系統100或其一些部分可以作為獨立系統或作為插件或加入件來提供。系統100可以包括以下中的一個或多個處理器(比如處理器142)、諸如存儲器144之類的存儲器、以及用于從代碼使用中創建所推斷的符號的模塊106。也可以包括本領域已知的其他組件,但此處未示出。能夠理解,用于從代碼使用中創建所推斷的符號的模塊可以被加載到存儲器144中以致使諸如處理器142之類的一個或多個處理器執行以歸因于用于從代碼使用中創建所推斷的符號的模塊106的動作。由后臺編譯器基于所輸入的源代碼創建或生成的數據結構可以被用于從代碼使用中創建所推斷的符號的模塊106修改為包括由用于從代碼使用中創建所推斷的符號的模塊106創建的所推斷的符號。所推斷的符號可以表示被消費代碼,其中當被消費代碼未存在于源代碼中時,消費代碼存在于該源代碼中。根據在此公開主題的各方面,用于從代碼使用中創建所推斷的符號的模塊106可以基于輸入到編輯器110中的消費代碼創建一個或多個所推斷的符號108。編輯器110可以表示與后臺編譯器116相關聯的源代碼編輯器,其中后臺編譯器116在用戶輸入源代碼時生成實符號的句法樹、語義樹或符號表。根據在此公開主題的各方面,用于從代碼使用中創建所推斷的符號的模塊106可以基于輸入到編輯器110中的代碼向由編譯器116所創建的實符號的句法樹、語義樹或符號表添加或修改一個或多個所推斷的符號108。此外,用于從代碼使用中創建所推斷的符號的模塊106可以基于所推斷的符號生成源代碼,如將在下面予以更充分描述。對實符號114進行操作的工具112可以被設置為附加地或替代地對所推斷的符號108進行操作。用于從代碼使用中創建所推斷的符號的模塊106可以包括或并入下列各項中的一個或多個編譯器,比如后臺編譯器、并行編譯器或增量編譯器;解析器,比如后臺解析器、并行解析器或增量解析器;或者插件、預處理器、或附件;或者對IDE、解析器、編譯器或預處理器的擴展。用于從代碼使用中創建所推斷的符號的模塊106可以與下列各項分開或相關聯編譯器,比如后臺編譯器、并行編譯器或增量編譯器;解析器,比如后臺解析器、并行解析器或增量解析器;或者插件、預處理器、或附件;或者對IDE、解析器、編譯器或預處理器的擴展。用于從代碼使用中創建所推斷的符號的模塊106可以與程序開發工具相關聯、并入程序開發工具或者與程序開發工具分開,所述程序開發工具包括、但不限于完成列表、調用分層結構、引用列表、對象瀏覽器、類視圖、尋找引用和/或導航工具。用于從代碼使用中創建所推斷的符號的模塊106可以將一個或多個所推斷的符號轉換成符號表、句法樹或語義樹中的實符號。編輯器110可以是后臺編譯器所支持的源代碼編輯器,其中后臺編譯器在開發者
或用戶編寫源代碼時生成語義和/或句法樹。例如,假定用戶編寫下列內容
權利要求
1.一種系統,包括 處理器和存儲器,所述存儲器包括被配置為致使所述處理器執行下列動作的模塊 在程序開發期間創建數據結構,所述數據結構包括由所述模塊生成的至少ー個所推斷的符號,其中所述至少ー個所推斷的符號是基于存在于輸入到源代碼編輯器中的源代碼中的消費代碼而創建的,所述至少ー個所推斷的符號表示被所述消費代碼消費的代碼,其中被消費代碼未存在于所述源代碼中。
2.如權利要求I所述的系統,其特征在于,所述至少ー個所推斷的符號是在測試驅動的開發環境中或者在動態編程環境中基于將ー組規則應用到未定義的符號而創建的。
3.如權利要求I所述的系統,其特征在于,所述至少ー個所推斷的符號被轉換成所述數據結構中的實際符號。
4.如權利要求I所述的系統,其特征在干,將所述至少ー個所推斷的符號轉換成實符號觸發了自動的、編譯器生成的對定義所述至少ー個所推斷的符號的源代碼的添加,其中定義所述至少ー個所推斷的符號的源代碼在所述源代碼編輯器中被添加到所述源代碼。
5.如權利要求I所述的系統,其特征在于,所述編程環境中的軟件開發工具在程序開發期間響應于顯示與所述至少ー個所推斷的符號相關聯的信息的選項的用戶選擇而顯示與所述至少ー個所推斷的符號相關聯的開發者幫助信息。
6.ー種方法,包括 創建表示源代碼的實符號的數據結構,所述數據結構由后臺編譯器在交互式程序開發期間生成,其中在軟件開發計算機上執行的模塊將至少ー個所推斷的符號添加到所述數據結構,其中所述至少ー個所推斷的符號基于輸入到源代碼編輯器中的源代碼,其中所述至少ー個所推斷的符號是基于未定義的符號在所述源代碼中的使用從所述源代碼中推斷的。
7.如權利要求6所述的方法,其特征在于,所述數據結構是句法樹、語義樹或符號表。
8.如權利要求6所述的方法,其特征在于,還包括 響應于編程環境中的選項的激活,在所述編程環境中的軟件開發工具中顯示與所述至少ー個所推斷的符號相關聯的信息,其中所述編程環境包括測試驅動的開發環境或者動態編程開發環境。
9.如權利要求6所述的方法,其特征在干, 編譯器生成的代碼被添加到定義所述未定義的符號的源代碼中。
10.如權利要求6所述的方法,其特征在于,還包括 響應于從用戶接收到將所述至少ー個所推斷的符號轉換成實符號的指示,將所述至少ー個所推斷的符號轉換成實符號。
11.ー種包括當執行時使至少ー個處理器執行下列操作的計算機可執行指令的計算機可讀存儲介質 創建表示源代碼的數據結構,所述數據結構由后臺編譯器生成,其中至少ー個所推斷的符號基于輸入到源代碼編輯器中的源代碼被添加到所述數據結構,其中所述至少ー個所推斷的符號是在沒有所述符號的在先定義的情況下基于符號的使用從所述源代碼中推斷的。
12.如權利要求11所述的計算機可讀存儲介質,其特征在干,進ー步包括當執行時使所述至少一個處理器執行下列操作的計算機可執行指令響應于從用戶接收到將所述至少ー個所推斷的符號轉換成實符號的指示,將所述至少ー個所推斷的符號轉換成實符號。
13.如權利要求11所述的計算機可讀存儲介質,其特征在干,進ー步包括當執行時使所述至少一個處理器執行下列操作的計算機可執行指令 基于所述至少ー個所推斷的符號將定義所述至少ー個所推斷的符號的、編譯器生成的代碼自動添加到所述源代碼。
14.如權利要求11所述的計算機可讀存儲介質,其特征在干,進ー步包括當執行時使所述至少一個處理器執行下列操作的計算機可執行指令 響應于編程環境中的選項的激活,在軟件開發工具中顯示與所述至少ー個所推斷的符號相關聯的信息。
15.如權利要求11所述的計算機可讀存儲介質,其特征在干,進ー步包括當執行時使所述至少一個處理器執行下列操作的計算機可執行指令 創建包括語義或句法樹的數據結構,所述語義或句法樹包括至少ー個所推斷的節點;或者創建包括符號表的數據結構,所述符號表包括至少ー個所推斷的符號。
全文摘要
在編寫代碼時,基于未定義的符號的使用創建包括所推斷的符號的數據結構。隨著用戶繼續編寫代碼,可以基于學習模型更新代碼模型以表示經更新的信息。包括所推斷的符號的數據結構可以被軟件開發工具用于為還未創建或還未綁定的符號提供開發者幫助。可以視覺上區分所推斷的符號,從而使所推斷的符號信息的外觀不同于實際符號信息。基于所推斷的符號的信息的外觀可以通過激活編程環境中的特定模式而包括在工具內。將所推斷的符號轉換成實符號可以觸發后臺編譯器進行的附加源代碼的自動編譯器生成。所推斷的符號可以通過激活使所推斷的符號成為實符號的選項被轉換成實際符號。
文檔編號G06F9/30GK102696012SQ201080060704
公開日2012年9月26日 申請日期2010年12月31日 優先權日2010年1月6日
發明者K·皮爾希-比森, 劉凱玲 申請人:微軟公司