用于對具有缺少源位置的代碼段的源代碼建模的方法
【專利說明】
【背景技術(shù)】
[0001]軟件開發(fā)者使用若干不同的編程語言來編寫源代碼。每個編程語言具有不同的語法和語義。需要編碼工具(該編碼工具包括代碼瀏覽器、集成的開發(fā)環(huán)境(IDE)和歷史分析工具)能夠理解源代碼語言,以便這些工具能夠用于軟件開發(fā)者。多數(shù)工具擅長表示一種或多種語言,但是在支持其他語言方面具有困難。為了跨所有編程語言具有適當(dāng)?shù)墓ぞ咧С郑瑧?yīng)當(dāng)存在能夠由所有工具來使用的單個代碼模型。針對所有語言來表示源代碼的語義和語法需要復(fù)雜的數(shù)據(jù)模型和理解每種語言的細微差別的服務(wù)。還需要數(shù)據(jù)模型和服務(wù)能夠?qū)υ鼐幩饕约帮@示來自任何編程語言和跨語言的元素之間的關(guān)系。
【發(fā)明內(nèi)容】
[0002]本說明書描述了總體上與數(shù)據(jù)建模相關(guān)的技術(shù),以及具體地與用于對缺少源位置的代碼段建模的方法和系統(tǒng)相關(guān)的技術(shù)。
[0003]一般而言,本說明書中所描述的主題的一方面可以在用于對源代碼建模的系統(tǒng)和方法中來實施。示例性系統(tǒng)包括一個或多個處理設(shè)備以及存儲指令的一個或多個存儲設(shè)備,該指令在由一個或多個處理設(shè)備執(zhí)行時引起一個或多個處理設(shè)備:接收包括不具有源位置的代碼段的源代碼;對所接收的源代碼編索引;根據(jù)經(jīng)編索引的源代碼創(chuàng)建數(shù)據(jù)模型,該數(shù)據(jù)模型包括表示代碼元素的多個節(jié)點以及用于元素之間的關(guān)系的多個邊;確定要與每個節(jié)點關(guān)聯(lián)的源位置;響應(yīng)于將代碼段中的一個代碼段識別為隱藏代碼段或者隱式代碼段,創(chuàng)建用于代碼段的虛構(gòu)表示;以及將所創(chuàng)建的代碼段指派為與代碼段的節(jié)點關(guān)聯(lián)的源位置。示例性方法包括:接收包括不具有源位置的代碼段的源代碼;對所接收的源代碼編索引;根據(jù)經(jīng)編索引的源代碼創(chuàng)建數(shù)據(jù)模型,數(shù)據(jù)模型包括表示代碼元素的多個節(jié)點以及用于元素之間的關(guān)系的多個邊;確定要與每個節(jié)點關(guān)聯(lián)的源位置;響應(yīng)于將代碼段中的一個代碼段識別為隱藏代碼段或者隱式代碼段,創(chuàng)建用于代碼段的虛構(gòu)表示;以及將所創(chuàng)建的代碼段指派為與代碼段的節(jié)點關(guān)聯(lián)的源位置。用于使用表示不具有源位置的代碼段的數(shù)據(jù)模型的第二示例性方法包括:請求包括不具有源位置的代碼段的代碼的數(shù)據(jù)模型;接收包括不具有源位置的代碼段的虛構(gòu)表示的所請求的數(shù)據(jù)模型;以及可選地向最終用戶顯示所述代碼段的所述虛構(gòu)表示。
[0004]這些以及其他實施例可以可選地包括以下特征中的一個或多個特征:可以特別地注釋虛構(gòu)節(jié)點以將所述節(jié)點同所述數(shù)據(jù)模型中的其他節(jié)點區(qū)分開來;可以向用戶提供數(shù)據(jù)模型;可以經(jīng)由應(yīng)用編程界面(API)來提供數(shù)據(jù)模型;可以經(jīng)由用戶界面向用戶提供數(shù)據(jù)模型;可以經(jīng)由命令行代碼來向用戶提供數(shù)據(jù)模型;虛構(gòu)表示的內(nèi)容可以是有效的代碼語法;虛構(gòu)表示的內(nèi)容對代碼行為建模,但是不表示有效的代碼語法;可以存在有在使用隱藏代碼段或者隱式代碼段的源代碼的節(jié)點與表示所創(chuàng)建的虛構(gòu)的節(jié)點之間的邊;數(shù)據(jù)模型可以包含關(guān)于虛構(gòu)表示的元數(shù)據(jù);元數(shù)據(jù)可以用來示出或者隱藏來自最終用戶的虛構(gòu)表示;元數(shù)據(jù)可以用于顯示代碼段是虛構(gòu)這一信息;元數(shù)據(jù)可以用于顯示代碼段包含虛構(gòu)這一信息;以及數(shù)據(jù)模型可以使用應(yīng)用編程界面來請求。
[0005]在僅以說明的方式給出的附圖以及下面的說明書中給出本發(fā)明的一個或多個實施例的細節(jié)。本發(fā)明的其他特征、方面和優(yōu)點根據(jù)說明書、附圖和權(quán)利要求將變得很清楚。各個附圖中相似的附圖標(biāo)記指示相似的元素。
【附圖說明】
[0006]圖1a是圖示示例性代碼段的框圖。
[0007]圖1b是圖示示例性代碼段的框圖。
[0008]圖2是圖示用于圖1a和圖1b中定義的代碼段的數(shù)據(jù)模型的框圖。
[0009]圖3是圖示對兩個代碼段編索引并且繪制兩個代碼段的示例性過程的框圖。
[0010]圖4是圖示用于圖3中定義的代碼段的數(shù)據(jù)模型的框圖。
[0011]圖5是圖示包括用于隱藏代碼和/或隱式代碼的代碼虛構(gòu)的、用于圖3中所定義的代碼段的示例性模型的框圖。
[0012]圖6是圖示對宏編索引并且繪制宏的示例性過程的框圖。
[0013]圖7是圖示用于圖6中定義的宏的數(shù)據(jù)模型的框圖。
[0014]圖8是圖示包括用于隱藏代碼和/或隱式代碼的代碼虛構(gòu)的、用于圖6中定義的宏的示例性模型的框圖。
[0015]圖9是用于創(chuàng)建表示隱藏代碼和/或隱式代碼的代碼虛構(gòu)的示例性方法的流程圖。
[0016]圖10是圖示示例性計算設(shè)備的框圖。
[0017]圖11是用于使用表示不具有源位置的代碼段的數(shù)據(jù)模型的示例性方法的流程圖。
【具體實施方式】
[0018]示例性數(shù)據(jù)模型和服務(wù)提供源代碼和編譯器元數(shù)據(jù)的語言中性規(guī)范化表示。該模型將源代碼表示為數(shù)據(jù)圖。數(shù)據(jù)圖是存儲數(shù)據(jù)并且使用有限點集、調(diào)用節(jié)點、線、調(diào)用邊來示出數(shù)據(jù)之間的關(guān)系的數(shù)據(jù)結(jié)構(gòu)。如圖2所描繪的,通過使用邊彼此連接節(jié)點來表示圖內(nèi)的關(guān)系。
[0019]為了根據(jù)源代碼來創(chuàng)建數(shù)據(jù)圖模型,必須將源代碼翻譯成形成圖的節(jié)點和邊的集合。一種產(chǎn)生高的精度水平的便利方法是針對源代碼重用現(xiàn)有的編譯器。編譯器可以設(shè)置有編索引器,該編索引器從編譯器提取數(shù)據(jù)以構(gòu)造用于數(shù)據(jù)圖模型的節(jié)點和邊。
[0020]圖1a和Ib示出可以一起用于指出詞語“hello world”的源代碼文件的兩個示例片段。圖1a中的文件“std1.h”(105)包含行2上的函數(shù)“printf”的定義,其將串“format”的指針作為參數(shù)并且向標(biāo)準(zhǔn)輸出寫入由“format”指出的串。在圖1b中,文件“hell0.c”(ll)包括行2上的“std1.h”文件并且在稱為“main”(行3)的函數(shù)中使用來自行4上的“std1.h”的“printf”的定義以向標(biāo)準(zhǔn)輸出寫入串“hello world”。數(shù)據(jù)模型可以將源代碼片段表示為如下,該圖類似于圖2中所描繪的圖。圖2示出兩個文件“hello, c"(232)和“std1.h” (234)作為圖中的節(jié)點,其具有用兩個節(jié)點之間的雙向邊表示的“包括/被包括”關(guān)系。表示文件“hello, c”(232)的節(jié)點通過描繪兩個節(jié)點之間的“聲明/被聲明”關(guān)系的雙向邊連接到表示函數(shù)“main”(224)的節(jié)點。表示文件“std1.h”(234)的節(jié)點通過“聲明/被聲明”關(guān)系邊連接到用于“printf” (222)的節(jié)點。由于“printf”由“main”在源代碼中調(diào)用,因此表示“main” (224)的節(jié)點通過“調(diào)用/被調(diào)用”關(guān)系鏡像邊連接到表示“printf”(222)的節(jié)點。在圖中,用于“main”(224)的節(jié)點和用于“printf”(222)的節(jié)點二者與它們所返回的內(nèi)置類型具有關(guān)系?!癿ain”(224)具有空的返回,并且“printf”返回“int” (206) ο
[0021]如以上所討論的,創(chuàng)建節(jié)點以表示源代碼的分段。節(jié)點可以表示若干不同類型的元素,諸如:內(nèi)置類型;參數(shù)化的類型;復(fù)合類型;指針類型;符號聲明;用戶定義的類型;引用;方法,方法調(diào)用,字段,指派,評論,內(nèi)聯(lián)文檔和文件。每個節(jié)點可以包含某些信息,這些信息包括:用于節(jié)點的全局唯一標(biāo)識符;元素的種類;顯示名稱;元素在源代碼中的位置;元素的修飾符;維數(shù);以及源代碼中元素周圍存在的代碼片段。節(jié)點可以是但不限于若干種類中的一種,諸如:未決,評論,丟失,名稱空間,分組,模塊,類,結(jié)構(gòu),接口,枚舉,枚舉常量,函數(shù),方法,構(gòu)造函數(shù),域,局域,參數(shù),變量,屬性,布爾,字符,字符串,正則表達式,整數(shù),浮點數(shù),固定數(shù)目,有理數(shù),復(fù)數(shù),大數(shù),對象,實例,文件,目錄,符號鏈接,診斷,指針,引用,別名,空,空的,單元,變化類型,參數(shù)類型,變量類型,專門化類型,符號,名稱,值,使用,數(shù)組,設(shè)置,映射,列表,元組,聯(lián)盟。
[0022]邊可以表示數(shù)據(jù)模型中的元素之間的關(guān)系。這些邊可以是雙向的,這表示從第一節(jié)點到第二節(jié)點的每個邊具有從第二節(jié)點到第一節(jié)點的鏡像邊??梢源嬖谟腥舾刹煌N類的邊對,包括:擴展/被擴展;實現(xiàn)/被實現(xiàn);跨接/被跨接;繼承/被繼承;聲明/被聲明;捕獲/被捕獲;基礎(chǔ)類型/包括類型;具有類型/屬于類型;返回類型/被返回;調(diào)用/被調(diào)用;例示/被例示;引用/被引用;具有屬性/屬于屬性;具有聲明/屬于聲明;具有定義/屬于定義;具有