国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于對比學(xué)習(xí)的跨語言代碼克隆檢測方法

2024-08-17 00:00呂泉潤謝春麗萬澤軒魏家勁
計算機(jī)應(yīng)用研究 2024年7期

摘 要:代碼克隆檢測是提高軟件開發(fā)效率、軟件質(zhì)量和可靠性的重要手段。基于抽象語法樹(abstract syntax tree,AST)的單語言克隆檢測已經(jīng)取得了較為顯著的效果,但跨語言代碼的AST節(jié)點存在同義詞、近義詞且手工標(biāo)注數(shù)據(jù)集成本高等問題,限制了現(xiàn)有克隆檢測方法的有效性和實用性。針對上述問題,提出一種基于對比學(xué)習(xí)的樹卷積神經(jīng)網(wǎng)絡(luò)(contrastive tree convolutional neural network,CTCNN)的跨語言代碼克隆檢測方法。該方法首先將不同編程語言的代碼解析為AST,并對AST的節(jié)點類型和節(jié)點值作同義詞轉(zhuǎn)換處理,以降低不同編程語言AST之間的差異;同時,采用對比學(xué)習(xí)擴(kuò)充負(fù)樣本并對模型進(jìn)行訓(xùn)練,使得在小樣本數(shù)據(jù)集下能夠最小化克隆對之間的距離,最大化非克隆對之間的距離。最后在公開數(shù)據(jù)集上進(jìn)行了評測,精確度達(dá)到95.26%、召回率為99.98%、F1為97.56%。結(jié)果表明,相較于現(xiàn)有的最好的CLCDSA和C4方法,該模型的檢測精度分別提高了43.92%和3.73%,其F1值分別提升了29.84%和6.29%,證明了所提模型是一種有效的跨語言代碼克隆檢測方法。

關(guān)鍵詞:跨語言;代碼克??;對比學(xué)習(xí);抽象語法樹

中圖分類號:TP311 文獻(xiàn)標(biāo)志碼:A 文章編號:1001-3695(2024)07-031-2147-06

doi: 10.19734/j.issn.1001-3695.2023.11.0534

Contrastive learning based cross-language code clone detection

Abstract: Code clone detection is an important technology to improve software development efficiency, quality, and reliability. Single-language clone detection based on AST has achieved significant performance. However, the existence of synonyms and near-synonyms in AST nodes of cross-language codes and the high cost of manual labeling limit the effectiveness and usefulness of existing clone detection methods. To address these issues, this paper proposed a cross-language code clone detection method based on contrastive tree convolutional neural network(CTCNN). Firstly, it parsed the codes of different programming languages into ASTs, and processed the node types and values of ASTs by synonym conversion to reduce the differences between ASTs in different programming languages. At the same time, it employed contrastive learning to augment negative samples and train the model, so that this approach ensured the minimization of distances between clone pairs and the maximization of distances between non-clone pairs in small sample datasets. Finally, it evaluated the proposed method on a public dataset with precision, recall, and F1-scores of 95.6%, 99.98%, and 97.56%. The results show that compared to the best existing methods CLCDSA and C4, the proposed model improves the detection accuracy by 43.92% and 3.73%, and increases the F1-score by 29.84% and 6.29%, which confirms that the proposed model is an effective cross-language code clone detection method.

Key words:cross-language; code clone; contrastive learning; abstract syntax tree

0 引言

在軟件開發(fā)過程中,開發(fā)人員在開發(fā)功能類似的應(yīng)用程序時,往往會復(fù)用已經(jīng)成功上線的其他語言版本的軟件代碼或發(fā)布在開源社區(qū)平臺上面的代碼,因此,不同語言之間的代碼克隆是一個普遍存在的問題。研究表明,在軟件系統(tǒng)中,存在7%~23%的克隆代碼[1]。代碼克隆雖然可以提高編程效率,但對軟件維護(hù)、軟件質(zhì)量也存在一定的負(fù)面影響[2]。例如,源代碼中的重復(fù)代碼塊增加了程序的復(fù)雜性,從而導(dǎo)致軟件維護(hù)更加困難[3]。對代碼片段的更改也需要在其他所有克隆塊上同步修改,如果更改不一致,則將導(dǎo)致錯誤傳播,給軟件的可維護(hù)性和可靠性帶來了新的挑戰(zhàn)。因此,跨語言代碼克隆是軟件開發(fā)和維護(hù)中亟待解決的問題。

不同于單語言克隆檢測,各編程語言的詞法、語法的差異增加了跨語言代碼克隆檢測的難度。目前已有的跨語言代碼克隆檢測方法主要包括C4(contrastive cross-language code clone detection) [4]、LICCA[5]、CLCDSA[6]、樹自動編碼器(tree autoencoder,TAE)[7]等。C4模型將源代碼的token轉(zhuǎn)換為向量,通過比較向量相似度進(jìn)行克隆代碼檢測,該方法可以有效地檢測出跨語言的克隆代碼,但這些token僅包含代碼的詞法信息,缺乏代碼的語法和語義信息。LICCA利用SSQSA[8]平臺將不同的編程語言轉(zhuǎn)換為通用的中間表示,它雖然可以在一定程度上實現(xiàn)編程語言的統(tǒng)一,但該模型要求源代碼長度相等并且兩個代碼塊的代碼步驟和功能流程需要相同,這些限制使得該模型不適用于現(xiàn)實世界中的場景。TAE使用無監(jiān)督學(xué)習(xí)的方式對大規(guī)模數(shù)據(jù)集的AST進(jìn)行預(yù)訓(xùn)練以解決數(shù)據(jù)集瓶頸問題,并取得了較好的結(jié)果,但該方法未考慮到不同編程語言詞法的影響。

