一種將源代碼存入圖數(shù)據(jù)庫的方法
【專利摘要】本發(fā)明公開了一種將源代碼存入圖數(shù)據(jù)庫的方法。該方法將源代碼中的聲明、語句和表達(dá)式根據(jù)語法樹上的節(jié)點生成相應(yīng)的節(jié)點,并根據(jù)語法樹上的節(jié)點關(guān)系生成節(jié)點之間的關(guān)系,然后將節(jié)點和節(jié)點之間的關(guān)系存入圖數(shù)據(jù)庫中。相比于傳統(tǒng)文本格式存儲的方法,本發(fā)明的方法提取了豐富的代碼結(jié)構(gòu)信息存入了數(shù)據(jù)庫,利于后續(xù)使用。相比于利用關(guān)系數(shù)據(jù)庫存儲代碼,本發(fā)明的方法省去了表與表之間復(fù)雜的依賴關(guān)系,因此更加直觀易懂,便于需求者的理解和操作。
【專利說明】一種將源代碼存入圖數(shù)據(jù)庫的方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及軟件工程領(lǐng)域中的程序分析以及數(shù)據(jù)庫的操作。
【背景技術(shù)】
[0002] 近年來,隨著互聯(lián)網(wǎng)的普及,網(wǎng)絡(luò)中的各種數(shù)據(jù)呈現(xiàn)出爆炸性的增長,這其中也包 括了在互聯(lián)網(wǎng)中共享的開源代碼。Sourceforge,Google code等開源代碼庫給了人們大量 可供參考的源代碼。如何從海量的代碼中找到自己需要的內(nèi)容,對代碼庫中的代碼進行分 析,越來越成為一種重要的需求。然而,目前大部分開源代碼庫只支持關(guān)鍵字檢索,而檢索 的結(jié)果常常需要進一步進行篩選以確認(rèn)是否是自己想要的的代碼,這樣的代碼查詢顯然是 低效而繁瑣的。
[0003] 代碼并不僅僅是簡單的文本,代碼是有結(jié)構(gòu)的,每種代碼語言都有各自的語法規(guī) 貝U,而這些規(guī)則正體現(xiàn)了代碼中各個元素之間的關(guān)系。如果能夠充分利用這些結(jié)構(gòu)信息,將 大大提高代碼查詢的效率,而最直接的想法就是構(gòu)造一個新型的代碼庫來存放這些信息。
[0004] 所有這些結(jié)構(gòu)信息都能夠使用實體以及實體之間的關(guān)系來表示,目前描述關(guān)系的 數(shù)據(jù)庫主要是關(guān)系型數(shù)據(jù)庫。然而,代碼中元素種類眾多,元素之間關(guān)系復(fù)雜,這意味著想 要完整記錄代碼結(jié)構(gòu)信息需要數(shù)十個表,加上表與表之間的依賴關(guān)系(外鍵等),加大了對 信息進行理解和操作的難度。此外,關(guān)系型數(shù)據(jù)庫使用的二維表結(jié)構(gòu)在處理高并發(fā)、海量的 數(shù)據(jù)讀寫方面效率低下,擴展性差。因此,關(guān)系型數(shù)據(jù)庫不能很好地滿足用戶的需求。
[0005] NOSQL數(shù)據(jù)庫,也即非關(guān)系數(shù)據(jù)庫,是近年來飛速發(fā)展的一類數(shù)據(jù)庫。圖數(shù)據(jù)是非 關(guān)系數(shù)據(jù)庫的一種,擅于處理高度關(guān)聯(lián)的數(shù)據(jù),Ne〇4j是目前最流行的圖數(shù)據(jù)庫。Ne〇4j使 用的基本數(shù)據(jù)結(jié)構(gòu)是圖,主要涉及兩類對象:節(jié)點和關(guān)系。其中,節(jié)點表示實體,每個節(jié)點可 以擁有若干個屬性來刻畫實體信息,例如:(姓名:張三)表示節(jié)點有一個屬性叫"姓名",而 屬性的值為"張三";關(guān)系對應(yīng)于圖中的邊,可使用三元組〈起始節(jié)點,關(guān)系類型,終止節(jié)點〉 來表征關(guān)系。每個關(guān)系都必須有唯一的類型,起始、終止節(jié)點表明關(guān)系的方向,同時關(guān)系也 可以有自己的屬性。Ne〇4j還支持給節(jié)點添加標(biāo)簽來將節(jié)點劃分為不同的類別。Ne〇4j通 過遍歷來訪問圖中的節(jié)點和關(guān)系,圖遍歷執(zhí)行的速度是常數(shù)(每秒遍歷百萬個關(guān)系),跟圖 的規(guī)模大小無關(guān),極大地提高了性能。Neo4j擁有自己的查詢語言Cypher,它是一種聲明式 語言,易于理解和學(xué)習(xí)。
[0006] JDT實際上就是Eclipse中提供的用于支持Java開發(fā)的一個插件,它提供了用戶 在Eclipse平臺下進行Java語言開發(fā)的IDE。利用JDT,軟件開發(fā)人員就可以在Eclipse 工具中自由的編輯,編譯,執(zhí)行和調(diào)試Java程序。此外,JDT還提供了訪問源代碼編譯過程 中的中間結(jié)構(gòu)的相關(guān)API,這個中間結(jié)構(gòu)就是軟件開發(fā)人員所熟悉的抽象語法樹(AST)。對 AST的利用可以使得對Java語言的源代碼分析變得更加方便。軟件開發(fā)人員在進行代碼分 析工作時就不再需要從Java源代碼開始,先要通過詞法分析、語法分析等獲取代碼結(jié)構(gòu)信 息,而是可以直接利用JDT的相關(guān)API獲取相應(yīng)代碼的AST,并對AST中的信息進行分析工 作。JDT所提供的AST除了具有數(shù)據(jù)結(jié)構(gòu)嚴(yán)整,訪問便捷,內(nèi)容詳細(xì)這些傳統(tǒng)的抽象語法樹 的特性之外,還提供了對綁定等語義信息的支持,為面向Java語言的源代碼的分析研究 工作提供了很大的便利。
【發(fā)明內(nèi)容】
[0007] 本發(fā)明所要解決的問題是將源代碼存入圖數(shù)據(jù)庫。
[0008] 為解決上述問題,本發(fā)明采用的方案如下:
[0009] -種將源代碼存入圖數(shù)據(jù)庫的方法,包括如下步驟:
[0010] Sl :通過對源代碼的靜態(tài)語義分析,將源代碼中的聲明、語句和表達(dá)式生成節(jié)點, 根據(jù)聲明、語句和表達(dá)式之間的包含關(guān)系構(gòu)建節(jié)點之間的關(guān)系;
[0011] S2 :將生成的節(jié)點和節(jié)點之間的關(guān)系存入圖數(shù)據(jù)庫。
[0012] 如權(quán)利要求1所述的將源代碼存入圖數(shù)據(jù)庫的方法,其特征在于,所述將源代碼 中的聲明、語句和表達(dá)式生成的節(jié)點根據(jù)源代碼語法樹上的節(jié)點定義。
[0013] 進一步,所述步驟Sl還包括將源代碼文件生成節(jié)點,并根據(jù)源代碼文件和源代碼 之間的關(guān)系構(gòu)建節(jié)點之間的關(guān)系。
[0014] 進一步,所述步驟Sl還包括將多個源代碼文件所組成的包生成節(jié)點,并根據(jù)包與 源代碼文件之間的關(guān)系構(gòu)建節(jié)點之間的關(guān)系。
[0015] 進一步,所述源代碼為java代碼。
[0016] 進一步,所述的圖數(shù)據(jù)庫為Ne〇4j數(shù)據(jù)庫。
[0017] 本發(fā)明的技術(shù)效果如下:
[0018] 1、相比于傳統(tǒng)文本格式存儲的方法,本發(fā)明的方法提取了豐富的代碼結(jié)構(gòu)信息存 入了數(shù)據(jù)庫,利于后續(xù)使用。
[0019] 2、相比于利用關(guān)系數(shù)據(jù)庫存儲代碼,本發(fā)明的方法省去了表與表之間復(fù)雜的依賴 關(guān)系,因此更加直觀易懂,便于需求者的理解和操作。
【具體實施方式】
[0020] 下面對本發(fā)明做進一步詳細(xì)說明。
[0021] 本發(fā)明的將源代碼存入圖數(shù)據(jù)庫的方法是主要通過源代碼轉(zhuǎn)化成圖結(jié)構(gòu)實現(xiàn),即 步驟Sl :通過對源代碼的靜態(tài)語義分析,將源代碼中的聲明、語句和表達(dá)式生成節(jié)點,根據(jù) 聲明、語句和表達(dá)式之間的包含關(guān)系構(gòu)建節(jié)點之間的關(guān)系。也就是將源代碼中的聲明、語句 和表達(dá)式作為圖結(jié)構(gòu)上的節(jié)點,并將聲明、語句和表達(dá)式之間的包含關(guān)系構(gòu)建節(jié)點之間的 關(guān)系作為節(jié)點之間的關(guān)系作為圖結(jié)構(gòu)上的節(jié)點之間的邊。
[0022] 將源代碼中的聲明、語句和表達(dá)式生成節(jié)點的方法有很多。其中,最為經(jīng)典和 成熟的是利用抽象語法樹。下述實施方式中,源代碼以java源代碼為示例,圖數(shù)據(jù)庫 以Ne〇4j數(shù)據(jù)庫為示例。下述表1是以java語法樹為藍(lán)本,針對java代碼建立的各 種類型的節(jié)點。下述表2是表1中各類型節(jié)點之間的關(guān)系定義。表1中列出了 80種 節(jié)點類型,其中76種類型的節(jié)點都能夠在java語法樹上找到對應(yīng)(括號中)。例如: AQ) (AnonymousClassDeclaration))表不節(jié)點類型為AQ),其對應(yīng)于java語法樹中的 AnonymousClassDeclaration。NT表示非終結(jié),即可以有以該類節(jié)點為起始節(jié)點的關(guān)系;T 表示終結(jié),即沒有以該類節(jié)點為起始節(jié)點的關(guān)系。屬性欄列出了每類節(jié)點擁有的屬性,例 如:T_KEY: String表示該類節(jié)點擁有屬性T_KEY且屬性值的類型是String。有的屬性的類 型為DBR,這表示該屬性的類型是在運行時決定的。對于像A(Annotation)這種類型的節(jié) 點事實上是抽象節(jié)點,即它不會出現(xiàn)在圖中,它有多個子節(jié)點MA,NA, SMA,子節(jié)點除了擁有 自己特有的屬性外還繼承了父節(jié)點所有屬性。" \ "表示當(dāng)前類型節(jié)點沒有任何屬性。由于 java文件是語法樹解析的單位,因此添加了 P (Project)類型節(jié)點來組織同一項目下的所 有java文件。表2中每一個表項〈起始節(jié)點,類型,終止節(jié)點〉對應(yīng)于一個關(guān)系定義。" I " 表示"或",例如:〈C,TYPES,ATD |ED| TD>表示這個關(guān)系的終止節(jié)點可以有3種,ATD、ED或 TD。對于關(guān)系〈起始節(jié)點,類型,終止節(jié)點〉,數(shù)目表示從起始節(jié)點出發(fā),該類型的關(guān)系可能 的數(shù)目。〇|1、1,*,1+,2+分別表示0個或1個、1個、0個或多個、1個或1個以上、2個或2 個以上。
[0023]
【權(quán)利要求】
1. 一種將源代碼存入圖數(shù)據(jù)庫的方法,其特征在于,包括如下步驟: 51 :通過對源代碼的靜態(tài)語義分析,將源代碼中的聲明、語句和表達(dá)式生成節(jié)點,根據(jù) 聲明、語句和表達(dá)式之間的包含關(guān)系構(gòu)建節(jié)點之間的關(guān)系; 52 :將生成的節(jié)點和節(jié)點之間的關(guān)系存入圖數(shù)據(jù)庫。
2. 如權(quán)利要求1所述的將源代碼存入圖數(shù)據(jù)庫的方法,其特征在于,所述將源代碼中 的聲明、語句和表達(dá)式生成的節(jié)點根據(jù)源代碼語法樹上的節(jié)點定義。
3. 如權(quán)利要求1或2所述的將源代碼存入圖數(shù)據(jù)庫的方法,其特征在于,所述步驟S1 還包括將源代碼文件生成節(jié)點,并根據(jù)源代碼文件和源代碼之間的關(guān)系構(gòu)建節(jié)點之間的關(guān) 系。
4. 如權(quán)利要求3所述的將源代碼存入圖數(shù)據(jù)庫的方法,其特征在于,所述步驟S1還包 括將多個源代碼文件所組成的包生成節(jié)點,并根據(jù)包與源代碼文件之間的關(guān)系構(gòu)建節(jié)點之 間的關(guān)系。
5. 如權(quán)利要求1所述的將源代碼存入圖數(shù)據(jù)庫的方法,其特征在于,所述源代碼為 java
6. 如權(quán)利要求1所述的將源代碼存入圖數(shù)據(jù)庫的方法,其特征在于,所述的圖數(shù)據(jù)庫 為Neo4j數(shù)據(jù)庫。
【文檔編號】G06F17/30GK104391964SQ201410720349
【公開日】2015年3月4日 申請日期:2014年12月1日 優(yōu)先權(quán)日:2014年12月1日
【發(fā)明者】張?zhí)? 朱曉倩, 李宣東 申請人:南京大學(xué)