?

一種基于LDA和靜態分析的代碼功能識別方法

2013-07-19 08:14華哲邦宋懷達趙俊峰
計算機工程與應用 2013年15期
關鍵詞:開源代碼文檔

金 靖,李 萌,華哲邦,宋懷達,趙俊峰,謝 冰

1.北京大學 信息科學技術學院,北京 100871

2.北京大學 高可信軟件技術教育部重點實驗室,北京 100871

一種基于LDA和靜態分析的代碼功能識別方法

金 靖1,2,李 萌1,2,華哲邦1,2,宋懷達1,2,趙俊峰1,2,謝 冰1,2

1.北京大學 信息科學技術學院,北京 100871

2.北京大學 高可信軟件技術教育部重點實驗室,北京 100871

1 引言

軟件復用是在軟件開發中避免重復勞動的解決方案[1],而代碼復用是軟件復用中最主要的組成部分。隨著代碼復用技術不斷成熟和Internet上開源項目不斷豐富,軟件開發人員的開發行為也逐漸發生了變化。通用搜索引擎技術的發展以及各種軟件資源庫社區(如SourceForge(http:// www.sourceforge.net/)、Google Code(http://www.google. com/codesearch/)、Τrustie軟件資源庫(http://tsr.trustienet/)等)的壯大使得軟件開發人員可以迅速地從Internet上找到滿足特定功能的開源項目。如今,軟件開發人員在編程活動中越來越多地依賴于開源軟件項目提供的功能。

理想情況下,軟件開發人員可以將開源項目的文檔和代碼結合起來學習其功能點。然而,從Internet上可以找到大量開源項目的代碼,卻很少能夠找到項目的詳細文檔。即使較好的開源項目能夠提供用戶手冊,也不足以幫助使用者全面地理解項目的功能點。因此,需要研究一種以代碼為輸入、能夠自動識別功能點的方法來幫助使用者了解開源項目具備的功能點。

傳統的代碼分析技術(如控制流分析、數據流分析等)可以幫助使用者細粒度地理解項目代碼的工作機制。這些工作的受益對象一般是與項目開發、測試、維護相關的人員,這些人員往往已經具備了項目的相關知識。然而,細粒度的底層代碼分析并不是準備對開源項目進行復用的軟件開發人員首要關心的,他們在選擇是否復用一個項目時更關注的是項目具備哪些功能點這種較為宏觀層面的問題。

在軟件復用活動中,由于開源項目文檔的不全面以及代碼結構的復雜性,軟件開發人員往往只能片面地了解開源項目的某些功能點,使得復用效率不高。只有當軟件開發人員更全面地了解項目的功能點后,他們才能更好地進行代碼復用活動。

針對上述問題,本文提出了一種基于LDA(Latent Dirichlet Allocation)和靜態分析的代碼功能識別方法。該方法以代碼為輸入,利用LDA能夠自動挖掘文檔topic這一特性,輔以靜態分析技術,自動地從代碼中識別功能點。

具體的,本文方法包含三個步驟:

(1)代碼預處理。用靜態分析技術和切詞技術對代碼進行轉化,選擇合適的單詞放入詞袋,作為LDA的輸入。

(2)用傳統LDA方法自動地挖掘項目中潛在的topic。挖掘出來的topic可能反映了項目的功能點,亦可能并不具備實際意義。因此,需要進一步分析排除沒有意義的topic。

(3)用靜態分析技術對topic進行進一步分析。分析同一topic下相關聯的代碼之間的關系,計算topic的內聚度,進而排除沒有意義的topic,識別出項目的功能點。

2 相關研究工作

關于程序理解的研究工作有很多,基于語言學的程序理解方法逐漸受到研究人員的重視。研究人員常用語言學統計的方法挖掘代碼中包含的topic,進而對軟件項目進行聚類或分類。

Kuhn等人[2]用基于LSA(Latent Semantic Analysis)的方法挖掘代碼中包含的topic,對軟件制品進行聚類。Kawaguchi等人[3]也是用基于LSA的方法對開源軟件資源庫中的軟件制品進行分類。然而,近些年LDA逐漸成為一種更為流行的挖掘文檔topic的方法。Phan X[4]等人在分析比較了LSA、PLSA、LDA的基礎上證明了LDA在挖掘文檔潛在語義方面具有更大的優勢。

LDA一般用于處理自然語言文檔。有部分研究著眼于利用LDA技術從自然語言文檔中構造本體。Elias Zavitsanos等人[5-6]利用LDA技術從文本語料庫中構造層級本體(一個topic對應于一個本體,每個topic中概率最大的詞就作為對應該topic的本體概念),他們以在生物醫藥學領域為研究對象,構造出的本體和專家給出的本體結構十分相似。他們的實驗結果說明LDA的確是一種自動發現topic的有效方法。

也有研究人員將LDA方法應用到挖掘代碼中潛在topic的研究中:

Pierre F.Baldi等人[7]用LDA方法驗證AOP(Aspect Oriented Programming)假設的有效性。他們以4 632個不同領域項目為實驗數據,發現這些項目中出現頻率較高topic,然后人工分析這些topic的含義,找出不同項目中的共性topic。他們的實驗分析結果和軟件開發人員的經驗一致:不同領域的共性topic主要為軟件開發實現中常用的Java語言相關的基本概念和方法,以及設計模式。

Girish Maskeri等人[8]用LDA技術挖掘代碼中的topic,較為詳細地介紹了如何結合代碼結構的信息來進行LDA輸入的預處理。本文與之工作的區別有三:(1)在代碼中單詞選取到詞袋的步驟中過濾更加細致。(2)他們工作中關于LDA參數的設定由人工指定,本文根據他人的研究成果進行了改進。(3)最重要的一點,他們的工作停留在挖掘出topic為止,而有些topic是無意義的,本文對topic進行了進一步內聚度分析,引伸到功能點。

此外,Τhomas L.Griffiths等人[9]給出了關于一種判定語料庫中合適topic數量的方法。Gregor Heinrich[10]詳細地討論了LDA方法中各個參數估計的方法。本文的合適topic數量選取及參數估計即是參考他們的研究成果。

以上所有研究工作,均未將LDA挖掘出的topic應用到代碼功能識別中,而本文提出了一種以topic為依據,識別功能點的方法。

在介紹本文方法之前,該章末尾先描述傳統的LDA模型:

在LDA模型中,輸入是一組文檔,每個文檔是單詞的集合。每個文檔視為是由topic概率組成的,而每個topic是由單詞概率組成的。設D為文檔的總數量,W為詞匯表中單詞的總數量,T為topic的總數量,有如下兩個概率矩陣:

LDA模型假設每個topict是作用于單詞w上的多項分布,而每個文檔d是作用于topict上的多項式分布,將θ*d和?*t設為帶參數α和β的先驗Dirichlet分布:

有不同的算法(如變分-EM算法,還有常用的Gibbs抽樣法)對α和β進行迭代估計,使得最終收斂生成的結果模型中,所有文檔根據單詞生成的概率最大。

可以從LDA最終結果中得到文檔-topic概率矩陣和topic-單詞概率矩陣。通過矩陣,一方面,可以得知一個topic下各個單詞的概率;另一方面,可以得知一個文檔中各個topic的概率。反過來,對于每一個topic,也可以得到各個文檔屬于該topic的概率。

3 一種基于LDA和靜態分析的代碼功能識別方法

軟件開發人員在開始了解一個項目時最關注于項目能提供哪些功能點。利用LDA技術分析代碼所挖掘出的topic會有助于找到代碼所實現的功能點。而用LDA方法挖掘出的topic,可能反映了項目的功能點,亦可能并不具備實際意義,靜態分析技術可以幫助排除無意義的topic。因此,本文對傳統LDA方法進行了擴展,提出了一種基于LDA和靜態分析的代碼功能識別方法。

根據經驗,很多情況下包不是基于功能點組織的,而是橫向組織的(例如,有可能包是依據用戶交互層,業務邏輯層,數據存儲層的體系架構進行組織的),所以包的組織結構并不能很好地反映項目功能點。

LDA的結果也并不能保證每個topic能夠對應功能點。LDA是對文本進行分析的,在本文方法中,LDA的輸入是對代碼的切詞與過濾后所構成的詞袋,有可能一個topic下的各類之間關系較為緊密,也有可能關系較為松散(例如,數據庫層中的類都劃分到一起了,因為都是“***DAO”的形式)。在本文工作中,假設有緊密關系的類所組成的topic能夠對應一個功能點,關系不緊密的類所組成的topic則被排除。內聚度可以用來衡量一個topic下的各個類關系程度,故內聚度高的topic很可能對應一個功能點。

本文提出的代碼功能識別方法分為三個步驟:

(1)代碼預處理。用靜態分析技術和切詞技術對代碼進行轉化,對候選單詞過濾后形成詞袋作為LDA的輸入。

(2)利用傳統的LDA技術挖掘代碼中潛在的topic。

(3)用靜態分析技術對LDA的輸出topic進行進一步內聚度分析,判斷topic是否能夠對應功能點。

整個方法的工作流程如圖1所示。

圖1 基于LDA和靜態分析的代碼功能識別方法流程圖

3.1 代碼預處理

在代碼預處理步驟中,用靜態分析技術和切詞技術對代碼進行轉化,對候選單詞過濾后形成詞袋作為LDA的輸入。

如何選取代碼中的單詞到詞袋是該步驟的關鍵。如果僅選取類名和接口名,獲取的單詞信息太少,生成的topic將會過于一般化,不具備可用性;而如果將代碼中每個單詞都加入到詞袋,將會造成LDA計算上巨大的開銷,并且可能包含很多噪音,產生的結果也不一定好。因此,本文工作最終選擇了代碼中的候選詞包括:類名,接口名,類或接口中域的名字,域所屬的類型,類或接口中方法的名字,方法的返回類型,方法的參數名,方法參數所屬的類型。本文工作選詞方法的合理性,在Pierre F.Baldi等人的實驗[7]中也得到了驗證。

代碼元素的命名可能是好幾個單詞的組合形式(比如“StringBuffer”是有“String”和“Buffer”組成的),因此,需要考慮對代碼元素進行切詞處理。根據開源項目中代碼的常見命名規范,可以按照詞中出現的大寫字母的位置進行切詞,這樣,就能將形如“StringBuffer”的元素切成“String”和“Buffer”兩個單詞。而如果命名中出現幾個連續大寫字母,則說明這個極有可能是某個概念的縮寫,將其切成一個單詞,如“NameDAO”,會被切分為“Name”和“DAO”。

此外,有些單詞組合具有特殊意義。比如,在Τrustie軟件資源庫的可信評級子系統中,“ΤrustWorthiness”總是作為一個單詞組合的形式出現的,在可信評級系統中作為“可信級別”的概念出現。故在本文工作中,將高頻出現的單詞組合也視做一個單詞,放到詞袋中。單詞組合的概率計算公式為:

P(A...B)=Count(A...B)/(Count(A)*…*Count(B)) A...B為一個單詞組合,即在代碼中出現的一個單詞串,單詞A為串頭,以單詞B為串尾。在具體工作中,只考慮了二元單詞組合和三元單詞組合的形式,因為更長的單詞組合比較少,統計意義不大。

對單詞組合按概率排序后(二元和三元分開排),在順序表中以概率值相差最大的兩個單詞組合之間的任意值作為閾值,概率高于該閾值的單詞組合加入到候選詞集,概率低于該閾值的單詞組合被舍棄。

此外,還對候選詞集進行了過濾:

(1)過濾Java語言的關鍵字:所有程序都會用到Java語言的關鍵字,這些單詞反映不出與項目相關的信息。

(2)過濾英語中常見的停用詞:這些單詞也很難反映與項目有關的信息。

(3)過濾JDK中的類名和接口名:希望發現的是領域特定的功能,而不是編程實現中的共性功能,因此,有必要過濾掉JDK中的類名和接口名。

此外,如有需要,還可以過濾一些常用工具包中的類名和接口名。

過濾步驟完成后,需要對剩下的單詞進行詞根化,以免因為單詞的形態對結果產生影響。最終形成的詞袋,就作為LDA的輸入。

3.2 基于LDA的代碼topic挖掘方法

GibbsLDA(http://gibbslda.sourceforge.net/)是一個實現了LDA方法的開源項目,該開源項目使用Gibbs抽樣方法估計參數。本文工作的LDA部分即是在此項目基礎上完成的。在進行LDA迭代算法之前,需要設置一些參數,如α初始值、β初始值、迭代次數和構造的topic數量。有相關研究根據經驗表明,當α初始值設為50/K(K為要構造的topic數量),β初始值s設為0.01時,LDA的結果較好[10]。本文工作α、β初始值也是按經驗值進行設置的。迭代次數設為1 000(根據對十幾個代碼規模差別較大的開源項目的實驗,更多的迭代次數對LDA結果影響不大)。本文工作主要關注于topic數量的設置。Τhomas L.Griffiths等人提出了一種定量的方法判斷如何選取合適的topic數量[9]:對參數topic數量從1到N進行遍歷,對每個情況都進行LDA計算,然后選擇使得所有文檔生成概率值之和最大的結果作為最佳結果輸出。大量實驗表明,topic數量和所有文檔生成概率值之和大致呈圖2的關系。

圖2 topic數量和文檔生成概率值之和趨勢圖

本文按照上述方法,對topic數量從1到200進行遍歷,找出最佳結果。經過對十幾個開源項目的實驗分析,遍歷范圍在200以內足以保證出現圖2中的最大值拐點。

3.3 代碼結構的靜態分析

LDA的結果中包含topic和代碼的關聯矩陣,通過該矩陣,可以推知代碼與一個topic的關聯概率,本文選取了0.1為閾值,關聯概率大于閾值的代碼屬于該topic。在同一個topic下的文檔所對應的各個類之間可能關系緊密,也可能關系松散。因此,本文在LDA之后,用靜態分析技術,細粒度地分析同一topic下各類之間的關系,計算內聚度,排除無意義的topic,進而最終判斷topic是否對應一個功能點。

Eclipse的抽象語法樹解析工具JDΤ(http://www.eclipse. org/jdt/)可以分析Java語言的各個元素。通過對各個元素的分析,最終得到的信息在預處理所包含的信息(類名,接口名,域的名字,域所屬的類型,方法的名字,方法的返回類型,方法的參數名,方法參數所屬的類型)基礎上,深入到方法體當中的局部變量聲明和方法調用語句,這些信息對于發現更全面的類與類之間的關系很有幫助。此外,為了輔助代碼靜態分析中關于import包的信息查詢,本文工作還對項目所引用的Jar包進行了分析,獲得這些Jar包中的類名和接口名。

類與類之間具有一般-特殊、整體-部分、關聯、消息四種關系[11]。在Java代碼中,一般-特殊關系可通過關鍵字extends來實現;整體-部分關系和關聯關系都是通過類中的域來體現的;消息則是通過方法體中的方法調用語句來體現。此外,如果類A實現了接口B,則接口B具備的所有關系都被添加到類A的關系集合中。

根據靜態結構分析的工作,可以得到所有的類與類之間的關系,判定規則如下:

(1)一般-特殊關系:Java語言中的關鍵字“extends”用于類或接口聲明表示一般-特殊關系。

(2)整體-部分關系和關聯關系:一個類與它的域所屬的類之間可以建立關系。從Java代碼實現層面上來看,整體-部分關系和關聯關系并無區別,對這兩種關系的命名均為“hasRelationΤo”。關于域所屬類全名的查找,從同一包目錄下、import語句,以及JDK中查找。

(3)消息關系:如果類A中的一個方法中調用了類B的方法,則類A和類B具有消息關系。一個方法調用語句可能是“方法名”、“類名.方法名”或“對象名.方法名”的形式。對于“對象名.方法名”的形式,需要查找這個對象所屬的類,需要依次從局部變量聲明、方法參數聲明、方法所屬類中的域以及方法所屬類繼承的類中的域中查找。找到對象所屬類之后,類全名的查找同(2)。此外,對于“this”和“super”等關鍵字也進行了相應的處理。本文工作能夠為95%以上的對象找到其所屬的類。

獲取所有關系之后,還需要判斷一個topic是否有意義。直觀來看,如果一個topic是高內聚的,那么這個topic更可能對應一個功能點。因此,采取計算內聚度的方式來判斷一個topic是否有意義。

有很多關于代碼內聚度計算的研究,Edward B.Allen等人便是利用類與類之間的關系來計算內聚度[12]。本文對類與類的關系進行了細化,對上述三種關系實現形式分別賦予權值:

其中,Numin,type表示內部類之間的關系類型為type的關系數,Numout,type表示內部類與外部類之間的關系類型為type的關系數,Wtype表示關系類型為type的權值。

在本文實驗部分,對不同關系類型賦予同樣的權值,故上述公式可以簡化為:內聚度=Numin/(Numin+Numout)。

4 實驗分析

Τrustie軟件資源庫是由北京大學信息學院軟件所自主研發的、開源開放的平臺,主要的用途可以為企業提供軟件資源管理的平臺。本文以北京大學Τrustie軟件資源庫項目為例進行實驗分析說明。

Τrustie軟件資源庫提供對軟件資源的收集、分類、存儲和檢索等功能,對軟件資源的共享、組織和管理提供支持。同時,資源庫為了保證所提供資源的質量,集成了軟件資源的可信證據采集與可信評估的機制,更好地為軟件開發提供資源管理與共享的平臺。Τrustie軟件資源庫具有如下功能特征:

用戶管理、資源發布、資源分類、資源存儲、資源檢索、資源下載、用戶反饋、資源可信評級。Τrustie軟件資源庫代碼一共有122個代碼文檔,有效Java代碼行數(排除空行與注釋)為13 781,屬于中等規模的項目。

采用基于本文的LDA方法挖掘代碼潛在的topic。得到的最佳topic數量為35,表1列出了內聚度前10的topic。

表1 內聚度前10的topic

通過表1可以看出:

(1)大部分功能點能與內聚度較高的topic對應。其中,有3個與資源可信評級對應的topic,充分說明可信評級是Τrustie軟件資源庫的重要功能特征。

(2)前10未包含對應資源發布功能點(排在第18位的topic與之對應)的topic。資源發布功能點沒有被較好地挖掘出來的原因在于,資源發布功能點在很大程度上與資源存儲功能點重合,發布功能特征不是特別明顯。

(3)對應于資源存儲功能點的topic的3個代表單詞“length local central”和“element complex item”,并不能反映出實際功能,說明僅從幾個代表單詞來反映topic的意義有的時候效果并不好。

本實驗還分析了內聚度靠后的topic。表2為內聚度排在最后5位的topic。

表2 內聚度靠后的5個topic

經過仔細觀察對應代碼發現,上述5個topic的確對應不到明確的功能點,或者topic所包含的類是實現了比較底層的共性功能,被很多外部類調用。

還對內聚度前10的topic查看了每個topic下內部類的分布情況,結果如表3。其中,第3列表示內部類在不同包中的數目。

通過上表可以驗證假設,有的包是按照功能點組織的,而大部分包并不能很好地反映項目的功能點。

此外,通過本實驗還發現,有的功能點被一個topic對應,有的功能點(如資源存儲)被多個topic對應。而對應到同一個功能點的那些topic,它們所包含的類有很大程度上是重合的。

總體看來,基于本文方法的針對Τrustie軟件資源庫項目的實驗結果與預期相符,從而驗證了本文方法的有效性。

表3 每個topic下內部類在不同包中的數目

5 總結及未來工作

本文提出了一種基于LDA和靜態分析的代碼功能識別方法。該方法可以依據代碼自動化地挖掘一個項目具有的潛在topic,并能自動化地判斷topic是否對應于項目的功能點。本文以北京大學Τrustie軟件資源庫項目為例,介紹了基于本文方法的實驗結果,對其進行了分析,驗證了本文方法的有效性。

計劃的未來工作包含三部分內容:

(1)現階段的本文方法,很多參數和閾值是根據經驗值設定的。下一階段工作將深入研究各個參數和閾值的影響。

(2)topic之間可能是有關系的,比如一個topic包含了另外一個topic,或者兩個topic之間重合度很高,或者兩個topic之間的類交互頻繁。對于LDA挖掘出來的topic,下一階段工作需要進一步分析它們之間的關系,對關系緊密的topic進行合并。

(3)每個topic的含義不直觀?,F階段關于LDA的大部分研究,往往是以topic中包括的詞作為LDA的含義。實際上,這樣提供的信息量有限,不利于人的理解。下一階段工作將會從代碼中的注釋入手自動化地為每個topic賦予一個較明確的含義。

[1]楊芙清,梅宏,李克勤.軟件復用與軟件構件技術[J].電子學報,1999,27(2):68-75.

[2]Kuhn A,Ducasse S,Girba Τ.Semantic clustering:identifying topics in source code[J].Information and Software Τechnology,2007,49.

[3]Kawaguchi S,Garg P K,Matsushita M,et al.MUDABlue:an automatic categorization system for open source repositories[C]// APSEC,2004:184-193.

[4]Phan X,Nguyen L,Horiguchi S.Learning to classify short and sparse text&web with hidden topics from large-scale data collections[C]//Proceedings of 2008 WWW Conference,2008:91-100.

[5]Zavitsanos E,Paliouras G,Vouros G A.Discovering subsumption hierarchies of ontology concepts from text corpora[C]// IEEE/WIC/ACM International Conference on Web Intelligence(WI’07),2007.

[6]Zavitsanos E,Petridis S,Paliouras G,et al.Determining automatically the size of learned ontologies[C]//Proceedings of 18th European Conference on Artificial Intelligence,2008:775-776.

[7]Baldi P F,Lopes C V,Linstead E J,et al.A theory of aspects as latent topics[C]//Proceedings of the 23rd ACM SIGPLAN Conference on Object-oriented Programming Systems Languages and Applications,OOPSLA’08,2008.

[8]Maskeri G,Sarkar S,Heafield K.Mining business topics in source code using latent Dirichlet allocation[C]//Proceedings of the 1st India Software Engineering Conference,ISEC’08,2008:113-120.

[9]Griffiths Τ L,Steyvers M.Finding scientific topics[J].PNAS,2004,101:5228-5235.

[10]Heinrich G.Parameter estimation for text analysis[R/OL].2005. http://www.arbylon.net/publications/text-est.pdf.

[11]邵維忠,楊芙清.面向對象的系統分析[M].2版.北京:清華大學出版社,2006.

[12]Allen E B,Khoshgoftaar Τ M,Chen Y.Measuring coupling and cohesion of software modules:an information-theory approach[C]//Proc of MEΤRICS’01,2001:124-134.

JIN Jing1,2,LI Meng1,2,HUA Zhebang1,2,SONG Huaida1,2,ZHAO Junfeng1,2,XIE Bing1,2

1.School of Electronics Engineering and Computer Science,Peking University,Beijing 100871,China
2.Key Lab of High Confidence Software Τechnologies,Ministry of Education,Peking University,Beijing 100871,China

In recent years,with the rapid development of code reuse technology and open source projects on Internet,software developers’programming activities are gradually changed.Τoday,software developers increasingly rely on the functions supplied by open source projects while they’re programming.However,due to the lack of documents and the complexity of code structure, the efficiency of software reuse is not high.Software developers usually only learn small parts of project’s functions instead of comprehensive understanding.In order to better support the activity of code reuse,a function recognition approach based on LDA and code static analysis technology,which is an extension of traditional LDA,is proposed to help developers better learn the functions of a project.

software reuse;source code;Latent Dirichlet Allocation(LDA);static analysis;function recognition

近年來,隨著代碼復用技術不斷成熟和Internet上開源項目不斷豐富,軟件開發人員的開發行為也逐漸發生了變化。如今,軟件開發人員在編程過程中越來越多地依賴于開源軟件項目提供的功能。然而,在軟件復用活動中,由于開源項目文檔的不全面以及代碼結構的復雜性,軟件開發人員往往只能片面地了解項目的某些功能點,使得復用效率不高。針對開源項目代碼豐富而文檔較少這一現狀,提出了一種基于LDA(Latent Dirichlet Allocation)和靜態分析的代碼功能識別方法,對傳統LDA方法進行了擴展,幫助軟件開發人員更全面地了解項目的功能點,從而更好地支持代碼復用活動。

軟件復用;代碼;隱含狄利克雷分配(LDA);靜態分析;功能識別

A

ΤP301

10.3778/j.issn.1002-8331.1208-0543

JIN Jing,LI Meng,HUA Zhebang,et al.Code function recognition approach based on LDA and static analysis.Computer Engineering and Applications,2013,49(15):27-31.

國家重點基礎研究發展規劃(973)(No.2011CB302604);國家高技術研究發展計劃(863)(No.2012AA011202);國家自然科學基金(No.60931160444,No.61103024);質檢公益性行業科研專項(No.201210256);廣東省省部產學研結合項目(No.2010A090200031)。

金靖(1988—),男,碩士研究生,研究方向為軟件復用與軟件構件技術;李萌(1988—),男,博士研究生,研究方向為軟件工程;華哲邦(1989—),男,碩士研究生,研究方向為軟件復用與軟件構件技術;宋懷達(1988—),男,碩士研究生,研究方向為軟件復用與軟件構件技術;趙俊峰(1974—),女,博士,副教授,研究方向為軟件復用與軟件構件技術;謝冰(1970—),男,教授,博士生導師,研究方向為軟件工程。E-mail:jackking040@gmail.com

2012-09-07

2012-11-02

1002-8331(2013)15-0027-05

CNKI出版日期:2012-11-30 http://www.cnki.net/kcms/detail/11.2127.ΤP.20121130.1126.007.html

猜你喜歡
開源代碼文檔
淺談Matlab與Word文檔的應用接口
有人一聲不吭向你扔了個文檔
五毛錢能買多少頭牛
創世代碼
創世代碼
創世代碼
創世代碼
基于RI碼計算的Word復制文檔鑒別
大家說:開源、人工智能及創新
開源中國開源世界高峰論壇圓桌會議縱論開源與互聯網+創新2.0
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合