現(xiàn)有基于AST的方法雖然在單語言代碼克隆檢測有較好的表現(xiàn),但在處理跨語言的代碼克隆時性能有限,主要原因在于不同編程語言的AST表示存在差異,基于AST的方法通常依賴于特定語言的AST結(jié)構(gòu)進(jìn)行代碼克隆檢測,每種編程語言都有其獨特的語法規(guī)則和結(jié)構(gòu),因此對應(yīng)的AST表示也會有所不同。

為解決上述問題,本文提出了一種基于對比學(xué)習(xí)[9]的樹卷積神經(jīng)網(wǎng)絡(luò)[10]方法進(jìn)行跨語言代碼克隆檢測,該方法通過構(gòu)建同義詞轉(zhuǎn)換表的方法對不同編程語言的AST進(jìn)行同義詞轉(zhuǎn)換處理,并采用對比學(xué)習(xí)的方法進(jìn)行跨語言代碼克隆檢測。該方法可以減輕人工標(biāo)注的工作,提高模型的抗干擾能力,為提高軟件開發(fā)效率、降低軟件維護(hù)成本提供技術(shù)支撐。

本文的主要貢獻(xiàn)有:

a)提出一種新的跨語言代碼克隆檢測方法CTCNN,該方法通過樹型卷積提取AST中的語法和節(jié)點屬性信息,并利用字典方法解決不同語言之間的同義詞轉(zhuǎn)換問題,提高模型的語義表征能力。

b)提出對比學(xué)習(xí)方法來學(xué)習(xí)跨語言的相似性樣本和不相似性樣本,利用自監(jiān)督學(xué)習(xí)方法解決跨語言數(shù)據(jù)集標(biāo)注缺失問題。

1 相關(guān)工作

1.1 跨語言代碼克隆檢測

深度學(xué)習(xí)模型能夠挖掘出大量數(shù)據(jù)中的隱藏模式,獲得有效的特征表示?;谏疃葘W(xué)習(xí)的跨語言代碼克隆檢測被分為基于詞法(token)、基于語法樹(AST)和基于圖(graph)的代碼克隆檢測。

a)基于token的方法。該方法利用詞法分析器把不同語言的代碼轉(zhuǎn)換為token序列,通過比較代碼序列來檢測克隆代碼[11]。 Tao等人[4]提出的C4是一種跨語言克隆檢測模型,該模型采用了對比學(xué)習(xí)的思想,使用token作為輸入,采用CodeBERT[12]來提取代碼中的特征,并將其轉(zhuǎn)換為向量表示,通過比較向量之間的相似度來檢測克隆代碼,如果兩個向量之間的相似度超過了一定的閾值,就認(rèn)為它們是克隆代碼。

b)基于AST的方法。該方法將不同語言的代碼轉(zhuǎn)換為語法樹,通過比較語法樹來檢測克隆代碼。Vislavski等人[5]提出的LICCA是一種開源的跨語言代碼克隆檢測工具,LICCA依賴于軟件質(zhì)量靜態(tài)分析器(SSQSA)平臺[8]的高級代碼表示,提取AST的語法和語義特征,LICCA使用了一個中間程序表示法,它可以實現(xiàn)語義上等價的語言結(jié)構(gòu)的統(tǒng)一,并通過跨語言使用不同的語法來實現(xiàn)。Ling等人[7]提出了一種基于樹自動編碼器(TAE)預(yù)訓(xùn)練的跨語言代碼克隆檢測模型,其思想是利用TAE預(yù)訓(xùn)練來提高表示學(xué)習(xí)的質(zhì)量,通過在預(yù)訓(xùn)練模型的基礎(chǔ)上進(jìn)行微調(diào)來實現(xiàn)跨語言代碼克隆檢測。Perez等人[13]提出了一種基于AST的跨語言代碼克隆檢測模型,該模型使用graph2vec[14]方法對AST進(jìn)行嵌入學(xué)習(xí),將AST映射到統(tǒng)一的低維向量空間中,通過計算不同代碼段之間的相似度來判斷是否為克隆代碼。Yang等人[15]提出的ASTERIA是一種基于AST的深度學(xué)習(xí)方法,該方法利用Tree-LSTM[16]網(wǎng)絡(luò)從其AST中學(xué)習(xí)函數(shù)的語義表示,通過測量兩個表示向量之間的相似度進(jìn)行相似度檢測。

c)基于圖的方法。Zhang等人[17]提出了一種基于代碼流程圖的跨語言代碼相似度檢測(CLCSD)方法,該方法將特定編程語言編寫的源代碼轉(zhuǎn)換為標(biāo)準(zhǔn)化代碼流程圖(standardized code flow chart,SCFC),將不同編程語言編寫的兩個源代碼片段轉(zhuǎn)換為SCFC,并利用所提出的SCFC-SPGK算法測量其對應(yīng)的SCFC來獲得它們的相似性。

除了以上的跨語言代碼克隆檢測方法,還有一些別的方法技術(shù),如Cheng等人[18]提出的CLCMiner通過計算不同編程語言中不同片段之間的相似性,并選擇每個差異中最相似的片段作為一對匹配的差異,根據(jù)不同的相似性對匹配的差異對進(jìn)行排序和克隆檢測,但CLCMiner從修訂歷史中挖掘克隆,從而限制了其應(yīng)用。Nafi等人[19]提出了一種基于深度學(xué)習(xí)的向量學(xué)習(xí)方法來識別語義關(guān)系,使用應(yīng)用程序編程接口(API)文檔來查找不同語言使用的API調(diào)用之間的關(guān)系,但這種方法的克隆檢測效果取決于API文檔的質(zhì)量。為了支持大規(guī)模的克隆檢測,Nafi等人[6]提出一種用于跨語言代碼克隆檢測的模型CLCDSA,該模型使用了一個基于跨語言API的過濾器來丟棄非潛在的克隆,使用語義分析實現(xiàn)跨語言代碼檢測。Bui等人[20]提出一種基于暹羅神經(jīng)網(wǎng)絡(luò)[21]的神經(jīng)網(wǎng)絡(luò)框架(Bi-NN),通過長短期記憶(LSTM)[22]和門控圖神經(jīng)網(wǎng)絡(luò)(GGNN)[23]等模型來實例化雙邊代碼表示框架,以表示語法、語義和算法分類。

1.2 對比學(xué)習(xí)

對比學(xué)習(xí)是一種自監(jiān)督學(xué)習(xí)方法,通過最小化相似數(shù)據(jù)表示之間的距離,并最大限度地提高不同數(shù)據(jù)之間的距離,以提高模型的泛化能力。與樣本總和的損失函數(shù)不同,對比學(xué)習(xí)的損失函數(shù)通過成對的例子運(yùn)行。在實際應(yīng)用中,對比損失函數(shù)通常需要結(jié)合具體的模型和任務(wù)來進(jìn)行設(shè)計和優(yōu)化。Yahya等人[24]提出使用InferCode的暹羅架構(gòu)從AST獲得的源代碼嵌入中學(xué)習(xí)更抽象的嵌入,將AST循環(huán)到將整個子樹嵌入到一個描述整個代碼片段的向量中,這樣就可以更容易地將給定的代碼與不同語言中的其他源代碼片段進(jìn)行比較。

2 方法設(shè)計

2.1 方法整體結(jié)構(gòu)

本文提出的基于CTCNN的跨語言代碼克隆檢測方法,如圖1所示。該方法主要包括三個部分:

a)數(shù)據(jù)預(yù)處理:去除與源碼無關(guān)的信息,利用語法解析工具將代碼解析為AST,并對AST的節(jié)點進(jìn)行上下文信息擴(kuò)展。

b)同義詞轉(zhuǎn)換處理:對不同編程語言的AST進(jìn)行同義詞轉(zhuǎn)換處理,以實現(xiàn)跨語言AST的統(tǒng)一表示。

c)代碼克隆檢測模型:以 AST作為輸入,送入基于對比學(xué)習(xí)的TBCNN模型中得到代碼的向量表示,使用對比學(xué)習(xí)提高模型的泛化能力。通過比較代碼表征的余弦相似度,判斷是否為跨語言代碼克隆對。

2.2 數(shù)據(jù)預(yù)處理

數(shù)據(jù)預(yù)處理是對源代碼進(jìn)行解析和增強(qiáng)處理,以獲取源碼的語義信息,主要包括以下三個步驟:a)去除源碼中多余的換行符、注釋等無關(guān)信息;b)將源碼解析為AST;c)擴(kuò)展AST節(jié)點信息,通過對AST自頂向下的遍歷,將子節(jié)點信息添加到父節(jié)點中,以獲取AST的上下文信息。算法1描述了將源碼解析為帶有上下文信息的AST的過程,該算法將AST的節(jié)點n由n=〈Nt,Nv〉擴(kuò)充為ne=〈Nt,Nv,Nct,Ncv〉的形式,其中Nt、Nv、Nct、Ncv分別表示AST節(jié)點的節(jié)點類型、節(jié)點值、子節(jié)點類型列表和子節(jié)點值列表。算法1中:步驟a)b)加載指定語言的解析器,將源代碼解析為 AST;步驟c)~g)定義一個遞歸函數(shù),采用自頂向下的遍歷方式對 AST 中每個節(jié)點進(jìn)行訪問,獲取其節(jié)點類型、節(jié)點值和子節(jié)點列表,并構(gòu)造一個節(jié)點信息元組;最終,步驟h)i)從根節(jié)點開始將整個 AST 表示為一棵樹型結(jié)構(gòu)并返回AST。

算法1 將源碼解析為帶有上下文信息的AST

2.3 基于字典的同義詞轉(zhuǎn)換

如圖2所示,各編程語言的AST節(jié)點存在一定差異,例如Java語言中的根節(jié)點稱為“program”,而C語言中的節(jié)點則稱為“translation_unit”。雖然這兩種術(shù)語在詞匯上有所不同,但實際上它們代表的是相同的語義,即編碼單元。

采用基于字典的同義詞轉(zhuǎn)換可用于解決不同編程語言AST之間節(jié)點值和節(jié)點類型同義詞的問題。具體過程如下:首先,對生成的AST進(jìn)行遍歷,得到所有節(jié)點類型和節(jié)點值;然后,將語義相同但詞匯不同的節(jié)點類型或節(jié)點值采用統(tǒng)一的詞匯表示;最終,以字典的形式生成同義詞轉(zhuǎn)換表。通過同義詞轉(zhuǎn)換表,將具有編程語言特性的關(guān)鍵詞、特殊符號的節(jié)點值或節(jié)點類型替換成統(tǒng)一的詞匯,可以進(jìn)一步降低不同編程語言AST的差異性,以統(tǒng)一不同編程語言AST的語義。

例如,使用“unit”統(tǒng)一替換不同編程語言中的“program”“translation_unit”等詞匯,從而減少不同編程語言AST之間的差異。這樣做可以讓不同編程語言的AST在語義上更加一致,進(jìn)而提高程序分析的精度和效率。

2.4 代碼克隆檢測模型

跨語言的代碼克隆檢測主要分為四層,分別為嵌入層、卷積層、池化層和對比層。

2.4.1 嵌入層

首先,對數(shù)據(jù)集中的所有AST進(jìn)行遍歷,得到AST節(jié)點類型和節(jié)點值的詞匯表,在生成AST的過程中,抽象化了函數(shù)命名、用戶自定義標(biāo)識符等,提高了模型的泛化能力;此外,添加‘unk’標(biāo)識符來表示數(shù)據(jù)集中未出現(xiàn)的詞匯。算法2描述了生成AST節(jié)點類型和節(jié)點值詞匯表的過程,其中vocab_node_type為AST節(jié)點類型的詞匯表,vocab_node_token為AST節(jié)點值的詞匯表。步驟a)b)初始化兩個帶有‘unk’字符的列表,表示如果AST中存在未知的token,則將其標(biāo)記為‘unk’。步驟c)~g)對AST進(jìn)行遍歷,依次執(zhí)行以下操作:如果該節(jié)點的token不在vocab_node_token中,則將其添加到vocab_node_token列表中;如果該節(jié)點的type不在vocab_node_type中,則將其添加到vocab_node_type列表中。步驟h)輸出所生成的詞匯表。得到詞匯表后,將帶有子節(jié)點信息的AST送到單層全連接網(wǎng)絡(luò)中得到AST的向量表示,并將其作為卷積層的輸入。

算法2 詞匯表的生成

2.4.2 卷積層

得到AST的嵌入后,使用一組固定深度的樹卷積核Wk∈Euclid ExtraaBpd×h在整個樹上滑動,對樹進(jìn)行卷積操作,其中h為特征檢測器的數(shù)量,d為向量的維度,將相鄰節(jié)點的信息通過一組卷積核匯聚到了當(dāng)前節(jié)點上,并得到了當(dāng)前節(jié)點的特征向量y。

為了增加模型的泛化能力和防止過擬合,在卷積層后添加一個dropout層,這樣訓(xùn)練時會隨機(jī)關(guān)閉一定比例的神經(jīng)元,從而使得模型更具泛化能力。

2.4.3 池化層

對AST卷積后,對向量的每個維度應(yīng)用最大池化,得到整個AST的匯總向量u后,將其送到全連接層中以得到向量表示。最終向量可以表示為

S=σ(Wu+b)(2)

其中:σ(·)為激活函數(shù);Wu為權(quán)重矩陣;b為偏置矩陣。同樣采用LeakyReLU作為激活函數(shù)。

2.4.4 對比層

對比學(xué)習(xí)著重于學(xué)習(xí)同類實例之間的共同特征,以區(qū)分非同類實例之間的不同之處。通過縮小與正樣本間的距離,擴(kuò)大與負(fù)樣本間的距離,使正樣本與錨點的距離遠(yuǎn)遠(yuǎn)小于負(fù)樣本與錨點的距離,如式(3)所示。

s(f(x),f(x+))>>s(f(x),f(x-))(3)

其中:s(·)為計算樣本間距離的函數(shù); f(·)為編碼器; x為錨定樣本,x+為正樣本,x-為負(fù)樣本。

CTCNN模型使用N元組損失(N-pair loss)作為損失函數(shù),并設(shè)置一個超參數(shù)τ來調(diào)整對負(fù)樣本的懲罰。如圖1右上角所示,綠色的代表錨定樣本,藍(lán)色的代表正樣本,黃色的代表負(fù)樣本(參見電子版)。計算得出該批次向量表示后,利用對比學(xué)習(xí)的N-pair損失函數(shù)最小化正樣本之間的距離,并將負(fù)樣本之間的距離最大化,最后進(jìn)行模型訓(xùn)練和優(yōu)化,對不同的代碼通過計算向量之間的相似值作為是否克隆對的標(biāo)準(zhǔn)。損失函數(shù)如式(4)所示。

其中:N代表的是一個batch的樣本數(shù);sim(·)為相似度計算函數(shù);τ為溫度系數(shù)。在構(gòu)建數(shù)據(jù)集的時候已經(jīng)生成了正樣本,因此需要設(shè)計負(fù)樣本來對模型進(jìn)行訓(xùn)練。對于每個批次,都有n對克隆對(正樣本)。以第一個正樣本為例,其余該批次中與正樣本任務(wù)不一致的克隆對都是第一個樣本的負(fù)樣本,依此類推,構(gòu)建出所有樣本的負(fù)樣本。在構(gòu)造正例和負(fù)例后,通過上述損失函數(shù)得到這一批次的損失值并通過RAdam[25](rectified Adam)進(jìn)行優(yōu)化。RAdam是一種基于梯度的優(yōu)化算法,通過采用預(yù)熱啟發(fā)式算法,提高了自適應(yīng)學(xué)習(xí)率算法訓(xùn)練的穩(wěn)定性、收斂速度和泛化能力。它是Adam[26](adaptive moment estimation)優(yōu)化算法的改進(jìn)版本。

3 實驗分析

本章介紹了實驗數(shù)據(jù)集、實驗設(shè)置與基準(zhǔn)模型,為探究CTCNN模型的有效性,提出以下7個問題進(jìn)行探究:

a)RQ1: CTCNN在跨語言代碼克隆檢測中表現(xiàn)如何?

b)RQ2:CTCNN在不同類型的跨語言代碼克隆檢測效果如何?

c)RQ3:同義詞轉(zhuǎn)換后CTCNN的跨語言克隆檢測效果如何?

d)RQ4:對比學(xué)習(xí)對CTCNN的影響如何?

e)RQ5:小樣本下CTCNN性能如何?

f)RQ6: CTCNN在卷積層數(shù)不同的情況下表現(xiàn)如何?

g)RQ7: CTCNN的時間性能如何?

3.1 數(shù)據(jù)集介紹

在評估方法的有效性時,使用C4[5]的數(shù)據(jù)集作為實驗的數(shù)據(jù)集,按照8∶1∶1的比例劃分為訓(xùn)練集、測試集和驗證集進(jìn)行交叉驗證,該數(shù)據(jù)集從谷歌的CodeJam(https://www.go-hero.net/jam/10/languages/0)和AtCoder(https://atcoder.jp/)編程競賽網(wǎng)站中獲取源碼,將同一問題的不同源碼解決方案作為克隆對構(gòu)成正樣本,Java、Python、C、C++作為跨語言克隆對,得到45 535個樣本對。

3.2 評價指標(biāo)

本文采用精確率P(precision)、召回率R(recall)和F1(F1 score)三個指標(biāo)來評估跨語言克隆檢測模型的性能。精確率P是指預(yù)測為正例的樣本中,真正為正例的比例;召回率R是指實際為正例的樣本中,被正確預(yù)測為正例的比例;F1值綜合考慮了精確率和召回率,因此F1值通常被用來綜合評估模型的性能, F1值越高,說明模型的性能越好。

其中:TP指實際為正例的樣本中被正確預(yù)測為正例的數(shù)量;FP指實際為負(fù)例的樣本中被錯誤預(yù)測為正例的數(shù)量;FN是指實際為正例的樣本中被錯誤預(yù)測為負(fù)例的數(shù)量。

3.3 實驗設(shè)置與基準(zhǔn)模型

實驗采用Tree-sitter(http://tree-sitter.github.io/tree-sitter/)工具對源碼進(jìn)行解析并生成AST。Tree-sitter是一種語法解析工具,它使用先進(jìn)的解析算法和生成的語法樹分析各種編程語言,并為它們提供語法結(jié)構(gòu)。為了驗證本文CTCNN方法的有效性,與CLCDSA和C4跨語言代碼克隆檢測方法進(jìn)行了比較。CLCDSA通過度量兩個矩陣之間的余弦相似性來檢測跨語言的克隆代碼,該矩陣是從源碼中提取9個特征的值而產(chǎn)生的。C4利用CodeBERT模型將不同語言中的程序轉(zhuǎn)換為高維向量表示,CodeBERT作為一種預(yù)訓(xùn)練模型,可以獲取代碼的上下文信息;此外,C4還通過一個能夠有效識別克隆對和非克隆對的約束性學(xué)習(xí)目標(biāo)來進(jìn)行微調(diào)。

對于CTCNN,設(shè)置在NVIDIA A5000設(shè)備上進(jìn)行訓(xùn)練,epoch設(shè)置為3,batch size設(shè)置為8,學(xué)習(xí)率為0.001。對于C4模型,采用相同的數(shù)據(jù)集進(jìn)行訓(xùn)練,并遵照原文獻(xiàn)實驗設(shè)置進(jìn)行實驗。由于CLCDSA針對的是Java、Python和C#進(jìn)行的跨語言代碼克隆檢測,所以從數(shù)據(jù)集中抽取包含Java和Python的克隆對,共有12 846對樣本,按照8∶1∶1的比例劃分訓(xùn)練集、測試集和驗證集進(jìn)行交叉驗證,正樣本和負(fù)樣本的比例約為50%,同樣遵照原文獻(xiàn)實驗設(shè)置進(jìn)行實驗。

3.4 實驗結(jié)果與分析

3.4.1 RQ1: CTCNN模型的性能

為了測試CTCNN模型在跨語言代碼克隆檢測任務(wù)的效果,本文通過與目前表現(xiàn)最好的模型進(jìn)行比較,表1和2顯示了本文模型與CLCDSA、C4模型的精確度、召回率和F1值。C4模型對每個代碼片段使用CodeBERT來提取代碼中的特征,CodeBERT作為一種預(yù)訓(xùn)練模型,可以獲取代碼的上下文信息,因此可以獲得較好的表現(xiàn)。與C4相比,CTCNN具有更高的F1、召回率和精確率, CTCNN的F1值提高了6.29%,召回率提高了8.97%,精準(zhǔn)率提高了3.73%;與CLCDSA相比,CTCNN同樣具有較好的表現(xiàn), CTCNN的F1值提高了29.84%,召回率提高了3.84%, 精準(zhǔn)率提高了43.92%。這表明CTCNN可以更好地學(xué)習(xí)代碼的語義信息。CTCNN還可以通過改進(jìn)不同編程語言AST的差異性和損失函數(shù)等來訓(xùn)練跨語言代碼克隆檢測,將在未來探索這項工作。

3.4.2 RQ2: CTCNN在不同跨語言類型的克隆檢測效果

為了測試本文方法在不同類型的跨語言代碼克隆的檢測效果,分別對不同跨語言代碼類型進(jìn)行實驗,實驗結(jié)果如表3所示。從表中可以看出,Python和Java這兩種語言的跨語言代碼克隆檢測得到了最高的 F1 值,為 98.25%,這意味著相對于其他組合,該模型在識別Python和Java代碼時更加準(zhǔn)確且具有更好的綜合效果。而當(dāng)檢測C和Python語言時,該模型的精準(zhǔn)率稍低,F(xiàn)1值為94.40%。

進(jìn)一步分析可發(fā)現(xiàn),C和Java的組合雖然召回率很高,但精確度較低。Python和C的組合精確度比較高,但是召回率較低,這可能是因為 Python和C在語法上有很大的差異,所以將它們結(jié)合起來進(jìn)行檢測會導(dǎo)致一些漏檢情況的發(fā)生。而Python和Java的組合具有最高的精確度,達(dá)到了97.23%,這說明兩種語言之間的區(qū)別更加明顯,因此檢測效果更好。

3.4.3 RQ3:同義詞轉(zhuǎn)換的消融實驗

為了驗證AST同義詞轉(zhuǎn)換后的效果,進(jìn)行了一個消融實驗來探討同義詞轉(zhuǎn)換后的AST對模型性能的影響。本實驗數(shù)據(jù)集共有91 070個AST,其中包含294 233 588個token,通過對AST進(jìn)行同義詞轉(zhuǎn)換,共修改了1 043 725個token,占總數(shù)的0.35%。

由表4可以看出,在同義詞轉(zhuǎn)換后,CTCNN的精準(zhǔn)率提升了0.33%,召回率提升了14.8%,F(xiàn)1值提升了7.77%。這主要是因為不同編程語言的AST雖然在語法的差異性較低,但是在AST節(jié)點值上仍具有一定的差異性。所以,通過統(tǒng)一不同編程語言AST的節(jié)點值,降低了代碼解析的差異性,使得模型在語義表征方面有更好的表現(xiàn)。

3.4.4 RQ4: 對比學(xué)習(xí)的消融實驗

為了驗證對比學(xué)習(xí)對CTCNN的影響,通過調(diào)整CTCNN模型,去除CTCNN中對比學(xué)習(xí)的設(shè)置,具體步驟如下:首先,將CTCNN中的損失函數(shù)替換為交叉熵?fù)p失函數(shù);然后,對數(shù)據(jù)集作調(diào)整,將訓(xùn)練集中克隆對和非克隆對的比例設(shè)置為1∶1,驗證集和測試集中克隆對和非克隆對的比例設(shè)置為4∶1。將CTCNN與TCNN設(shè)置在A5000上訓(xùn)練1個epoch,得到的結(jié)果如表5所示??梢钥吹紺TCNN的性能指標(biāo)比TCNN更好,CTCNN 的召回率提升了0.69%,精準(zhǔn)率提升了14.01%,F(xiàn)1值提升了8.22%。這表明對比學(xué)習(xí)有助于CTCNN更好地分類正負(fù)樣本,從而提高模型的性能。因此,對比學(xué)習(xí)在CTCNN中起到了積極的作用。

3.4.5 RQ5: CTCNN在小樣本數(shù)據(jù)的性能

為了測試本文方法在小樣本情況下的優(yōu)勢,實驗按照隨機(jī)抽取樣本的原則,分別取訓(xùn)練集中10%、20%、30%、40%數(shù)據(jù)訓(xùn)練3個epoch,實驗結(jié)果如表6所示。當(dāng)訓(xùn)練樣本為全部的訓(xùn)練集時,F(xiàn)1值最高,為97.56%。從表6可以看到,當(dāng)訓(xùn)練集使用的數(shù)據(jù)比較少的時候,模型的表現(xiàn)不如使用更多的數(shù)據(jù)進(jìn)行訓(xùn)練,但與使用全部訓(xùn)練數(shù)據(jù)集進(jìn)行訓(xùn)練得到的結(jié)果相比,沒有較大的差距。最后值得注意的是,隨著訓(xùn)練樣本的增多,模型在R、P、F1這三個指標(biāo)上的表現(xiàn)也并沒有穩(wěn)定增長。

總之,基于對比學(xué)習(xí)的跨語言代碼克隆檢測在小樣本情況下也可以獲得較好的結(jié)果,但是為了更好地提升模型的性能,本文還需要進(jìn)一步研究如何在有限的數(shù)據(jù)情況下有效地提取和利用關(guān)鍵信息。

3.4.6 RQ6: 卷積層數(shù)對CTCNN的影響

當(dāng)使用樹的卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行代碼的表示學(xué)習(xí)時,卷積層數(shù)的選擇可以影響模型的性能。在AST上執(zhí)行卷積操作是一種有限制的方式,因為AST的結(jié)構(gòu)是有限的,不能像圖像一樣采用更深的網(wǎng)絡(luò)來提取更高層次的特征。 所以,在卷積神經(jīng)網(wǎng)絡(luò)中增加卷積層數(shù)的主要目的是為了通過在多個層級中對語法樹進(jìn)行卷積操作來獲取更豐富的特征。

通常,增加模型的復(fù)雜度可以提高模型在訓(xùn)練集上的性能,但可能會降低在測試集上的性能。因此,需要權(quán)衡模型的復(fù)雜度和性能來確定最佳的卷積層數(shù)。表7顯示了CTCNN分別在卷積層數(shù)為1、2、4層的表現(xiàn)。可以看到卷積層數(shù)對于跨語言代碼克隆檢測效果有著明顯的影響。增加卷積層數(shù)會提高模型的性能。這是因為在深層網(wǎng)絡(luò)中,模型可以學(xué)習(xí)更復(fù)雜的特征表示,從而更好地區(qū)分不同的克隆實例。

3.4.7 RQ7: CTCNN的時間效率

為了測試CTCNN的訓(xùn)練時間性能,將本文方法與其他方法在訓(xùn)練1個epoch的時間開銷進(jìn)行對比。表8展示了本文方法與CLCDSA和C4模型的訓(xùn)練時長,其中:CLCDSA模型的訓(xùn)練時間最短,為8 s,這是由于CLCDSA模型根據(jù)特征工程提取了9個特征,需花費大量的時間對數(shù)據(jù)進(jìn)行預(yù)處理;C4的訓(xùn)練時間約為57 min,這是由于C4使用了大型的預(yù)訓(xùn)練模型CodeBERT; CTCNN的訓(xùn)練時間平均為7 min 35 s,這表明CTCNN在訓(xùn)練時間上仍有一定的優(yōu)勢。

3.5 實例分析

CTCNN模型主要被設(shè)計用于跨語言的代碼克隆檢測中不同編程語言AST差異性較大的問題,通過對AST進(jìn)行同義詞轉(zhuǎn)換,能夠提高不同編程語言AST的統(tǒng)一表示能力,使用對比學(xué)習(xí)可以更好地區(qū)分克隆對與非克隆對,例如,圖2是一對由Java和C語言組成的跨語言克隆代碼,這兩個代碼的AST存在較大的差距,通過同義詞轉(zhuǎn)換后,差異性得到了顯著降低,通過本文模型進(jìn)行檢測,結(jié)果顯示這兩段代碼存在代碼克隆關(guān)系。這進(jìn)一步證明了本文模型的有效性。

3.6 有效性威脅

實驗的訓(xùn)練集在不同類型的跨語言克隆對的數(shù)量不一致,可能會對樣本量較少的跨語言代碼克隆檢測效果不是很友好,如3.3節(jié)RQ2中的C語言和Python語言的跨語言代碼克隆檢測,除了這兩種語言本身差異性較大的原因,還有可能是由于訓(xùn)練樣本量較小或樣本質(zhì)量不好所導(dǎo)致的。為了降低該部分的影響,通過仔細(xì)地對樣本進(jìn)行了分析,盡可能地保證不同編程語言在訓(xùn)練集、測試集和驗證集上的比例保持一致,減少這部分的差距。

4 結(jié)束語

本文提出的CTCNN模型是一種用于檢測跨語言克隆代碼的模型。它通過對抽象語法樹(AST)作出語義統(tǒng)一的處理來降低不同編程語言AST之間的差異性。同時,該模型使用了基于樹的卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)代碼表示,以獲取更加豐富的語義信息。相比傳統(tǒng)的方法,CTCNN模型利用對比學(xué)習(xí)可以訓(xùn)練更準(zhǔn)確的模型,并能夠提高模型的魯棒性。然而,目前的CTCNN模型僅適用于樹結(jié)構(gòu)的代碼表示,并僅對AST的節(jié)點類型和節(jié)點值進(jìn)行了語義統(tǒng)一的處理。在未來的工作中,主要目標(biāo)是如何基于對比學(xué)習(xí),使用圖結(jié)構(gòu)的網(wǎng)絡(luò)模型對源碼進(jìn)行表征。這將使得模型具有更好的可擴(kuò)展性和泛化能力,同時也能更好地應(yīng)對不同編程語言的差異性。此外,還需要對不同編程語言的關(guān)鍵詞、標(biāo)識符、操作符等進(jìn)行語義統(tǒng)一的處理。這可以通過引入預(yù)處理步驟來實現(xiàn),例如使用自然語言處理技術(shù)來提取關(guān)鍵詞的語義信息,并將不同語言的關(guān)鍵詞映射到一個通用的向量空間中,從而降低不同語言之間的差異性。綜上所述,CTCNN模型是一種有前途的方法,可用于跨語言克隆代碼的檢測。未來的工作可以將其擴(kuò)展到圖結(jié)構(gòu)的代碼表示,并對不同編程語言的關(guān)鍵詞、標(biāo)識符、操作符等進(jìn)行語義統(tǒng)一的處理。這將使得該模型更具適應(yīng)性和泛化能力,從而實現(xiàn)更準(zhǔn)確的檢測效果。

參考文獻(xiàn):

[1]Roy C K,Cordy J R,Koschke R. Comparison and evaluation of code clone detection techniques and tools: a qualitative approach[J]. Science of Computer Programming,2009,74(7): 470-495.

[2]Cheng Xiao,Peng Zhiming,Jiang Lingxiao,et al. Mining revision histories to detect cross-language clones without intermediates[C]// Proc of the 31st IEEE/ACM International Conference on Automated Software Engineering. Piscataway,NJ: IEEE Press,2016: 696-701.

[3]Fanta R,Rajlich V.Removing clones from the code[J].Journal of Software Maintenance: Research and Practice,1999,11(4):223-243.

[4]Tao Chenning,Zhan Qi,Hu Xing,et al. C4: contrastive cross-language code clone detection[C]//Proc of the 30th IEEE/ACM International Conference on Program Comprehension. 2022: 413-424.

[5]Vislavski T,Rakic' G,Cardozo N,et al. LICCA: a tool for cross-language clone detection[C]//Proc of the 25th IEEE International Conference on Software Analysis,Evolution and Reengineering.Pisca-taway,NJ:IEEE Press,2018: 512-516.

[6]Nafi K W,Kar T S,Roy B,et al. CLCDSA: cross language code clone detection using syntactical features and API documentation[C]// Proc of the 34th IEEE/ACM International Conference on Automated Software Engineering. Piscataway,NJ:IEEE Press,2019:1026-1037.

[7]Ling Huading,Zhang Aiping,Yin Changchun,et al. Improve representation for cross-language clone detection by pretrain using tree autoencoder[J]. Intelligent Automation & Soft Computing,2022,33(3): 1561-1577.

[8]Rakic' G. Extendable and adaptable framework for input language independent static analysis[D]. Novi Sad: University of Novi Sad,2015.

[9]Bui N D Q,Yu Yijun,Jiang Lingxiao. InferCode: self-supervised learning of code representations by predicting subtrees[C]//Proc of the 43rd IEEE/ACM International Conference on Software Enginee-ring. 2021: 1186-1197.

[10]Mou Lili,Li Ge,Zhang Lu,et al. Convolutional neural networks over tree structures for programming language processing[C]// Proc of the 30th AAAI conference on artificial intelligence. Palo Alto,CA: AAAI Press,2016: 1287-1293.

[11]Kamiya T,Kusumoto S,Inoue K. CCFinder: a multilinguistic token-based code clone detection system for large scale source code[J]. IEEE Trans on Software Engineering,2002,28(7): 654-670.

[12]Feng Zhangyin,Guo Daya,Tang Duyu,et al. CodeBERT: a pre-trained model for programming and natural languages[C]// Proc of Conference on Empirical Methods in Natural Language Processing. Stroudsburg,PA: Association for Computational Linguistics,2020: 1536-1547.

[13]Perez D,Chiba S. Cross-language clone detection by learning over abstract syntax trees[C]//Proc of the 16th IEEE/ACM International Conference on Mining Software Repositories. 2019: 518-528.

[14]Narayanan A,Chandramohan M,Chen Lihui,et al. subgraph2vec: learning distributed representations of rooted sub-graphs from large graphs[EB/OL].(2016). https://arxiv.org/abs/1606.08928.

[15]Yang Shouguo,Cheng Long,Zeng Yicheng,et al. Asteria: deep lear-ning-based AST-encoding for cross-platform binary code similarity detection[C]//Proc of the 51st Annual IEEE/IFIP International Conference on Dependable Systems and Networks. 2021: 224-236.

[16]Shido Y,Kobayashi Y,Yamamoto A,et al. Automatic source code summarization with extended Tree-LSTM[C]//Proc of International Joint Conference on Neural Networks. 2019: 1-8.

[17]Zhang Feng,Li Guofan,Liu Cong,et al. Flowchart-based cross-language source code similarity detection[J]. Scientific Programming,2020,2020: 1-15.

[18]Cheng Xiao,Peng Zhiming,Jiang Lingxiao,et al. CLCMiner: detecting cross-language clones without intermediates[J]. IEICE Trans on Information and Systems,2017,100(2): 273-284.

[19]Nafi K W,Roy B,Roy C K,et al. CroLSim: cross language software similarity detector using API documentation[C]//Proc of the 18th International Working Conference on Source Code Analysis and Manipulation. 2018: 139-148.

[20]Bui N D Q,Yu Yijun,Jiang Lingxiao. Bilateral dependency neural networks for cross-language algorithm classification[C]//Proc of the 26th IEEE International Conference on Software Analysis,Evolution and Reengineering. 2019: 422-433.

[21]Bromley J,Guyon I,LeCun Y,et al. Signature verification using a “siamese” time delay neural network[C]// Advances in Neural Information Processing Systems. 1993: 737-744.

[22]Yu Yong,Si Xiaosheng,Hu Changhua,et al. A review of recurrent neural networks: LSTM cells and network architectures[J]. Neural Computation,2019,31(7): 1235-1270.

[23]Groh F,Ruppert L,Wieschollek P,et al. GGNN: graph-based GPU nearest neighbor search[J]. IEEE Trans on Big Data,2022,9(1): 267-279.

[24]Yahya M A,Kim D K. CLCD-I: cross-language clone detection by using deep learning with InferCode[J]. Computers,2023,12(1):12.

[25]Liu Liyuan,Jiang Haoming,He Pengcheng,et al. On the variance of the adaptive learning rate and beyond[C]//Proc of International Conference on Learning Representations.2020.

[26]Kingma D,Ba J. Adam: a method for stochastic optimization[EB/OL].(2014). https://arxiv.org/abs/1412.6980.